【CTF】PHP弱类型比较与MD5绕过详解

【CTF】PHP弱类型比较与MD5绕过详解

PHP弱类型

概念

PHP在判断是否相等时,有两种比较方式。
1.=== 在进行比较时,会先判断两种字符串类型是否相等,再比较,这种就是强类型
2.== 在进行比较时,会先将字符串类型转化成相同,在进行比较,这种就是弱类型。
弱类型比较 在比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转化成相应数值再比较。

转换规则

字符串的开始部分就决定它转换后的值。如果字符串开头部分以合法数值开始,就使用该数值,反之就是0。 以下是一些例子,帮助理解:

var_dump('admin'==0);	//true
var_dump("1admin"==1);	//true
var_dump("123admin"==123);	//true
var_dump("0e123"=="0e456");	//true
var_dump("123"===123);	//false
var_dump(1+"admin1");	//1
var_dump(1+"1admin");	//2

MD5绕过

弱类型

首先来看这段代码

$str1 = $_GET['str1'];
$str2 = $_GET['str2'];
if (md5($str1) == md5($str2)){
die('OK'); }

php弱类型比较产生的漏洞
想要满足这个判断只需要构造出MD5值为0e开头的字符串,这样的话弱类型比较会认为是科学技术法,0的多少次方都是0,因此可以绕过MD

以下是一些常见的编码后0e开头的字符串:
QNKCDZO (0e830400451993494058024219903391)
aabg7XSs (0e087386482136013740957780965295)
aaabEgHn (0e418636035810609803317995275027)

强类型

同样先来看这段代码

$str1 = $_GET['str1'];
$str2 = $_GET['str2'];
if (md5($str1) === md5($str2)) {
die('OK');
}

发现变成了===,强类型比较
因为是强类型比较,用0e开头的字符串是没办法绕过的了,但是PHP自身的特性使得可以提交一个数组。
而md5函数传入数组的返回值都是NULL,这样就可以绕过强类型比较了。
比如这里,如果$str1和$str2都是数组则双双返回FALSE,
两个FALSE相等得以绕过

MD5碰撞
$str1 = (string)$_GET['str1'];
$str2 = (string)$_GET['str2'];
if (md5($str1) === md5($str2)) {
die('OK');
}

看这段代码,跟强类型不同就在于进行了强制类型转换,传数组就不可行了,这里就需要MD5碰撞。
对于需要两个内容不同但是MD5值相同的文件,使用Fastcoll就可以了
但其实可以直接网上搜集些例子存下来就行

一些强碰撞的例子:
$a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
$b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

ps:如有不对或者需要补充,欢迎大佬指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦 & 醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值