怎么利用PHP-FPM實(shí)現(xiàn)繞過open_basedir

這篇文章主要講解了“怎么利用PHP-FPM實(shí)現(xiàn)繞過open_basedir”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么利用PHP-FPM實(shí)現(xiàn)繞過open_basedir”吧!

這篇文章主要講解了“怎么利用PHP-FPM實(shí)現(xiàn)繞過open_basedir”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么利用PHP-FPM實(shí)現(xiàn)繞過open_basedir”吧!

0X00 安裝模式

成都創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元浙江做網(wǎng)站,已為上家服務(wù),為浙江各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

在PHP中有以下幾種常見的安裝模式:

1. CGI模式

CGI是通用網(wǎng)關(guān)接口,HTTP使用這樣的接口程序來調(diào)用外部程序,外部程序可以使用任何計(jì)算機(jī)語言來編寫,例如C,C++,Perl,Visual Basic,Shell等等,歷史上用來編寫CGI程序使用最廣泛的是Perl語言。

服務(wù)器在認(rèn)為這是一個(gè)CGI請(qǐng)求時(shí),會(huì)調(diào)用相關(guān)CGI程序,并通過環(huán)境變量和標(biāo)準(zhǔn)輸出將數(shù)據(jù)傳送給CGI程序,CGI程序處理完數(shù)據(jù),生成html,然后再通過標(biāo)準(zhǔn)輸出將內(nèi)容返回給服務(wù)器,服務(wù)器再將內(nèi)容交給用戶瀏覽器,CGI進(jìn)程退出。

CGI的出現(xiàn)讓W(xué)EB從靜態(tài)變?yōu)闉閯?dòng)態(tài),隨著Web的越來越普及,很多的網(wǎng)站的都需要有動(dòng)態(tài)的頁面,以便與瀏覽者互交。CGI方式的缺點(diǎn)也越來越突出。因?yàn)镠TTP要生成一個(gè)動(dòng)態(tài)頁面,系統(tǒng)就必須啟動(dòng)一個(gè)新的進(jìn)程以運(yùn)行CGI程序,CGI采用fork and execution方式,每次請(qǐng)求都需要新建立CGI程序來進(jìn)行處理,不斷地fork是一項(xiàng)很消耗時(shí)間和資源的工作,導(dǎo)致性能的低下。這就出現(xiàn)了FastCGI。

2. FastCGI模式

FastCGI是從CGI發(fā)展改進(jìn)而來的。傳統(tǒng)CGI接口方式的主要缺點(diǎn)是性能很差,因?yàn)槊看蜨TTP服務(wù)器遇到動(dòng)態(tài)程序時(shí)都需要重新啟動(dòng)腳本解析器來執(zhí)行解析,然后結(jié)果被返回給HTTP服務(wù)器。這在處理高并發(fā)訪問時(shí),幾乎是不可用的。另外傳統(tǒng)的CGI接口方式安全性也很差,現(xiàn)在已經(jīng)很少被使用。FASTCGI快速通用網(wǎng)關(guān)接口是常駐內(nèi)存的CGI,實(shí)際上是對(duì)CGI程序的進(jìn)程管理,F(xiàn)astCGI接口方式采用C/S結(jié)構(gòu),可以將HTTP服務(wù)器和腳本解析服務(wù)器分開,同時(shí)在腳本解析服務(wù)器上啟動(dòng)一個(gè)或者多個(gè)腳本解析守護(hù)進(jìn)程。當(dāng)HTTP服務(wù)器每次遇到動(dòng)態(tài)程序時(shí),可以將其直接交付給FastCGI進(jìn)程來執(zhí)行,然后將得到的結(jié)果返回給瀏覽器。這種方式可以讓HTTP服務(wù)器專一地處理靜態(tài)請(qǐng)求或者將動(dòng)態(tài)腳本服務(wù)器的結(jié)果返回給客戶端,這在很大程度上提高了整個(gè)應(yīng)用系統(tǒng)的性能。

相關(guān)的Fastcgi學(xué)習(xí)可到合天網(wǎng)安實(shí)驗(yàn)室操作實(shí)驗(yàn)——Fastcgi安全:實(shí)驗(yàn):Fastcgi安全(合天網(wǎng)安實(shí)驗(yàn)室)本實(shí)驗(yàn)介紹了fastcgi安全,是以nginx+php+fastcgi為環(huán)境,在多臺(tái)fastcgi服務(wù)器做的情況下,容易出現(xiàn)的錯(cuò)誤。

3. Module模式



Module模式就是把php作為apache的一個(gè)子模塊來運(yùn)行,使用LoadModule來加載php模塊,比如在apache的配置文件中

