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

因爲博主在滲透網站時發現如今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應用在處理上傳文件

時,都會將文件重命名,經過應用自身添加後綴,或者對後綴名去掉特殊字符後,作類型判斷。

以上因素都致使此漏洞被認爲是雞肋漏洞,難以利用,而被人們所忽略

 

參考連接:

http://www.91ri.org/9064.html

https://blog.werner.wiki/file-resolution-vulnerability-nginx/

相關文章
相關標籤/搜索