目錄
1. 了解nginx的工作原理
2. 漏洞原理及舉例分析
3. 前端php源碼分析
4. 注入思路
5. 漏洞復(fù)現(xiàn)
5.1 上傳文件并抓包分析
?5.2 通過(guò)訪問文件執(zhí)行php
?注意一點(diǎn)
6. 漏洞修復(fù)
1. 了解nginx的工作原理
nginx是以PHP語(yǔ)言為主。像Apache一樣,Nginx自身是不支持解析PHP語(yǔ)言的,只能通過(guò)加載PHP模塊來(lái)解析PHP。原理圖可以看下圖:
Nginx解析PHP原理圖
nginx接收到數(shù)據(jù)后會(huì)依賴FastCG協(xié)議I將數(shù)據(jù)進(jìn)行一次格式化,然后 PHP-FPM 會(huì)創(chuàng)建許多的PHPCGI進(jìn)程用于處理FastCGI協(xié)議格式化好的數(shù)據(jù),處理完后會(huì)將數(shù)據(jù)交給 php 處理,最后會(huì)將處理好的數(shù)據(jù)返回給瀏覽器。
注意這里FastCGI處理后的數(shù)據(jù)和PHP-FPM處理的數(shù)據(jù)結(jié)構(gòu)相同,所以可以被PHPCGI模塊直接調(diào)用。
通過(guò)原理圖和剛才的定義,我們對(duì)Nginx處理PHP請(qǐng)求有了大致的了解。那么,Nginx是如何知道將什么樣的文件當(dāng)作PHP文件處理?是在nginx.conf配置文件中的
location ~ \.php$ { ? ?root ? ? ? ? ? html; ? ?include ? ? ? ?fastcgi_params; ? ? ?fastcgi_pass ? IP:9000; ? ?fastcgi_index ?index.php; ? ?fastcgi_param ?SCRIPT_FILENAME ?/var/www/html$fastcgi_script_name; ? ?fastcgi_param ?DOCUMENT_ROOT /var/www/html; }
location后面的.php$代表了以.php結(jié)尾的文件都按照花括號(hào)中的內(nèi)容執(zhí)行,其中fastcgi_pass就是nginx和php-fpm的媒介,Nginx將請(qǐng)求通過(guò)fastcgi_pass轉(zhuǎn)發(fā)給php-fpm。fastcgi_pass可以和Nginx不在同一臺(tái)服務(wù)器上,他們通過(guò)IP+PORT的方式進(jìn)行通信。
2. 漏洞原理及舉例分析
CVE-2013-4547漏洞是由于非法字符空格和截止符導(dǎo)致Nginx在解析URL時(shí)的有限狀態(tài)機(jī)混亂,導(dǎo)致攻擊者可以通過(guò)一個(gè)非編碼空格繞過(guò)后綴名限制。假設(shè)服務(wù)器中存在文件123.?jpg,則可以通過(guò)改包訪問讓服務(wù)器認(rèn)為訪問的為PHP文件。
這個(gè)漏洞其實(shí)和代碼執(zhí)行沒有太大關(guān)系,其主要原因是錯(cuò)誤地解析了請(qǐng)求的URI,錯(cuò)誤地獲取到用戶請(qǐng)求的文件名,導(dǎo)致出現(xiàn)權(quán)限繞過(guò)、代碼執(zhí)行的連帶影響。
舉個(gè)例子,比如,Nginx匹配到.php結(jié)尾的請(qǐng)求,就發(fā)送給fastcgi進(jìn)行解析,常見的寫法如下:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
正常情況下(關(guān)閉pathinfo的情況下),只有.php后綴的文件才會(huì)被發(fā)送給fastcgi解析。
而存在CVE-2013-4547的情況下,我們請(qǐng)求1.gif[0x20][0x00].php
,這個(gè)URI可以匹配上正則\.php$
,可以進(jìn)入這個(gè)Location塊;但進(jìn)入后,Nginx卻錯(cuò)誤地認(rèn)為請(qǐng)求的文件是1.gif[0x20]
,就設(shè)置其為SCRIPT_FILENAME
的值發(fā)送給fastcgi。
fastcgi根據(jù)SCRIPT_FILENAME
的值進(jìn)行解析,最后造成了解析漏洞。
所以,我們只需要上傳一個(gè)空格結(jié)尾的文件,即可使PHP解析之。
3. 前端php源碼分析
?框住的內(nèi)容為使用后綴名過(guò)濾上傳的文件,若文件的后綴名為 'php', 'php3', 'php5', 'phtml' 中的一個(gè)則前端會(huì)拒絕上傳此文件。
但在關(guān)閉pathinfo的情況下,只有.php后綴的文件才會(huì)被發(fā)送給fastcgi解析之后進(jìn)行上傳。
4. 注入思路
該漏洞利用了Nginx錯(cuò)誤的解析了URL地址,導(dǎo)致可以繞過(guò)服務(wù)端限制,從而解析PHP文件,造成命令執(zhí)行的危害。 根據(jù)nginx.conf文件中l(wèi)ocation中的定義,以.php結(jié)尾的文件都解析為php。若我們?cè)L問的文件名為shell.gif0x20.php,該文件名以.php結(jié)尾可以被FastCGI接收,F(xiàn)astCGI在讀取文件名時(shí)被00截?cái)?,?dǎo)致讀取的文件名為1.gif[0x20],配合limit_extensions為空即可利用成功。該漏洞利用條件有兩個(gè):
-
Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
-
php-fpm.conf中的security.limit_extensions為空,也就是說(shuō)任意后綴名都可以解析為PHP
?security.limit_extensions 為php的安全限制開啟狀態(tài)只允許有.php后綴的文件進(jìn)行PHP處理。
5. 漏洞復(fù)現(xiàn)
進(jìn)入/vulhub/nginx/CVE-2013-4547,啟動(dòng)靶場(chǎng)環(huán)境:docker-compose up -d 我們通過(guò)一個(gè)寫有 php命令的 .jpg 文件上傳一個(gè)圖片的 webshell 命令如下:
<?php phpinfo(); ?>
5.1 上傳文件并抓包分析
?將文件重命名為shell.jpg 截?cái)喾?php
這里先用aa進(jìn)行占位,之后通過(guò)16進(jìn)制進(jìn)行修改
?這里的 61 為 16進(jìn)制的a,我們要將這里的aa修改為空格(20)和截?cái)喾?0)
?最終上傳的包為
這里文件整體的后綴名為.php所以這個(gè)文件會(huì)交給FastCGI處理,之后FastCGI會(huì)將文件名從截?cái)喾幗財(cái)噙@時(shí)的文件名為 shell.jpg0x20? 同時(shí)這樣也繞過(guò)了前端代碼對(duì).php文件的過(guò)濾,然后將文件上傳。
上傳的結(jié)果:
?
?5.2 通過(guò)訪問文件執(zhí)行php
這里我們通過(guò)訪問網(wǎng)址進(jìn)行抓包修改
抓到的包
?進(jìn)行修改:
?這里的aa依就是占位,便于通過(guò)16進(jìn)制修改文件名
?修改好后的文件名:
?這里也是一樣包中的請(qǐng)求文件的總體后綴名為.php,nginx會(huì)首先將文件交給FastCGI處理并截?cái)鄤t請(qǐng)求的文件名為 shell.jpg,之后會(huì)交給PHP-FPM處理此時(shí)php-fpm.conf中的security.limit_extensions為空,也就是說(shuō)任意后綴名都可以解析為PHP?所以會(huì)將 shell.jpg 文件當(dāng)作php文件處理并返回給瀏覽器形成邏輯漏洞。
請(qǐng)求結(jié)果:
?注意一點(diǎn)
在上傳文件時(shí)為什么要以.php后綴截?cái)嗟姆绞缴蟼鞫荒苤苯由蟼?shell,jpg 文件呢?反正結(jié)果后面的.php后綴最后都會(huì)被截?cái)嗟簟?/p>
因?yàn)檫@里的注入形式中由于請(qǐng)求文件被截?cái)鄷r(shí)空格被保留,所以請(qǐng)求文件的后綴名中一定會(huì)包含空格,否則會(huì)出現(xiàn)找不到文件的情況,因此我們?cè)谏蟼魑募r(shí)就要以 .php 后綴被截?cái)嗟姆绞絹?lái)進(jìn)行上傳以來(lái)保留空格。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-432815.html
6. 漏洞修復(fù)
將Nginx升級(jí)到1.5.7之后文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-432815.html
到了這里,關(guān)于中間件漏洞(一)CVE-2013-4547(文件名邏輯漏洞)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!