前言
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去掉,導致無法利用該漏洞。
