一、概述
目錄結構
默認情況下,網站主目錄是在該文件下的html
文件中,但是這里使用小皮進行搭建,根目錄重新設置了,可以在\nginx\conf\nginx.conf
文件中查看
版本查看
Linux下
二、Nginx漏洞分析及復現
1、文件解析漏洞
文件上傳,繞過
0x01 概述
該漏洞是由於Nginx
中php
配置不當而造成的,與Nginx
版本無關,但在高版本的php
中,由於security.limit_extensions
的引入,使得該漏洞難以被成功利用。
在已經上傳了惡意1.jpg文件后,訪問/1.jpg/xxx.php,(路徑修復
cgi.fix_pathinfo=1
后)使得Nginx將其解析為php文件傳給php-cgi程序(傳給路徑位於_SERVER["SCRIPT_FILENAME"]
,修復去除路徑位於_SERVER["PATH_INFO"]
),但cgi程序將其解析為1.jpg並執行。
0x02 環境搭建
使用Win7
和phpstudy
進行搭建復現環境,下載安裝即可,切換版本為
// Nginx版本
C:\phpStudy\PHPTutorial\nginx>nginx -v
nginx version: nginx/1.11.5
IP
為192.168.112.139
0x03 復現操作
1)創建1.jpg
文件
<?php
phpinfo();
?>
2)網站訪問該文件
http://192.168.112.139/1.jpg
3)修改訪問URI
http://192.168.112.139/1.jpg/xxx.php
成功解析
0x04 漏洞原理分析
Nginx的處理程序和FastCGI處理程序不同導致
Nginx
拿到URI
為/1.jpg/xxx.php
后,識別處后綴是.php
,認為是php文件
,轉交給PHP FastCGI處理程序
去處理。PHP FastCGI處理程序
識別該URI
: /1.jpg/xxx.php
不存在,按照PHP FastCGI處理程序
自己的規則,刪去最后的/xxx.php
,又看/1.jpg
存在,就將/1.jpg
當成要執行的文件,就成功解析。
Nginx
傳送給PHP FastCGI處理程序
的路徑可以在phpinfo
中查看【傳送路徑查看】
cgi.fix_pathinfo
為php中的一個選項,默認開啟為1,作用為修理路徑,也就是對路徑URI
的處理規則
當php遇到文件路勁為/1.jpg/xxx.php/ss.001
時,該文件不存在,會刪除最后的/ss.001
,再判斷/1.jpg/xxx.php
是否存在,若存在則將/1.jpg/xxx.php
當作/1.jpg/xxx.php/ss.001
文件,若不存在,則繼續刪除最后一個路徑。刪除的多余路徑會存在PATH_INFO
中,在這里為ss.001
0x05 參考
備注:高版本的情況還沒復現,高版本PHP提供
security.limit_extensions
參數,不允許將jpg文件當作php解析IIS在這一點和Nginx是一樣的,同樣存在這一問題
2、目錄遍歷漏洞
0x01 概述
也是類似解析漏洞,是nginx
配置問題導致的
0x02 環境搭建
同文件解析漏洞環境
0x03 復現操作
1)在網站根目錄下創建一個文件夾test
2)訪問該文件夾
回顯403
3)修改nginx.conf
配置文件,訪問即可
將autoindex off
改為autoindex on
0x04 參考
https://www.cnblogs.com/yuzly/p/11208842.html
3、空字節代碼執行漏洞
0x01 概述
在使用PHP-FastCGI執行php的時候,URL里面在遇到%00空字節時與FastCGI處理不一致,導致可在非php文件中嵌入php代碼,通過訪問url+%00.php來執行其中的php代碼。如:http://local/robots.txt.php會把robots.txt文件當作php來執行。
影響版本:
nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37
一般需要配合文件上傳進行
0x02 復現操作
復現環境信息:
ip:192.168.112.140
Nginx:0.7.65
php:5.3.2
1)開啟Nginx
2)在網站目錄下添加1.jpg
文件
3)訪問該文件
4)抓包,添加%00
這里由於該圖非正常,在抓包時最后面添加..
,可以讓burpsuite
抓到
將請求修改為:
/1.jpg..php
5)發包即可
4、CRLF注入漏洞
0x01 概述
漏洞成因:Nginx
將傳入的url
進行解碼,對其中的%0a%0d
替換成換行符,導致后面的數據注入至頭部,造成CRLF注入漏洞
。
環境:
Nginx
php5.2.17
0x02 復現操作
1)設置
設置https跳轉,這樣就可以接收到url
,進而進行處理。在C:\phpStudy\PHPTutorial\nginx\conf\nginx.conf
文件中添加下面一行話。
location / {
return 302 https://$host$uri;
}
2)構造url
,訪問
http://192.168.1121.140/%0ASet-cookie:JSPSESSID%3D3
抓包發送
3)惡意利用
%0D%0A%0D%0A%3cscript%3ealert(123)%3c%2fscript%3e
不過這里沒有彈窗成功,有相關函數進行了過濾
參考:
https://www.leavesongs.com/PENETRATION/bottle-crlf-cve-2016-9964.html
https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injection.html
5、文件名邏輯漏洞(CVE-2013-4547)
繞過訪問限制(目錄跨越)、代碼執行
0x01 概述
這一漏洞的原理是非法字符空格和截止符(\0)會導致Nginx解析URI時的有限狀態機混亂,此漏洞可導致目錄跨越及代碼執行,其影響版本為:nginx 0.8.41 – 1.5.6
環境:
此次實驗在vulhub中復現
0x02 復現操作
1)創建1.jpg
文件,並上傳
抓包,在該文件最后添加一個空格
可以看到上傳成功
2)訪問該文件,burpbuite抓包處理
訪問URL:http://192.168.112.111/1.jpg...php
在burp的hex頁面中將第一個點.
改成20
,第二個改為00
發送即可
參考:
CVE-2013-4547 Nginx解析漏洞深入利用及分析_91Ri.org
14.Nginx 文件名邏輯漏洞(CVE-2013-4547) - bmjoker - 博客園 (cnblogs.com)
0x03 解析漏洞小結
這篇文章中介紹了三個解析漏洞
文件解析漏洞 配置問題
%00解析漏洞 nginx 0.5、0.6、<0.7.65、<0.8.37
空格和截止符解析漏洞 nginx 0.8.41 – 1.5.6
參考:文件解析漏洞總結-Nginx | 若水齋 (werner.wiki)
6、整數溢出漏洞(CVE-2017-7529)
0x01 概述
在 Nginx 的 range filter 中存在整數溢出漏洞,可以通過帶有特殊構造的 range 的 HTTP 頭的惡意請求引發這個整數溢出漏洞,並導致信息泄露。
影響程度:
攻擊成本:低
危害程度:低
影響范圍:Nginx 0.5.6 – 1.13.2
參考: