米斯特白帽培訓(xùn)講義(v2)漏洞篇 文件包含

米斯特白帽培訓(xùn)講義 漏洞篇 文件包含

講師:gh0stkey

整理:飛龍

協(xié)議:CC BY-NC-SA 4.0

原理

文件包含就是將一個文件包含到自己的文件中執(zhí)行。它可分為本地包含和遠(yuǎn)程包含,本地包含即包含本地磁盤上的文件,文件名稱是相對路徑或絕對路徑,遠(yuǎn)程包含即包含互聯(lián)網(wǎng)上的文件,文件名稱是 URL。

本地包含

比如我們有一個test.txt文件,僅僅調(diào)用phpinfo來測試:

<?php phpinfo();?>

然后我們在相同目錄下放置一個fileinclude.php,如下:

<?php
$file=@$_GET['file'];
if($file){
    echo "<center>File:".$file."<br/>Result:</center>";
    include $file;
}

第一行代碼獲取 URL 參數(shù)file的內(nèi)容。2 ~ 4 行首先判斷$file是否為空,若不為空,輸出其內(nèi)容,并將其作為文件名稱包含。

我們將其部署在localhost下,之后訪問http://localhost/fileinclude.php?file=test.txt,會看到phpinfo的輸出。

我這里之所以用txt文件,就是想說明這個漏洞是無視擴(kuò)展名的。跟文件上傳漏洞不一樣,文件上傳漏洞中如果我們上傳的文件不是.php就執(zhí)行不了(當(dāng)然也有一些繞過手段),但是文件包含漏洞中的擴(kuò)展名是任意的,這里我們上傳了.txt,證實(shí)有效,那么這個.jpg也是有效的。

要注意,如果被包含的文件里面沒有 PHP 標(biāo)簽,那么就當(dāng)成 HTML 內(nèi)容如實(shí)顯示出來。就比如我們放入之前的top100.txt

遠(yuǎn)程包含

為了演示遠(yuǎn)程包含,我們需要將 PHP 配置文件中的allow_url_include設(shè)置為on,之后重啟 PHP。PHP 配置文件的位置可以在phpinfo的輸出中尋找,我們搜索ini即可:

我這里是C:\php-5.5.10\php.ini,你那里可能有些差別。我們打開它,搜索allow_url_include,會看到下面這些行,如果是Off把它改成On

; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-include
allow_url_include = On

我們需要將file參數(shù)改為http://localhost/text.txt,可以看到相同結(jié)果。

技巧

00 截斷

有些程序會給被包含內(nèi)容加一些后綴,比如如果fileinclude.php是這樣。

<?php
$file=@$_GET['file'];
if($file){
    $file .= '.php';
    echo "<center>File:".$file."<br/>Result:</center>";
    include $file;
}

它后面加了個.php,也就是說,如果我們傳入file=test則是正常的,傳入file=test.txt,或變成test.txt.php,從而包含失敗。那么我們應(yīng)該怎么辦呢?

如果 PHP 版本小于 5.3,并且magic_quotes_gpc已取消,我們就可以使用%00來截斷。我們傳入file=test.txt%00,就可以實(shí)現(xiàn)包含。

路徑遍歷

  • ./(或省略):當(dāng)前目錄
  • ../:上級目錄
  • /:根目錄(Windows 中為當(dāng)前盤內(nèi)的根目錄)
  • ~/:用戶的主目錄

例如,在 Linux 下,我們就可以使用file=/etc/passwd來讀取系統(tǒng)密碼。

這里是一些常見的日志文件位置:

  • apache+Linux日志默認(rèn)路徑
    • /etc/httpd/logs/access.log
    • /var/log/httpd/access.log
  • apache+win2003日志默認(rèn)路徑
    • D:\xampp\apache\logs\access.log
    • D:\xampp\apache\logs\error.log
  • IIS6.0+win2003默認(rèn)日志文件
    • C:\WINDOWS\system32\Lognames
  • IIS7.0+win2003 默認(rèn)日志文件
    • %SystemDrive%\inetpub\logs\Lognames
  • nginx 日志文件
    • <安裝目錄>/logs
    • 如果安裝目錄為/usr/local/nginx,則為/usr/local/nginx/logs
  • apache+linux 默認(rèn)配置文件
    • /etc/httpd/conf/httpd.conf
    • /etc/init.d/httpd
  • IIS6.0+win2003 配置文件
    • C:/Windows/system32/inetsrv/metabase.xml
  • IIS7.0+WIN 配置文件
    • C:\Windows\System32\inetsrv\config\applicationHost.config

PHP 偽協(xié)議

允許遠(yuǎn)程包含的情況下,我們可以使用php://偽協(xié)議,比如php://filter/resource=test.txt可以讀取相同文件。

我們還可以加一個過濾器讓它顯示為 BASE64 編碼格式,php://filter/read=convert.base64-encode/resource=test.txt。如果我們要獲取的文件里面有不可打印的字符,或者我們想要獲取代碼的內(nèi)容,可以用這種方式來獲取,之后解碼即可。

php://input可以讀取原始的 HTTP 正文內(nèi)容。如果我們將file設(shè)置為php://input,并且在 HTTP 正文中傳入 PHP 代碼,例如<?php phpinfo();?>,即可執(zhí)行代碼。

Data URI

Data URI 的格式是data://text/plain;base64,<base64>,同樣需要遠(yuǎn)程包含。我們首先把一句話用 base64 編碼,得到PD9waHAgcGhwaW5mbygpOz8+,然后將file設(shè)置為data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b(注意URL編碼),即可執(zhí)行代碼。

如何挖掘

首先對 URL 進(jìn)行分析,看看是否和文件相關(guān),比如www.test.com/xxx.php?file=yyy。帶有文件相關(guān)的敏感名稱都可以進(jìn)行挖掘。

利用

當(dāng)我們發(fā)現(xiàn)了本地包含漏洞時,首先尋找上傳點(diǎn),比如用戶頭像上傳功能。然后我們可以構(gòu)造一個純文本文件,內(nèi)容為<?php phpinfo();?>,并將其命名為xxx.jpg

之后我們就可以把xxx.jpg上傳上去,并通過應(yīng)用得到它的位置,假設(shè)是/upload/xxx.jpg,然后我們就可以把file參數(shù)的值改為它。以前面的代碼為例,URL 是http://localhost/fileinclude.php?file=/upload/xxx.jpg

如果我們把xxx.jpg的內(nèi)容改為菜刀的一句話,那就可以用菜刀連接。

再說一下遠(yuǎn)程包含,遠(yuǎn)程包含的條件比較苛刻,目標(biāo)網(wǎng)站需要把allow_url_open給打開。所以有本地包含不一定有遠(yuǎn)程包含,有遠(yuǎn)程包含一定就有本地包含。但是,遠(yuǎn)程包含的利用相對簡單,只要將代碼上傳到自己博客,或者任何能通過 URL 訪問到的地方就可以了。后續(xù)步驟是一樣的。

附錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容