因爲博主在滲透網站時發現如今Nginx搭建的網站是愈來愈多php
因此對Nginx的漏洞來一個全面性的複習,本次從Nginx較早的漏洞開始分析。html
2013年末,nginx再次爆出漏洞(CVE-2013-4547),此漏洞可致使目錄跨越及代碼執行,linux
其影響版本爲: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7,範圍較廣。nginx
漏洞說明web
這個漏洞其實和代碼執行沒有太大關係,其主要緣由是錯誤地解析了請求的URI,服務器
錯誤地獲取到用戶請求的文件名,致使出現權限繞過、代碼執行的連帶影響。測試
舉個例子,好比,Nginx匹配到.php結尾的請求,就發送給fastcgi進行解析,常見的寫法以下:網站
location ~ \.php$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT /var/www/html; }
正常狀況下(關閉pathinfo的狀況下),只有.php後綴的文件纔會被髮送給fastcgi解析。而存在編碼
CVE-2013-4547的狀況下,咱們請求 1.gif[0x20][0x00].php ,這個URI能夠匹配上正則 \.php$,spa
能夠進入這個Location塊;但進入後,因爲fastcgi在查找文件時被\0截斷,Nginx卻錯誤地認爲
請求的文件是1.gif[0x20],就設置其爲SCRIPT_FILENAME的值發送給fastcgi。
fastcgi根據SCRIPT_FILENAME的值進行解析,最後形成了解析漏洞。
因此,咱們只須要上傳一個空格結尾的文件,便可使PHP解析之。
再舉個例子,好比不少網站限制了容許訪問後臺的IP:
location /admin/ { allow 127.0.0.1; deny all; }
咱們能夠請求以下URI:/test[0x20]/../admin/index.php,這個URI不會匹配上location後面的/admin/,
也就繞過了其中的IP驗證;但最後請求的是 /test[0x20]/../admin/index.php 文件,也就是/admin/index.php,
成功訪問到後臺。(這個前提是須要有一個目錄叫test:這是Linux系統的特色,若是有一個不存在的目錄,
則即便跳轉到上一層,也會爆文件不存在的錯誤,Windows下沒有這個限制)
簡單來講就是咱們構造:http://127.0.0.1/test.aaa \0bbb
讓Nginx認爲文件「file.aaa 」的後綴爲「.bbb」。
咱們在本地搭建一個nginx搭建的上傳頁面:
這個環境是黑名單驗證,咱們沒法上傳php後綴的文件:
須要利用CVE-2013-4547。咱們上傳一個test.gif,裏面的內容仍是<?php phpinfo();?>,注意後面的空格:
發現上傳成功,接下來須要構造咱們 test.gif[0x20][0x00].php 來形成Nginx解析漏洞,使咱們的test.gif被
解析成php,訪問 http://192.168.0.132:8080/uploadfiles/test.gif .php,在burp抓取的數據包中把 test.gif
後面的兩個空格 [0x20][0x20] ---> [0x20][0x00] ,而後repeater發包可發現PHP已被解析:
注意,[0x20]是空格,[0x00]是\0,這兩個字符都不須要編碼。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CVE-2013-4547還能夠用於繞過訪問限制,雖然和文件解析漏洞無關,但也記錄在這裏。
首先在網站根目錄下新建一個目錄,命名爲privited,在目錄privated中新建文件test.php,內容隨意。
而後在Nginx的配置文件中寫上:
location /privated/ { deny all; }
以禁止該目錄的訪問。接着在網站根目錄下新建一個目錄,名爲 「bmjoker 」,目錄名的最後一個字符是空格,
該目錄用於觸發漏洞。最後來進行驗證,直接訪問:
http://127.0.0.1/privated/test.php
返回 「403 Forbidden」 。利用漏洞訪問:
http://127.0.0.1/bmjoker /../privated/test.php
成功訪問到文件 test.php 。注意URL中的空格,不要將空格編碼。
爲成功利用漏洞,咱們在測試中準備了名字以空格結尾的文件和目錄,這是由於在linux中,文件名是能夠以空格結尾的。若不許備這樣的文件,漏洞能夠成功觸發,但結果倒是404,找不到相似「test.jpg 」這樣的文件。而在Windows中,文件名不能以空格結尾,因此Windows程序遇到文件名「test.jpg 」會自動去掉最後的空格,等同於訪問「test.jpg」,基於這樣的緣由,這一漏洞在Windows中會很容易利用。
結語:
由此可知,常規利用中若是想觸發代碼執行,條件爲可上傳帶空格的文件到服務器,
而且服務器存儲的時候也須要保留空格,而大多數狀況下,web應用在處理上傳文件
時,都會將文件重命名,經過應用自身添加後綴,或者對後綴名去掉特殊字符後,作類型判斷。
以上因素都致使此漏洞被認爲是雞肋漏洞,難以利用,而被人們所忽略
參考連接:
https://blog.werner.wiki/file-resolution-vulnerability-nginx/