//httpd.confLoadModule php7_module "${INSTALL_DIR}/bin/php/php7.2.13/php7apache2_4.dll"

當(dāng)web訪問php文件時(shí),apache會(huì)調(diào)用php模塊來解析,phpmodule通過sapi來把數(shù)據(jù)傳遞給php解析器進(jìn)行解析。

4. PHP-FPM模式

最后是本篇文章的主角PHP-FPM,F(xiàn)PM是一個(gè)FastCGI協(xié)議解析器,Nginx等服務(wù)器中間件將用戶請(qǐng)求按照FastCGI的規(guī)則打包好發(fā)送給PHP-FPM,再由PHP-FPM來將打包的數(shù)據(jù)進(jìn)行解析并與FastCGI進(jìn)行通信,PHP-FPM就是為了實(shí)現(xiàn)和管理FastCGI協(xié)議的進(jìn)程(fastcgi進(jìn)程管理器),管理一個(gè)進(jìn)程池,處理來自于web服務(wù)器的請(qǐng)求。其中,Ngnix與PHP-FPM有兩種通信方式,分別是TCP與Unix domain sockets模式。在windows系統(tǒng)中只能使用tcp socket的通信方式。

TCP模式

TCP模式是PHP-FPM進(jìn)程監(jiān)聽本機(jī)上端口(默認(rèn)為9000),Ngnix將用戶請(qǐng)求按照fastcgi的規(guī)則打包好發(fā)送給php-fpm,由PHP-FPM調(diào)用cgi進(jìn)行解析。TCP通信模式允許通過網(wǎng)絡(luò)進(jìn)程之間的通信,也可以通過loopback進(jìn)行本地進(jìn)程之間通信。

Unix domain sockets模式

Unix socket 又叫 IPC (inter-process communication 進(jìn)程間通信) socket,用于實(shí)現(xiàn)同一主機(jī)上的進(jìn)程間通信,這種方式需要在 Ngnix配置文件中填寫 PHP-FPM 的 socket 文件位置。

在P神的Fastcgi協(xié)議分析 && PHP-FPM未授權(quán)訪問漏洞 && Exp編寫這篇文章中對(duì)其中的原理已經(jīng)做了比較詳細(xì)的解釋:



假如用戶訪問

http://127.0.0.1/index.php?a=1&b=2



如果web 目錄為 /var/www/html,Nginx將請(qǐng)求變成鍵值對(duì)

{    'GATEWAY_INTERFACE': 'FastCGI/1.0',    'REQUEST_METHOD': 'GET',    'SCRIPT_FILENAME': '/var/www/html/index.php',    'SCRIPT_NAME': '/index.php',    'QUERY_STRING': '?a=1&b=2',    'REQUEST_URI': '/index.php?a=1&b=2',    'DOCUMENT_ROOT': '/var/www/html',    'SERVER_SOFTWARE': 'php/fcgiclient',    'REMOTE_ADDR': '127.0.0.1',    'REMOTE_PORT': '12345',    'SERVER_ADDR': '127.0.0.1',    'SERVER_PORT': '80',    'SERVER_NAME': "localhost",    'SERVER_PROTOCOL': 'HTTP/1.1'}

這個(gè)數(shù)組其實(shí)就是PHP中$_SERVER數(shù)組的一部分,也就是PHP里的環(huán)境變量。其作用不僅是填充$_SERVER數(shù)組,也是在告訴FPM要執(zhí)行哪個(gè)PHP文件。當(dāng)PHP-FPM拿到了數(shù)據(jù)包在之后,進(jìn)行解析,得到了環(huán)境變量,然后執(zhí)行SCRIPT_FILENAME的值指向的PHP文件,即/var/www/html/index.php。

0X01 如何利用



PHP-FPM默認(rèn)監(jiān)聽9000端口,如果這個(gè)端口暴露在公網(wǎng),則我們可以自己構(gòu)造FastCGI協(xié)議,和FPM進(jìn)行通信。這時(shí)候可以利用SCRIPT_FILENAME來指定執(zhí)行php文件,如果文件不存在則返回404。在Nginx中存在一個(gè)配置限定了只有帶某些后綴的文件才允許被PHP-FPM執(zhí)行,默認(rèn)為.php,security.limit_extensions

; Limits the extensions of the main script FPM will allow to parse. This can; prevent configuration mistakes on the web server side. You should only limit; FPM to .php extensions to prevent malicious users to use other extensions to; exectute php code.; Note: set an empty value to allow all extensions.; Default Value: .php;security.limit_extensions = .php .php3 .php4 .php5 .php7



