一,类型。
1.弱比较
php中的"=="和"===="在进行比较时,数字和字符串比较或者涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。按照此理,我们可以上传md5编码后是0e的字符串,在比较时php语言会将0e开头的数据认为是科学记数法,而后面的数据会被当做0。
例如:a=xxx&b=xxxx
240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361
2.强比较
php中的''==='在比较时先判断字符串类型是否相同,再比较值。
数组绕过:md5不能加密数组,在加密数组的时候会返回NULL,如果设置没有判断变量类型或内容,就可以使用,因此,强弱比较都是可以使用数组绕过的。
eg:a[]=1&b[]=2
二,示例
[SWPUCTF 2021 新生赛]easy_md5(弱)
1.包含有一个flag.php的文件,然后 get传参name,post传参password,当name和password的值不等,但是他们的md5值相等时,就会输出flag,否则输出wrong
2.数组绕过
3. 0e绕过
[BJDCTF 2020]easy_md5(sql+弱+强)
1.打开环境,提交查询后,在地址栏出现password=输入内容。
2.bp抓包重放后发现hint: select * from 'admin' where password=md5($pass,true)
3.绕过:ffifdyop
4.得到一个新的页面,看源码,get传参a和b的弱比较,数组绕过或0e绕过
数组绕过 ?a[]=1&b[]=2 0e绕过 ?a=xxxx&b=xxxx
5.得到一个新页面,强比较post传参param1和param2。
post传参 数组绕过:param1[]=a¶m2[]=b,得到flag
[SWPUCTF 2022 新生赛]奇妙的MD5(sql+弱+强)
1.开始的绕过——ffifdyop
2.弱比较
3. 强比较:post传参wqh和dsy
[UUCTF 2022 新生赛]funmd5(暂缓)
1.打开环境是一段代码
preg_replace
用于尝试替换掉可能的 "0e" 形式的字符串,但替换后的字符串并未被重新赋值给$md5
。preg_match
用于检查$md5[0]
是否包含 "0e".$sub
的赋值在if(isset($md5))
块之外是无效的.
还有一种.txt文件类型的有待讨论
ffifdyop——详解
select * from `admin` where password=md5($pass,true)
md5在此处是一个函数,语法为md5(string,raw)
string:必需,规定要使用的字符串。raw:可选 默认不写为FALSE。32位16进制的字符串TRUE。16位原始二进制格式的字符串
当raw项为true时,返回的这个原始二进制不是普通的二进制(0,1),而是 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
32位16进制字符串:将MD5加密得到的128 位长度的值以每4位为一组,分为32组,每组以转换为16进制,进行转换得到一个32位的字符串。也就是md5加密。即md5的raw为true时,该函数的输出是原始二进制格式,会被作为字符串处理
构造一个语句使sql语句永恒为真
布尔型判断时,以数字开头的字符串会被当做整型数,要单引号括起来(闭合语句),eg:password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就是password=‘xxx’ or true,当xxx为纯数字时就可以不用引号
目标:要找一个字符串取32位16进制的md5值里带有276f7227这个字段的,加上数字部分
最终:想要得到一个可以绕过md5的值,就要有以下要素
1. 'or' 该符号对应的16进制是 276f7227
2. 在276f7227这个字段后面紧跟一个数字,除了0,就是1-9,对应的asc码值是49-57,转化为16进制就是31-39,最终形式为276f7227+(31-39)
3.最终xxxxxx276f7227+(31-39)这样形式的md5值,但是因为md5的特性,要把这个从md5解密出来需要庞大的计算,因此一般不会去另找。