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


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

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

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

 

參考鏈接:

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM