相关知识点
-
md5(string, raw)
在
php
中md5()
用于计算字符串的 MD5 散列。参数
string
为需要计算的字符串,为必填选项;参数
raw
为规定十六进制或者二进制的输出格式。当raw
为TRUE:输出格式为16字符二进制,当raw
为FALSE:输出格式为32字符十六进制,5.0版本以后为raw
为选填选项,默认为FALSE,因为为TRUE时浏览器解析会出现乱码。 -
在SQL中的绕过
-
select * from 'admin' where password=md5($pass,true)
在该语句中,前端页面要求我们将传入的pass转化为以16字符二进制为格式的
md5
值,如果没有md5
加密的话,我们很容易想到使用' or 'xxxx
来让绕过该SQL语句,由于该地方有加密操作,所以直接使用or
是不行的,我们要用到字符串ffifdyop
,其加密后的二进制格式为'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
这是为数不多的转换为16字符二进制后带or
的,这样就实现了该SQL语句的绕过。详细可以参考:https://blog.csdn.net/March97/article/details/81222922 -
$a != $b && md5($a)==md5($b)
我们分析一下该句话的意思,它要我们传入两个值a,b,且a和b明文不相同但是md5加密后就相同,这里可以使用科学计数法和数组来绕过。
科学计数法。在经过MD5加密后是0exxxxxx形式的字符就被认定为科学计数法,即表示
0×10^xxxxxx
,当然结果还是0,可以被加密为科学计数法的字符串有以下几个:QNKCDZO
、240610708
、s155964671a
、s214587387a
、s214587387a
、s878926199a
。数组。在php中,md5无法数组加密,当遇到数组时会返回NULL,所以我们对两个不同的数组进行md5后的值都为NULL,即相等
-
靶场实操
随便提交数据并且抓包得:
在数据包中发现了该语句:
select * from 'admin' where password=md5($pass,true)
使用ffifdyop
绕过该语句,得到回显代码:
根据回显代码中的提示,发现了页面levels91.php
,我们进行访问得:
且在该页面中的原始代码中发现如下提示:
改代码提示我们需要以GET
形式提交两个参数 a 和 b ,且 a 的值不等于 b 的值,但是 a 的值与 b 的值经过 MD5 加密后一样,在比较的时候用到了==
弱比较方式,则我们可以使用科学技术法或者数组的方式绕过
对于科学技术法,我们常见的 MD5 加密后以 0e 开头的字符串有
QNKCDZO
s878926199a
s155964671a
s1885207154a
s1836677006a
s1184209335a
故我们可以构造Payload
:?a=s878926199a&b=QNKCDZO
;对于数组方式,我们可以构造Payload:
:?a[]=1&b[]=2
得到如下页面:
在改页面中出现了提示页面levell14.php
,访问得:
该代码提示我们以POST
方式提交两个参数param1
和param2
,并且该两个参数值不同,但是加密后的值需要一样,与上一个页面不同的是,该页面在比较的时候使用的是强比较符号,此时我们科学技术法已经不再适用,但是数组的方式仍可以使用,因为不管是 MD5 还是 SHA 加密方式都无法解析数组,返回的都为 NULL,故我们构造Payload
:param1[]=1¶m2[]=2
且以POST
方式提交,得到 flag: