PHP文件包含漏洞復現

引言~

老規矩,介紹一波原理先

PHP文件包含原理:
文件包含漏洞的產生原因是在通過 PHP 的函數引入文件時,由於傳入的文件名沒有經過合理的校驗,從而操作了預想之外的文件,就可能導致意外的文件泄露甚至惡意的代碼注入。
php 中引發文件包含漏洞的通常是以下四個函數:
1、include() 當使用該函數包含文件時,只有代碼執行到 include() 函數時纔將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行。
2、include_once() 功能和 include() 相同,區別在於當重複調用同一文件時,程序只調用一次。
3、require() 只要程序一執行就會立即調用文件,發生錯誤的時候會輸出錯誤信息,並且終止腳本的運行
4、require_once() 它的功能與 require() 相同,區別在於當重複調用同一文件時,程序只調用一次。
當使用這四個函數包含一個新文件時,該文件將作爲 PHP 代碼執行,php 內核並不在意該被包含的文件是什麼類型。所以如果被包含的是 txt 文件、圖片文件、遠程 url、也都將作爲 PHP 代碼執行

再談談文件包含的分類

文件包含漏洞可以分爲 RFI (遠程文件包含)和 LFI(本地文件包含漏洞)兩種。而區分他們最簡單的方法就是 php.ini 中是否開啓了allow_url_include。如果開啓 了我們就有可能包含遠程文件。
1、本地文件包含 LFI(Local File Include)
2、遠程文件包含 RFI(Remote File Include)(需要 php.ini 中 allow_url_include=on、allow_url_fopen = On)
在 php.ini 中,allow_url_fopen 默認一直是 On,而 allow_url_include 從 php5.2 之後就默認爲 Off。

因爲要測試的服務器並沒有文件包含漏洞代碼,而這個漏洞是必須服務器端自帶的,也就是說如果你要攻擊的網站沒有文件包含漏洞,圖片馬就是用不了的,所以爲了方便我們實驗的進行,我們需要先上傳一個帶有文件解析漏洞代碼的PHP文件到服務器上
需要用到的php函數爲include()

include()函數對文件後綴名無要求,而對其中的語法有要求,即使後綴名爲txt,jpg也會被當做php文件解析,只要文件內是<?php ?>形式就可以執行,但是如果不是php語法的形式,即使後綴爲php,也無法執行。






一.開始驗證

1.先把我們的文件包含漏洞代碼上傳到服務器的根目錄裏,要記住上傳的位置,因爲到時候還要調用這個還是來解析小馬!!

本地文件包含exp:
<?php
$file = $_GET['file'];
include $file;
?>

具體利用方法:

瀏覽器輸入剛剛上傳php文件解析漏洞代碼的地址 並且在url地址後面加上file=upload/1.jpg來調用小馬
比如:127.0.0.1/upload-labs-master/upload//include.php?file=upload/1.jpg
當然,PHP文件包含不可能只有包含圖片馬這一種攻擊手法,利用文件包含漏洞的攻擊方法五花八門,如果當你有一天滲透測試發現圖片馬用不了了,不妨試試以下幾種思路:
1.包含日誌,但是需要知道服務器日誌的存儲路徑,且日誌文件可讀
2.遠程文件包含,如curl

先把我們要上傳的php文件包含代碼改爲jpg格式,不然過不了檢測,當然,改後綴名只是其中的一種方法,也可用採用禁用瀏覽器js來屏蔽後綴名的檢測,從而達到文件上傳的效果

在這裏插入圖片描述


2.抓包改包

打開burp設置瀏覽器代理,準備抓取瀏覽器與服務端通訊的數據包

推薦使用火狐的 foxy proxy 插件
在這裏插入圖片描述
抓取數據包後,我們來修改數據包裏面的內容,把剛剛上傳的jpg文件改爲用來的php後綴名

在這裏插入圖片描述
接下來驗證一下文件是否上傳成功,瀏覽器複製剛剛上傳的圖片鏈接,然後新建窗口打開
在這裏插入圖片描述

文件能成功打開,雖然報錯了,不過證明我們成功上傳了文件解析漏洞的php代碼,其實出現報錯信息的是一件有趣的事情,因爲它直接把服務器的物理路徑給報出來了,省的我們花無謂的時間再去探測服務器的目錄,這對我們往後的文件上傳很有幫助!!




3.製作圖片馬

1.準備好一張圖片,個人覺得小一點的圖片比較好,因爲有些網站會做限制,不讓傳輸過大的文件,而且上傳的圖片太大了,容易引起網站管理員的注意,所以準備的圖片大小適中就好,這裏做演示所以選了一張小一點的圖片

2.準備好一句話代碼,這是我們遠程控制對方服務器的關鍵!!

PHP一句話代碼:

3.合併兩個文件,我這裏準備的是bat處理文件,這樣子比較高效

先把這串代碼複製到記事本里,然後把後綴名改爲bat即可

copy *.jpg /b + *.php /a 1.jpg

要記住的一點,圖片要放在前面,木馬放後面 不然會圖片無法顯示!!

製作成功的圖片馬是能夠成功顯示的,如果無法顯示,建議重新找一張圖片合併,不然一張無法顯示的圖片在一個網站裏面太過顯眼,會引起懷疑
在這裏插入圖片描述
右擊圖片馬,使用文本編輯器打開,可以發現我們的一句話木馬位於文件的最後面

在這裏插入圖片描述

準備完畢圖片馬,接下來我們可以上傳了

4.上傳圖片馬

可以看到,上傳成功得圖片馬是能夠正常顯示的

在這裏插入圖片描述

接着,我們就要利用剛剛上傳的PHP文件解析漏洞代碼來執行圖片馬的功能了

瀏覽器打開我們上傳的圖片馬
在這裏插入圖片描述

可以看到圖片是非常正常的,完全看不出有木馬。

接着,我們就要利用剛剛上傳的PHP文件解析漏洞代碼來執行圖片馬的功能了

5.漏洞利用

瀏覽器輸入剛剛上傳php文件解析漏洞代碼的地址 並且在url地址後面加上file=upload/1.jpg來調用小馬

127.0.0.1/upload-labs-master/upload//include.php?file=upload/1.jpg

可以看到頁面出現了一堆亂碼,而且剛剛我圖片馬加在這個位置,可是現在缺沒有被打印出來,而是跟圖片一起被執行了
在這裏插入圖片描述

6.蟻劍鏈接getshell

打開蟻劍,右鍵添加數據,把剛剛的url地址複製過去,然後輸入鏈接的密碼
在這裏插入圖片描述

雙擊打開,成功拿到網站的webshell
在這裏插入圖片描述

至此,PHP文件包含漏洞驗證完畢




這裏說說漏洞的解決方案吧

做到以下幾點雖說不是能完全杜絕漏洞的復現,但是抵擋普通的php文件包含漏洞攻擊卻也是可以的


1.嚴格檢查變量是否已經初始化。
2.嚴格判斷包含中的參數是否外部可控。
3.基於白名單的包含文件驗證,驗證被包含的文件是否在白名單中。
4.儘量不要使用動態包含,可以在需要包含的頁面固定寫好,如:include(“func.php”)。
5.對所有輸入提交可能包含的文件地址,包括服務器本地文件及遠程文件,進行嚴格的檢查,參數中不允許出現…/之類的目錄跳轉符。
6.可以通過調用str_replace()函數實現相關敏感字符的過濾,一定程度上防禦了遠程文件包含。


最後送上一波PHP僞協議:
file:///var/www/html 訪問本地文件系統  (常用)
ftp://<login>:<password>@<ftpserveraddress> 訪問 FTP(s) URLs
data:// 數據流
http:// — 訪問 HTTP(s) URLs   (常用)
ftp:// — 訪問 FTP(s) URLs
php:// — 訪問各個輸入/輸出流
zlib:// — 壓縮流
data:// — Data (RFC 2397)
glob:// — 查找匹配的文件路徑模式
phar:// — PHP Archive
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — Audio streams
expect:// — 處理交互式的流
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章