Nginx 錯誤配置如果不能及時修正,它會讓你的網(wǎng)站陷入網(wǎng)絡(luò)攻擊的風(fēng)險。 作為互聯(lián)網(wǎng)上最常用的 Web 服務(wù)器之一,Nginx 因輕巧、模塊化并且有對用戶友好的配置格式而廣受歡迎。Detectify 使用 Google BigQuery 分析了從 GitHub 下載的近 50000 個不重復(fù)的 Nginx 配置文件。 本文主要關(guān)注以下常見的 Nginx 錯誤配置:
server { root /etc/nginx;
location /hello.txt { try_files $uri $uri/ =404; proxy_pass http://127.0.0.1:8080/; } } root 指令指定 Nginx 的根文件夾。在上面的示例中,根文件夾是 像 在我們收集的近 50000 個 Nginx 配置文件中,最常見的根路徑如下: 經(jīng)常配置錯誤的 Nginx 根路徑
這個配置錯誤指的是由于缺少一個斜杠,所以有可能沿路徑上移一步。OrangeTsai 在 Blackhat 演講“Breaking Parser Logic!”中讓這項技術(shù)廣為人知。 https://i./us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf 在這個演講中,他展示了如何結(jié)合一條缺少尾斜杠的 location /api { proxy_pass http://apiserver/v1/; } 如果一個 Nginx 服務(wù)器運行能在 server 訪問的以下配置,則可以假定訪問者只能訪問 http://server/api/user -> http://apiserver/v1//user 當(dāng)請求 然后,服務(wù)器從 URL 中刪除該前綴,保留 請注意,這個 URL 中存在雙斜杠,因為 location 指令不以單斜杠結(jié)尾,并且 Nginx 服務(wù)器配置錯誤的一個跡象是,當(dāng) URL 中的一個斜杠被刪除時,服務(wù)器仍會返回相同的響應(yīng)。例如,如果 http://server/api/user -> http://apiserver/v1//user http://server/apiuser -> http://apiserver/v1/user 一些框架、腳本和 Nginx 配置會不安全地使用 Nginx 存儲的變量。這可能會導(dǎo)致諸如 XSS、繞過 HttpOnly 保護(hù)、信息泄露,甚至在某些情況下的 RCE 之類的問題。 像下面這樣的配置: location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; } 主要問題是 Nginx 會將所有 URL 發(fā)送到以 https://www./resources/wiki/start/topics/tutorials/config_pitfalls/#passing-uncontrolled-requests-to-php?fileGuid=xVX6hcx8WXCYPVGd 如果這個 PHP 腳本試圖基于 <?php
if(basename($_SERVER['SCRIPT_NAME']) == basename($_SERVER['SCRIPT_FILENAME'])) echo dirname($_SERVER['SCRIPT_NAME']);
?>
GET /index.php/<script>alert(1)</script>/index.php SCRIPT_NAME = /index.php/<script>alert(1)</script>/index.php 與 Nginx 變量有關(guān)的另一個錯誤配置是使用 一個易受攻擊的 Nginx 配置的示例如下: location / {return 302 https://$uri;} HTTP 請求的換行符為\r(回車)和\n(換行)。對換行符進(jìn)行 URL 編碼將導(dǎo)致以下字符表示形式 HTTP/1.1 302 Moved Temporarily Server: nginx/1.19.3 Content-Type: text/html Content-Length: 145 Connection: keep-alive Location: https:/// Detectify: clrf 在某些情況下,用戶提供的數(shù)據(jù)可以視為 Nginx 變量。目前尚不清楚為什么會發(fā)生這種情況,但如這份 H1 報告所示,這種情況并不罕見或不容易測試。如果搜索錯誤消息,我們可以看到它是在 SSI 過濾器模塊中找到的,表明這是由 SSI 引起的。 https:///reports/370094?fileGuid=xVX6hcx8WXCYPVGd 一種測試方法是設(shè)置一個引用標(biāo)頭值: $ curl -H 'Referer: bar’ http://localhost/foo$http_referer | grep 'foobar’ 我們掃描了這種錯誤配置,發(fā)現(xiàn)了幾個實例,用戶可以在其中打印 Nginx 變量的值。我們發(fā)現(xiàn)易受攻擊實例的數(shù)量有所下降,這可能表明這個漏洞已經(jīng)做了修補。 使用 Nginx 的 如果一個客戶端向 Nginx 發(fā)送了一個無效的 HTTP 請求,則該請求將按原樣轉(zhuǎn)發(fā)到后端,后端將使用其原始內(nèi)容來應(yīng)答。然后,Nginx 將無法理解無效的 HTTP 響應(yīng),而將其轉(zhuǎn)發(fā)給客戶端。想象一個這樣的 uWSGI 應(yīng)用程序: def application(environ, start_response): start_response('500 Error', [('Content-Type', 'text/html'),('Secret-Header','secret-info')]) return [b'Secret info, should not be visible!'] 并在 Nginx 中使用以下指令: http { error_page 500 /html/error.html; proxy_intercept_errors on; proxy_hide_header Secret-Header;} 如果后端的響應(yīng)狀態(tài)大于 300,proxy_intercept_errors 將提供一個自定義響應(yīng)。在上面的 uWSGI 應(yīng)用程序中,我們將發(fā)送一個 proxy_hide_header 可以自解釋;它將從客戶端隱藏任何指定的 HTTP 標(biāo)頭。 如果我們發(fā)送一個普通的 GET 請求,則 Nginx 將返回: HTTP/1.1 500 Internal Server Error Server: nginx/1.10.3 Content-Type: text/html Content-Length: 34 Connection: close 但是,如果我們發(fā)送一個無效的 HTTP 請求,例如: GET /? XTTP/1.1Host: 127.0.0.1Connection: close 我們將收到以下答復(fù): XTTP/1.1 500 Error Content-Type: text/html Secret-Header: secret-info Secret info, should not be visible! 默認(rèn)情況下,merge_slashes 指令設(shè)置為“on”,這是一種將兩個或多個正斜杠壓縮為一個的機(jī)制,因此 http:///en/docs/http/ngx_http_core_module.html#merge_slashes?fileGuid=xVX6hcx8WXCYPVGd 我們發(fā)現(xiàn) 33 個 Nginx 配置文件的 我們創(chuàng)建了一個 GitHub 存儲庫,你可以在其中使用 Docker 來設(shè)置你自己的易受攻擊的 Nginx 測試服務(wù)器,以及本文中討論的一些錯誤配置,然后嘗試自己找到它們。 https://github.com/detectify/vulnerable-nginx?fileGuid=xVX6hcx8WXCYPVGd Nginx 是一個非常強(qiáng)大的 Web 服務(wù)器平臺,很好理解為什么它會被廣泛使用。但是,靈活的配置意味著你更容易犯錯誤,而這些錯誤可能會對安全性產(chǎn)生影響。請不要使用這些常見的錯誤配置,以免攻擊者輕易地入侵你的網(wǎng)站。 原文鏈接: https://blog./2020/11/10/common-nginx-misconfigurations/?fileGuid=xVX6hcx8WXCYPVGd |
|