一、概述
目錄結構

默認情況下,網站主目錄是在該文件下的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
參考:
