Nginx 配置錯誤導致的漏洞

目錄

1. CRLF注入漏洞

?Bottle HTTP頭注入漏洞

2.目錄穿越漏洞

3. http add_header被覆蓋


本篇要復現的漏洞實驗有一個網站直接為我們提供了Docker的環境,我們只需要下載下來就可以使用:

Docker環境的安裝可以參考:Docker安裝

漏洞環境的搭建具體步驟如下:
(1)首先我們需要下載環境的源碼:

https://github.com/vulhub/vulhub/archive/master.zip

(2)將下載的源碼上傳到centos環境中

(3)然后進入/root/vulhub-master/nginx目錄中,這就是該文件為我們提供的有關nginx的一些漏洞環境

(4)然后我們就可以移動到對應的環境中使用一下命令來拉取環境

docker compose up -d

然后就可以正常使用了?

1. CRLF注入漏洞

CRLF注入漏洞,也叫做HTTP頭部注入漏洞

在HTTP頭部每一行的結尾都會有一個 \r \n

下面兩種情景十分常見:

用戶訪問http://example.com/aabbcc,自動跳轉到https://example.com/aabbcc (自動將http->https)

用戶訪問http://example.com/aabbcc,自動跳轉到http://www.example.com/aabbcc(自動增加一級域名)

第二個場景主要是為了統一用戶訪問的域名,更加有益于SEO優化。

在跳轉的過程中,我們需要保證用戶訪問的頁面不變,所以需要從Nginx獲取用戶請求的文件路徑。

查看Nginx文檔,可以發現有三個表示uri的變量:

$uri

$document_uri

$request_uri

1和2表示的是解碼以后的請求路徑,不帶參數;3表示的是完整的URI(沒有解碼)。

錯誤的配置文件示例(原本的目的是為了讓http的請求跳轉到https上):

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

#因為$uri是解碼以后的請求路徑,所以就會包含換行符,就有可能造成CRLF漏洞 這個CRLF注入漏洞,導致固定漏洞、設置cookie引發的csrf漏洞或者xss漏洞,其中,我們可以注入兩個\r \n即可控制HTTP體進行xss,但是因為瀏覽器會認為這是一個300跳轉,所以并不會顯示我們注入的內容

Payload: http://your-ip:8080/%0d%0aSet-Cookie:%20a=1,可注入Set-Cookie頭。

這種情況下,我們可以使用一些技巧:比如使用CSP頭來ifame的地址,這樣瀏覽器并不會跳轉,進而執行我們插入的HTML

下面我簡單的使用這個漏洞環境中的/root/vulhub-master/nginx/insecure-configuration環境來演示一下CRLF漏洞

(1)首先我們移動到對應的環境下

(2)使用docker compose up -d來拉取環境

[root@centos111 insecure-configuration]# docker compose up -d
[+] Running 1/1? Container insecure-configuration-nginx-1  Started 

注:拉取環境的前提是我們安裝了Docker

(3)可以使用dokcer ps 來查看一下容器是否運行:

可以看到正常的運行了?

(4)現在可以做一個簡單的測試,在shell中使用curl來嘗試在頭部增加一個%0d%0d,也就是\r\n,然后插入一條語句

curl -I http://127.0.0.1:8080/%0d%0aSet-cookie:%20a=1
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.13.0
Date: Fri, 24 Nov 2023 01:25:36 GMT
Content-Type: text/html
Content-Length: 161
Connection: keep-alive
Location: http://127.0.0.1:8080/
Set-cookie: a=1

可以看到我們利用%0d%0a成功的在頭部增加了一行Set-cookie:a=1?

(5)那么我們現在就可以使用Burpsuite來抓一個這個網頁的包,嘗試使用CRLF注入

在本機上打開BP軟件,開啟代理,然后打開本機的代理

我們可以構造一個反彈性xss的腳本插入到頭部中:

<script>alert(1)</script> 

可以看到我們成功的利用%0d%0a在頭部插入了script彈窗代碼,使用兩個%0d%0a的原因是因為第一個是讓我們來到新的一行,第二個換行是為了與頭部分割一行,否則就無法正常插入

下面用這樣一個案例來舉例Python中的一個CRLF漏洞

?Bottle HTTP頭注入漏洞

這時我們要運行的bottle_demo.py代碼

import bottle
from bottle import route,run, template,request,response
@route('/')
def index():path = request.query.set('path','http://www.xianoupeng.com')return bottle.redirect(path)if __name__ == '__main__':bottle.debug(True)run(host='localhost', port=8081)

?因為redirect函數是向response中插入一個HTTP頭,也就是Location: xxx,所以存在頭注入。

