引言~
老規矩,介紹一波原理先
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:// — 處理交互式的流