目錄
一、導(dǎo)圖
二、文件包含漏洞
1.腳本代碼
2.原理演示
3.漏洞成因
4.檢測方法
5.類型分類
三、本地文件包含漏洞的利用
<無限制本地文件包含>
<有限制本地文件包含>
四、遠(yuǎn)程文件包含漏洞的利用
<無限制遠(yuǎn)程文件包含>
<有限制遠(yuǎn)程文件包含>
五、協(xié)議的玩法
<讀取文件內(nèi)容>
<執(zhí)行代碼>
<寫入一句話后門木馬>
?六、南郵杯CTF實(shí)例
?七、i春秋百度杯實(shí)例
八、某CMS文件包含漏洞實(shí)例
一、導(dǎo)圖
二、文件包含漏洞
1.腳本代碼
? ? ? ? 文件包含各個腳本代碼。
ASP,ASPX,JSP,PHP等
<!-—#include file="1.asp " -->
<!--#include file="top.aspx"-->
<c:import url="http://lthief.one/1.jsp">
<jsp:include page="head .jsp" / >
<%@ include file="head.jsp" %>
<?php Include ( 'test.php ' ) ?>
2.原理演示
? ? ? ? (1)創(chuàng)建一個名為include.php的php文件,文件內(nèi)的代碼如下圖所示。
? ? ? ? (2)創(chuàng)建一個名為1.txt的文件,文件內(nèi)的內(nèi)容如下圖所示。
? ? ? ? (3)直接訪問include.php文件,添加filename的參數(shù)值為1.txt??梢钥吹骄W(wǎng)站成功執(zhí)行了文件1.txt內(nèi)的php代碼。
????????(4)但是如果我們直接訪問1.txt文件,網(wǎng)站就只會將其當(dāng)作一串文本進(jìn)行輸入。而當(dāng)我們利用了文件包含漏洞進(jìn)行訪問時,網(wǎng)站就會將其當(dāng)作代碼進(jìn)行執(zhí)行。
? ? ? ? 總結(jié):將指定文件內(nèi)的內(nèi)容以網(wǎng)站腳本代碼類型進(jìn)行執(zhí)行。如:如果網(wǎng)站是php的,就當(dāng)作php代碼進(jìn)行執(zhí)行;如果網(wǎng)站是jsp的,就當(dāng)作jsp代碼進(jìn)行執(zhí)行;
3.漏洞成因
? ? ? ? (1)可空變量:$filename。
? ? ? ? (2)漏洞函數(shù):include()。
4.檢測方法
? ? ? ? (1)白盒檢測:代碼審計。
? ? ? ? (2)黑盒檢測:采用漏洞掃描工具,或者搜素公開漏洞,或者查看網(wǎng)址后面的參數(shù),是否接收的是文件。
5.類型分類
????????(1)本地包含:只包含本地的文件。
? ? ? ? (2)遠(yuǎn)程包含:包含互聯(lián)網(wǎng)可以訪問到的文件,危害更大。
? ? ? ? (3)無限制和有限制:兩種包含類型都存在無限制和有限制的兩種情況,無限制就是沒有限制直接拿來用就可以,有限制是可能會存在一些干擾,需要用到一些特殊的方法進(jìn)行繞過。
三、本地文件包含漏洞的利用
<無限制本地文件包含>
1.當(dāng)我們要進(jìn)行跨目錄的文件包含時,就需要用到“../”符號來向上一級進(jìn)行跳轉(zhuǎn)了。
2.比如我們要對下圖路徑下的www.txt進(jìn)行文件包含。
3.我們需要將參數(shù)的值設(shè)為如下圖所示的樣式。
<有限制本地文件包含>
1.這里的代碼比上面無限制的代碼多了“.html”。
2.當(dāng)我們此時再對1.txt文件進(jìn)行文件包含的時候,就相當(dāng)于包含了1.txt.html。
3.那么面對這種情況我們該怎么辦呢?下面介紹幾種繞過的方法。
4. 第一種:%00截斷:此方法要求php版本<5.3.4。
? ? ? ? 只需在文件末尾添加“%00”來將后面的“.html”進(jìn)行截斷。
? ? ? ? 可以看到下圖進(jìn)行%00截斷后成功將文件中的代碼進(jìn)行了執(zhí)行。?
5. 第二種:長度截斷:windows,點(diǎn)號需要長于250;linux,點(diǎn)號需要長于4096。
????????這種方法類似與waf繞過過程中的垃圾數(shù)據(jù)填充的方法。
? ? ? ? 利用垃圾數(shù)據(jù)進(jìn)行填充,達(dá)到對應(yīng)服務(wù)器系統(tǒng)文件命名的最大長度,從而將“.html”擠出,讓其無法添加。
????????只需在文件末尾添加類似“/./././././././.·····”、“..........·····”等的垃圾數(shù)據(jù)來將后面的“.html”擠出。
? ? ? ? 可以看到下圖進(jìn)行長度截斷后成功將文件中的代碼進(jìn)行了執(zhí)行。?
四、遠(yuǎn)程文件包含漏洞的利用
? ? ? ? 如果代碼里面有限制只能包含本地文件的話,就不會造成遠(yuǎn)程文件包含漏洞。
? ? ? ? 如果代碼里面沒有限制,并且搭建平臺上的設(shè)置里也沒有設(shè)置不允許包含遠(yuǎn)程遠(yuǎn)程文件的話,就可能造成遠(yuǎn)程包含文件漏洞。
? ? ? ? 在php里就有這樣一個開關(guān)——allow_url_include??梢酝ㄟ^phpinfo()來查看到。
? ? ? ? ?如果這個開關(guān)是開啟狀態(tài),就允許地址的遠(yuǎn)程請求。
<無限制遠(yuǎn)程文件包含>
1.首先演示無限制的遠(yuǎn)程文件包含。
2.訪問如下圖所示的url可以看到這個文件內(nèi)包含這樣一串內(nèi)容。
3.訪問這個遠(yuǎn)程的文件,可以看到網(wǎng)站對遠(yuǎn)程文件內(nèi)的內(nèi)容進(jìn)行了執(zhí)行。
4.我們將遠(yuǎn)程文件內(nèi)的代碼修改為一個后門代碼。
5.再次進(jìn)行訪問,可以看到前面的“ni shi gej ib!”成功被執(zhí)行了,而后面的后門代碼卻看不到,這是正?,F(xiàn)象,此時的后門代碼其實(shí)已經(jīng)被執(zhí)行了,執(zhí)行效果就是空白的而已。?
6.使用工具“菜刀”連接后門代碼。
7.打開工具后將地址以及密碼進(jìn)行輸入并修改腳本類型為php,然后點(diǎn)擊添加。
8.可以看到成功連接上了后門文件。
<有限制遠(yuǎn)程文件包含>
1.這里的代碼比上面無限制的代碼多了“.html”。
2.當(dāng)我們此時再對遠(yuǎn)程文件進(jìn)行文件包含的時候,就失敗了。
?3.那么面對這種情況我們該怎么辦呢?下面介紹幾種繞過的方法。
4. 第一種:末尾加%20:
?5. 第二種:末尾加%23:
?6. 第三種:末尾加?:
五、協(xié)議的玩法
? ? ? ? 優(yōu)秀文章:https://www.cnblogs.com/endust/p/11804767.html
<讀取文件內(nèi)容>
1.在參數(shù)后輸入下面的內(nèi)容來對1.txt文件進(jìn)行讀取。
2.讀取到的內(nèi)容是經(jīng)過base64加密過的(防止亂碼),經(jīng)過解密后即可得到文件內(nèi)容本來的樣子。?
<執(zhí)行代碼>
1.在參數(shù)后輸入下面的內(nèi)容,同時在post部分寫入要執(zhí)行的代碼。
<寫入一句話后門木馬>
1.在參數(shù)后輸入下面的內(nèi)容,同時在post部分寫入要執(zhí)行的代碼。
2.查看網(wǎng)站目錄,可以看到“shell.php”后門代碼被成功寫入了。
六、南郵杯CTF實(shí)例
? ? ? ? 地址:asdf
1.打開網(wǎng)站。
2.點(diǎn)擊表述文字。
3.首先判斷其可能存在文件包含漏洞,因?yàn)樽詈髤?shù)部分是“file=show.php”,很明顯大概率是文件參數(shù)。?
4.因?yàn)檫@里展示的是show.php文件,因此我們想到直接去訪問show.php文件,可以看到當(dāng)我們直接訪問show.php時,網(wǎng)站返回的也是同樣的內(nèi)容。
?5.因此我們可以判斷出show.php的內(nèi)容就是text123,放在參數(shù)的后面無非就是將其進(jìn)行包含之后再執(zhí)行輸出,到這里我們就不難判斷出這里考的明顯就是文件包含漏洞了。
6.我們首先來判斷它的操作系統(tǒng),將php改為phP然后訪問,可以看到網(wǎng)頁返回錯誤,因此判斷其是linux操作系統(tǒng)。
?7.因此我們在這里執(zhí)行l(wèi)inux下的ls命令,可以看到網(wǎng)頁返回了下面的內(nèi)容。
8.我們換一條命令執(zhí)行,網(wǎng)頁依然返回同樣的內(nèi)容,說明網(wǎng)站對此存在攔截。
?9.這個方法不可行,因此我們想到協(xié)議的玩法,想到下面的方法,首先嘗試讀取index.php,發(fā)現(xiàn)讀取成功了。
10.將讀取到的內(nèi)容進(jìn)行解碼。
11.將解碼到的文件放入一個文本文檔里進(jìn)行查看,因?yàn)樵谏厦娴能浖锊榭锤袷讲皇呛芮宄?/p>
12.成功獲取到了flag值。
七、i春秋百度杯實(shí)例
1.打開靶場可以看到下面的內(nèi)容。
2.閱讀頁面內(nèi)給出的代碼可以知道它的意思為:如果接收到了path變量,就用include將接收到的值進(jìn)行包含,否則就執(zhí)行下面的phpinfo.php。
3.進(jìn)行驗(yàn)證一下,發(fā)現(xiàn)我們分析的沒有問題。
4.我們首先來包含index.php文件,可以看到成功進(jìn)行了讀取。
?5.判斷其操作系統(tǒng)——>linux系統(tǒng)。
6.采用linux的命令來讀取目錄。
?7.因?yàn)楹竺娴膬蓚€文件我們已經(jīng)讀取過了,所以我們來讀取第一個文件來查看它的內(nèi)容。
?8.發(fā)現(xiàn)什么也沒讀取到。
9.查看網(wǎng)頁的源代碼,可以看到flag在這里。?
八、某CMS文件包含漏洞實(shí)例
1.打開網(wǎng)站可以看到下面的頁面。
?2.那么我們是如何發(fā)現(xiàn)這個網(wǎng)站的漏洞的呢?
3.首先我們知道它是ekucms了,因此我們可以先直接到網(wǎng)上搜索這個cms的漏洞,有我們就直接拿來利用,沒有我們就將原碼下載下來自己進(jìn)行分析。?
4.可以看到確實(shí)是存在漏洞的。
5.找到一篇文章,可以得知它的思路是:?因?yàn)檫@個cms不存在文件上傳,所以只能訪問網(wǎng)站內(nèi)的固有文件。但是因?yàn)檫@個cms存在本地文件包含漏洞,所以我們可以將一句話木馬寫到網(wǎng)站的日志里,然后利用本地文件包含漏洞包含這個日志文件,然后再利用菜刀等工具進(jìn)行連接即可。
6.將文章內(nèi)的url進(jìn)行復(fù)制,然后放到我們的瀏覽器內(nèi)修改后進(jìn)行訪問?。
7.可以看到網(wǎng)頁返回了錯誤信息,但是此時url內(nèi)容已經(jīng)被寫入到了網(wǎng)站的日志里。?
? ? ? ? 解釋:為什么這個后門代碼代碼的兩側(cè)不用加"<?php?>",因?yàn)樵谶M(jìn)行文件包含的時候,回根據(jù)網(wǎng)站的腳本類型來執(zhí)行文件內(nèi)的內(nèi)容,而這里網(wǎng)站的腳本類型本身就是php,所以不加"<?php?>"同樣也會按照php代碼進(jìn)行執(zhí)行。
8.該日志是以時間日期命名的,首先訪問下面的url來觸發(fā)后門代碼。
?8.添加參數(shù)來進(jìn)行測試,可以看到成功將參數(shù)代碼進(jìn)行了執(zhí)行。
文章來源:http://www.zghlxwxcb.cn/news/detail-424498.html
?9.到這里我們基本就可以執(zhí)行任意的代碼了,也就成功拿下了網(wǎng)站的權(quán)限。文章來源地址http://www.zghlxwxcb.cn/news/detail-424498.html
到了這里,關(guān)于Web漏洞-文件包含漏洞超詳細(xì)全解(附實(shí)例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!