(1)我們運行這個python腳本,然后嘗試使用\r\n的方式進行彈窗

?但實際測試的過程中遇到了一個有趣的問題,看看redirect函數的實現:

def redirect(url, code=None):""" Aborts execution and causes a 303 or 302 redirect, depending onthe HTTP protocol version. """if not code:code = 303 if request.get('SERVER_PROTOCOL') == "HTTP/1.1" else 302res = response.copy(cls=HTTPResponse)res.status = coderes.body = ""res.set_header('Location', urljoin(request.url, url))raise res</pre>

其中使用了一個urljoin,將當前url和我傳入的path進行了一次"join",經過這個操作事情就變得很微妙了:Location頭一定有一個值。這種情況下,瀏覽器就不會渲染頁面,會直接跳轉到Location頭指向的地址。也就是說,如果我要利用CRLF構造XSS的話,這里是不會觸發的。

回想上面提到過的新浪的那個CRLF,那個漏洞的Location是可以為空的,如果瀏覽器發現Location為空就不會進行跳轉,進而渲染了后面注入的HTML,造成XSS。

(2)可以使用一下兩種方式來解決這個問題

方法1:將跳轉的url端口設為<80

http://localhost:8081/?path=www.oupeng.com:0%0d%0aX-XSS-Protection:0%0d%0a%0d%0a%3Cscript%3Ealert(location.href)%3C/script%3E

python中確實收到了請求?

但是頁面還是告訴我們無法訪問?

注:這種方法在現在的瀏覽器中無法正常實現,如果需要復現,需要降低瀏覽器的版本

方法2:使用CSP禁止iframe的跳轉

可以在運行Python腳本的前提下去在本地新建一個web.php代碼,通過訪問php文件使用iframe將httpL//localhost:8081頁面嵌入,從而實現彈窗。

php代碼:

<?php
header("Content-Security-Policy: frame-src http://localhost:8081/"); //這里設置了CSP
?>
<iframe src="http://localhost:8081/?path=http://www.baidu.com/%0a%0dX-XSS-Protection:0%0a%0d%0a%0d<script>alert(location.href)</script>"></iframe>

?通過嘗試發現Firefox可以彈窗,但是Chrome不能。

如果python代碼是這樣的則上面的兩種方式均可以實現

import bottle
from bottle import route,run, template,request,response@route('/')
def index():server = bottle.request.query.get('server')  # 接收Server參數bottle.response.add_header('Server', server)return bottle.responseif __name__ == '__main__':bottle.debug(True)bottle.run(host='localhost', port=8081)

總結一下,安全的做法應該為:

不安全:
location / {return 302 https://$host$uri; 
}
安全
location / {return 302 https://$host$request_uri;  //Request不會對%0d%0a解碼,所以無法換行
}

2.目錄穿越漏洞

這個常見于nginx做反向代理的情況,動態的部分被proxy_pass傳遞給后端端口,而靜態的文件需要nginx來處理。

假設靜態文件存儲在/home/目錄下,而該目錄在url中名字為files,那么就需要用alias設置目錄的別名:

Nginx在配置別名(Alias)的時候,如果忘記加/,將造成一個目錄穿越漏洞。

錯誤的配置文件示例(原本的目的是為了讓用戶訪問到/home/目錄下的文件):

location /files { #這里沒有 /alias /home/; #因為真正的文件在/home下,所以這里設置了別名/home/
}

此時我們的dokcer環境中的文件配置就是這樣的:

server {listen 8081;root /usr/share/nginx/html;index index.html;server_name _;autoindex on;location /files {alias /home/;}
}

此時訪問192.168.159.200:8081,就可以獲取到/files/help.txt文件

?但是我們注意到,url上/files沒有加后綴/ ,而alias設置的/home/是有后綴/ 的,這個 / 就導致我們可以從 /home/ 目錄穿越到它的上層目錄:

Payload: http://your-ip:8081/files../ 

此時我們就可以看到我們可以移動到/目錄下,這時就會出現任意文件下載的危險漏洞

解決方案:必須保證location和alias的值都有后綴/ 或者都沒有這個后綴

我們修改配置文件為:

server {listen 8081;root /usr/share/nginx/html;index index.html;server_name _;autoindex on;location /files/ {alias /home/;}
}

重啟docker:

docker restart 你的鏡像編號

?然后再次嘗試路徑穿越訪問:

可以看到已經無法完成路徑穿越了。

3. http add_header被覆蓋

CSP:(Content-Security-Policy) 可以防御xss注入

Nginx配置文件子塊(server、location、if)中的add_header,將會覆蓋父塊中的add_header添加的HTTP頭,造成一些安全隱患。

如下列代碼,整站(父塊中)添加了CSP頭:

server{
add_header Content-Security-Policy "default-src 'self'"; #default-src用來設置上面各個選項的默認值。
#上面代碼限制所有的外部資源,都只能從當前域名加載。
?
add_header X-Frame-Options DENY;
//這里會覆蓋父類的CSP,CSP就失效了
location = /test1 {rewrite ^(.*)$ /xss.html break;
}
?
?
location = /test2 {add_header X-Content-Type-Options nosniff;rewrite ^(.*)$ /xss.html break;
}
#這里的location會將前面的location覆蓋
}

/test2的location中又添加了X-Content-Type-Options頭,導致父塊中的add_header全部失效,

所以XSS可以被觸發:

可以看到我輸入的js代碼中的標簽被瀏覽器轉義,這里并沒有成功,那么可以嘗試在低版本的瀏覽器中測試一下:

可以看到,在低版本中我們是可以利用這個錯誤配置正常彈窗的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166472.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166472.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166472.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker rm 命令

docker rm&#xff1a;刪除一個或多個容器。 語法&#xff1a; docker rm [OPTIONS] CONTAINER [CONTAINER...]OPTIONS說明&#xff1a; -f&#xff1a;通過SIGKILL信號強制刪除一個運行中的容器。 -l &#xff1a;移除容器間的網絡連接&#xff0c;而非容器本身。 -v &…

2023亞太杯數學建模A題思路代碼分析

已經完成A題完整思路代碼&#xff0c;文末名片查看獲取 A題就是我們機器學習中的一個圖像識別&#xff0c;他是水果圖像識別&#xff0c;就是蘋果識別的一個問題&#xff0c;我們用到的方法基本是使用深度學習中的卷積神經網絡來進行識別和分類 問題一&#xff1a;基于附件1中…

展現天津援疆工作成果 “團結村里看振興”媒體采風團走進和田

央廣網天津11月19日消息(記者周思楊)11月18日&#xff0c;由媒體記者、書法和攝影家、旅行社企業代表等40余人組成的“團結村里看振興”媒體采風團走進新疆和田。在接下來的一周時間里&#xff0c;采風團將走訪天津援疆和田地區策勒縣、于田縣、民豐縣鄉村振興示范村&#xff0…

HTML CSS登錄網頁設計

一、效果圖: 二、HTML代碼: <!DOCTYPE html> <!-- 定義HTML5文檔 --> <html lang="en"> …

在全球碳市場中嶄露頭角的中碳CCNG

在全球氣候治理的大背景下&#xff0c;中國碳中和發展集團有限公司&#xff08;簡稱中國碳中和&#xff09;正在成為全球碳交易市場的一個重要參與者。隨著國際社會對碳排放的日益關注&#xff0c;中國碳中和憑借其在碳資產開發、咨詢與管理等領域的深厚積累&#xff0c;正成為…

acedInitGet 函數

acedInitGet 函數是 AutoCAD 的 C++ API(ObjectARX)中用于初始化下一次用戶輸入操作選項的函數。以下是該函數簽名及其組成部分的中文翻譯和解釋: extern "C" int acedInitGet(int val,const ACHAR * kwl );cpp 復制 extern “C”:指定函數使用 C 語言鏈接(lin…

LeetCode93. Restore IP Addresses

文章目錄 一、題目二、題解 一、題目 A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0 and 255 (inclusive) and cannot have leading zeros. For example, “0.1.2.201” and “192.168.1.1” are valid IP add…

視頻剪輯新招:批量隨機分割,分享精彩瞬間

隨著社交媒體的普及&#xff0c;短視頻已經成為分享生活、交流信息的重要方式。為制作出吸引的短視頻&#xff0c;許多創作者都投入了大量的時間和精力進行剪輯。然而&#xff0c;對于一些沒有剪輯經驗的新手來說&#xff0c;這個過程可能會非常繁瑣。現在一起來看云炫AI智剪批…

楊傳輝:從一體化架構,到一體化產品,為關鍵業務負載打造一體化數據庫

在剛剛結束的年度發布會上&#xff0c;OceanBase正式推出一體化數據庫的首個長期支持版本 4.2.1 LTS&#xff0c;這是面向 OLTP 核心場景的全功能里程碑版本&#xff0c;相比上一個 3.2.4 LTS 版本&#xff0c;新版本能力全面提升&#xff0c;適應場景更加豐富&#xff0c;有更…

web前端之若依框架圖標對照表、node獲取文件夾中的文件名,并通過數組返回文件名、在html文件中引入.svg文件、require、icon

MENU 前言效果圖htmlJavaScripstylenode獲取文件夾中的文件名 前言 需要把若依原有的icon的svg文件拿到哦&#xff01; 注意看生成svg的路徑。 效果圖 html <div id"idSvg" class"svg_box"></div>JavaScrip let listSvg [404, bug, build, …

02 如何快速讀懂一個C++程序

系列文章目錄 02 如何快速讀懂一個C程序 目錄 系列文章目錄 文章目錄 前言 一、C 的基本語法 二、如何看懂一個c程序&#xff1f; 1.了解程序結構 2.C 中的分號 & 語句塊 3.C 注釋 總結 前言 C 是一種高級編程語言&#xff0c;它具有豐富的特性&#xff0c;用于…

CentOS7安裝Docker運行環境

1 引言 Docker 是一個用于開發&#xff0c;交付和運行應用程序的開放平臺。Docker 使您能夠將應用程序與基礎架構分開&#xff0c;從而可以快速交付軟件。借助 Docker&#xff0c;您可以與管理應用程序相同的方式來管理基礎架構。通過利用 Docker 的方法來快速交付&#xff0c;…

11.前綴和、異或前綴和、差分數組練習題

前綴和 前綴和可以用來求滿足條件的子數組的和、個數、長度 更多前綴和題目&#xff1a; 560. 和為 K 的子數組 974. 和可被 K 整除的子數組 1590. 使數組和能被 P 整除 523. 連續的子數組和 525. 連續數組 560. 和為 K 的子數組 中等 給你一個整數數組 nums 和一個整數…

在新疆烏魯木齊的汽車托運

在新疆烏魯木齊要托運的寶! 看過來了 找汽車托運公司了 連夜吐血給你們整理了攻略!! ??以下&#xff1a; 1 網上搜索 可以在搜索引擎或專業的貨運平臺上搜索相關的汽車托運公司信息。在網站上可以了解到公司的服務范圍、托運價格、運輸時效等信息&#xff0c;也可以參考其他車…

2024年的云趨勢:云計算的前景如何?

本文討論了2024年云計算的發展趨勢。 適應復雜的生態系統、提供實時功能、優先考慮安全性和確保可持續性的需求正在引領云計算之船。多樣化的工作負載允許探索通用的公共云基礎設施范例之外的選項。由于需要降低成本、提高靈活性和降低風險&#xff0c;混合云和多云系統越來越受…

RabbitMQ 消息隊列編程

安裝與配置 安裝 RabbitMQ 讀者可以在 RabbitMQ 官方文檔中找到完整的安裝教程&#xff1a;Downloading and Installing RabbitMQ — RabbitMQ 本文使用 Docker 的方式部署。 RabbitMQ 社區鏡像列表&#xff1a;https://hub.docker.com/_/rabbitmq 創建目錄用于映射存儲卷…

YOLOv5 分類模型 預處理 OpenCV實現

YOLOv5 分類模型 預處理 OpenCV實現 flyfish YOLOv5 分類模型 預處理 PIL 實現 YOLOv5 分類模型 OpenCV和PIL兩者實現預處理的差異 YOLOv5 分類模型 數據集加載 1 樣本處理 YOLOv5 分類模型 數據集加載 2 切片處理 YOLOv5 分類模型 數據集加載 3 自定義類別 YOLOv5 分類模型…

Bin、Hex、ELF、AXF的區別

1.Bin Bin文件是最純粹的二進制機器代碼, 或者說是"順序格式"。按照assembly code順序翻譯成binary machine code&#xff0c;內部沒有地址標記。Bin是直接的內存映象表示&#xff0c;二進制文件大小即為文件所包含的數據的實際大小。 BIN文件就是直接的二進制文件&…

關于python 語音轉字幕,字幕轉語音大雜燴

文字轉語音 Python語音合成之第三方庫gTTs/pyttsx3/speech橫評(內附使用方法)_python_腳本之家 代碼示例 from gtts import gTTStts gTTS(你好你在哪兒&#xff01;,langzh-CN)tts.save(hello.mp3)import pyttsx3engine pyttsx3.init() #創建對象"""語速"…

目前比較好用的護眼臺燈,小學生適合的護眼臺燈推薦

隨著技術的發展&#xff0c;燈光早已成為每家每戶都需要的東西。但是燈光不好可能會對眼睛造成傷害是很多人沒有注意到的。現在隨著護眼燈產品越來越多&#xff0c;市場上臺燈的選擇越來越多樣化&#xff0c;如何選擇一個對眼睛無傷害、無輻射的臺燈成為許多家長首先要考慮的問…