相关知识点
-
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
绕过该语句,得到页面:
并且在其原始页面代码中存在以下代码:
紧接着我们以GET方式提交a,b,页面跳转到了另一个页面并且提示以POST方式提交另外两个参数,其绕过方式和a,b一样:
POST这两个参数得到flag: