El código mostrado a continuación, es una versión reducida de una falla de seguridad presente en una aplicación algo conocida.
Indiquen la falla, lo que se puede hacer con ésta, una forma de explotarlo y la solución que plantean al mismo:
<?php
include './db.php';
error_reporting(0);
$tb_url = $_POST['url'];
$title = $_POST['title'];
$excerpt = $_POST['excerpt'];
if (empty($title) || empty($tb_url) || empty($excerpt)) {
die ('Invalid values');
}
$title = htmlspecialchars( strip_tags( $title ) );
$title = (strlen($title) > 150) ? substr($title, 0, 150) . '...' : $title;
$excerpt = strip_tags($excerpt);
$excerpt = (strlen($excerpt) > 200) ? substr($excerpt, 0, 200) . '...' : $excerpt;
$contents=@file_get_contents($tb_url);
if(!$contents) {
die('The provided URL does not seem to work.');
}
$query = "INSERT INTO tabla (url, title, excerpt) VALUES ('%s', '%s', '%s')";
$db->query
(
sprintf (
$query,
$db->escape($tb_url),
$db->escape($title),
$db->escape($excerpt)
)
);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Bug</title>
</head>
<body>
<ul>
<?php
include './db.php';
$items = $db->get_results('SELECT url, title, excerpt FROM tabla');
foreach ($items as $tb) :
echo '<li><a href="'.$tb->url.'" title="'.$tb->excerpt.'">'.$tb->title.'</a></li>';
endforeach;
?>
</ul>
</body>
</html>
Para el acceso a datos se usa la clase ez_sql, el método escape en mi versión, contiene lo siguiente:
if (get_magic_quotes_gpc())
$string = stripslashes($string);
return mysql_real_escape_string( $string, $this->dbh );
}