為了避免404,首先需要找到已存在的PHP文件,如果不知道web的絕對(duì)路徑或者web目錄下的php文件名,可以使用全局搜索得到環(huán)境中默認(rèn)的php文件。

find / -name "*.php"

在我們獲得一個(gè)webshell的時(shí)候,怎么能突破限制執(zhí)行任意PHP代碼呢?



首先我們能控制SCRIPT_FILENAME,讓fpm執(zhí)行的任意文件,但是也只是執(zhí)行目標(biāo)服務(wù)器上的文件,并不能執(zhí)行我們需要其執(zhí)行的文件,但是在PHP中有很多有趣的技巧,比如在php.ini中有兩個(gè)配置項(xiàng)

auto_prepend_file    //在執(zhí)行目標(biāo)文件之前,先包含auto_prepend_file中指定的文件auto_append_file     //在執(zhí)行完成目標(biāo)文件后,包含auto_append_file指向的文件

如果設(shè)置auto_prepend_file為php://input,則相當(dāng)于執(zhí)行任何php文件之前會(huì)包含$_POST中的內(nèi)容,使用php://input需要開啟遠(yuǎn)程文件包含(allow_url_include)。



在PHP-FPM中還會(huì)解析兩個(gè)環(huán)境變量

PHP_VALUE                 //用于設(shè)置PHP的配置項(xiàng),除 disable_function 以外的大部分 php 配置PHP_ADMIN_VALUE



設(shè)置auto_prepend_file = php://input且allow_url_include = On,然后將我們需要執(zhí)行的代碼放在Body中,即可執(zhí)行任意代碼。

{    'GATEWAY_INTERFACE': 'FastCGI/1.0',    'REQUEST_METHOD': 'GET',    'SCRIPT_FILENAME': '/var/www/html/index.php',    'SCRIPT_NAME': '/index.php',    'QUERY_STRING': '?a=1&b=2',    'REQUEST_URI': '/index.php?a=1&b=2',    'DOCUMENT_ROOT': '/var/www/html',    'SERVER_SOFTWARE': 'php/fcgiclient',    'REMOTE_ADDR': '127.0.0.1',    'REMOTE_PORT': '12345',    'SERVER_ADDR': '127.0.0.1',    'SERVER_PORT': '80',    'SERVER_NAME': "localhost",    'SERVER_PROTOCOL': 'HTTP/1.1'    'PHP_VALUE': 'auto_prepend_file = php://input',    'PHP_ADMIN_VALUE': 'allow_url_include = On'}

以上介紹的只是對(duì)PHP-FPM進(jìn)行攻擊的正常流程,假如環(huán)境中增加了disable_functions的限制,如果使用包含PHP_VALUE==disable_function=的惡意FastCgi攻擊FPM時(shí),只能修改展示phpinfo信息的EG(ini_directives),也就是表面修改,對(duì)于已經(jīng)禁用的函數(shù)無效的。

0X02 實(shí)例解析

以SUCTF2019中的一道題為例easyphp,在獲得webshell以后,發(fā)現(xiàn)有disable_functions的限制,這里可以通過與php-fpm進(jìn)行通信來繞過open_basedir。



這里想要獲得flag需要利用php_value對(duì)open_basedir的值進(jìn)行重設(shè)

'PHP_VALUE': 'auto_prepend_file = php://input'+chr(0x0A)+'open_basedir = /',

官方給的環(huán)境很有問題,少了upload目錄,需要自行加上,進(jìn)去以后直接用官方給的exp復(fù)現(xiàn)也沒成功,進(jìn)去docker發(fā)現(xiàn)php-fpm根本沒有起,emmmm醉了



直接在ubuntu16.04起一個(gè)phpfpm

sudo apt updatesudo apt install -y nginxsudo apt install -y software-properties-commonsudo add-apt-repository -y ppa:ondrej/phpsudo apt updatesudo apt install -y php7.3-fpm



修改nginx站點(diǎn)文件

sudo vim /etc/nginx/sites-enabled/default



啟用unix socket模式

sudo vim /etc/php/7.3/fpm/pool.d/www.conf

配置php-fpm監(jiān)聽,將listen參數(shù)修改為127.0.0.1:9000



重啟php-fpm和nginx

/etc/init.d/php7.3-fpm restartservice nginx restart

修改相應(yīng)的open_basedir

利用php-fpm通信來修改basedir,用p神的腳本修改一下

最后繞過open_basedir成功

網(wǎng)站名稱:怎么利用PHP-FPM實(shí)現(xiàn)繞過open_basedir
網(wǎng)頁URL:http://muchs.cn/article0/epcsio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司、微信公眾號(hào)、外貿(mào)建站、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)