浮生若梦,若梦非梦。
参考:http://cvk.posthaven.com/sql-injection-with-raw-md5-hashes
描述:PHP中md5($str,true)的SQL注入
原题:Lett More CTF 2010
例题:实验吧-后台登录
网页源代码:
1 | <!-- $password=$_POST['password']; |
我们需要提交password来进行注入攻击。关键点在md5($password,true)这里。md5(str)和md5(str,true)有什么不一样呢?
md5(str,raw)
raw默认为FALSE,输出格式为32字符十六进制数。
当raw为TRUE时,输出为原始16字符二进制数。
直接来试一下:
1 |
|
运行结果为:
1 | laurel |
可以看到,当raw为true时,返回的原始二进制格式会被当作字符串处理。
所以我们提交的字符串计算原始md5后,包含SQL注入的特殊字符就行了。
这个大佬在计算了19million的MD5哈希值后,找到了一个answer:
1 | content: 129581926211651571912466741651878684928 |
此外,还有一个answer:
1 | content: ffifdyop |
所以提交这两个str都可以成功getflag。