前言
Apache在2.4.0-2.4.29版本中存在一個解析漏洞。程序在解析PHP時,如果文件名最后有一個換行符x0A
,apache依然會將其當成php解析,但是在上傳文件時可以成功的繞過黑名單。
如果上傳文件的php程序是設置的白名單,那么這個漏洞將無法利用。
漏洞環境
該環境使用vulhub搭建,該漏洞路徑為 vulhub/httpd/CVE-2017-15715
。進入該漏洞路徑后執行以下命令:
docker-compose up -d
-d 表示后台運行。
注意:該命令必須在漏洞目錄下執行,該命令是啟動當前目錄下的docker容器。
如果不會搭建環境可以參考官方文檔:https://vulhub.org/#/docs/
原理分析
啟動容器后執行以下命令查看容器ID。
docker ps
然后執行以下命令進入容器。
docker exec -it 容器ID /bin/bash
exec 表示在容器中執行一個命令,該命令后加容器ID和要執行命令,上面執行的命令就是/bin/bash。
-i 表示即使沒有連接,也要保持STDIN打開,也就是一直監聽命令的狀態。
-t 表示分配一個tty終端設備,加上這個參數就具有按TAB自動補全命令等等功能。
更多詳細內容可以參考:https://blog.csdn.net/qq_40081976/article/details/84590119,docker exec 的使用-it操作。
查看一下上傳文件的php文件:
cat index.php
該程序是采用黑名單的形式,如果文件后綴名不在名單內即可上傳,所以 a.php\x0A
不在黑名單列表中,可以上傳。但是x0A
是換行符,所以apache會直接忽略,將其當成php來執行。
漏洞復現
打開目標地址 http://192.168.119.131:8080/
,選擇一句話木馬准備上傳。
然后打開burpsuite,開啟數據監聽。
點擊網頁中提交按鈕,上傳文件。此時burpsuite就會抓取提交的數據。
點擊 Hex
按鈕,進入十六進制編輯頁面,並找到文件名a.php
的位置。
然后再文件名后插入0A
,這個位置也就是在 od oa
的前面。
然后點擊 Forward
按鈕,這時候瀏覽器上什么也沒有顯示,但是此時文件已經上傳成功了。接下來訪問一句話木馬a.php%0a
,並通過參數a傳遞命令即可控制服務器。
http://192.168.119.131:8080/a.php%0A?a=id
注意:該文件名是通過
$_POST['name']
獲取的,所以會將x0A
保留。如果文件名使用的是$_FILES['file']['name']
獲取將會自動把末尾的x0A
去掉,導致無法利用該漏洞。