由於博主在滲透網站時發現現在Nginx搭建的網站是越來越多
所以對Nginx的漏洞來一個全面性的復習,本次從Nginx較早的漏洞開始分析。
2013年底,nginx再次爆出漏洞(CVE-2013-4547),此漏洞可導致目錄跨越及代碼執行,
其影響版本為: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7,范圍較廣。
漏洞說明
這個漏洞其實和代碼執行沒有太大關系,其主要原因是錯誤地解析了請求的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$,
可以進入這個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/