作者:Phith0n
作者博客:https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html
我在代碼審計知識星球里提到了Apache最新的一個解析漏洞(CVE-2017-15715):

除了帖子中說到的利用方法,我們還可以利用這個漏洞來繞過上傳黑名單限制。
目標環境
比如,目標存在一個上傳的邏輯:
<?php
if(isset($_FILES['file'])) {
$name = basename($_POST['name']);
$ext = pathinfo($name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
}
可見,這里用到了黑名單,如果發現后綴在黑名單中,則進行攔截。
然后,我們用docker啟動一個默認的Apache PHP(Apache版本在2.4.0到2.4.29即可):
docker run -d -p 8080:80 --name apache php:5.5-apache
將上述代碼放置在容器內的/var/www/html目錄下,設置好寫權限,即可進行測試。
繞過黑名單getshell
正常上傳php文件,被攔截:

可以上傳1.php.xxx,但是不解析,說明老的Apache解析漏洞不存在:

我們利用CVE-2017-15715,上傳一個包含換行符的文件。注意,只能是\x0A,不能是\x0D\x0A,所以我們用hex功能在1.php后面添加一個\x0A:

然后訪問/1.php%0A,即可發現已經成功getshell:

總結
研究這個漏洞的過程中遇到幾個問題:
- 獲取文件名時不能用
$_FILES['file']['name'],因為他會自動把換行去掉,這一點有點雞肋 - 默認的Apache配置即可利用,因為默認Apache配置就使用了
<FileMatch>:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
所以理論上,只要用正則來匹配后綴進行php解析的Apache就有這個問題。而這個做法剛好是為了解決Apache老的解析漏洞而做的,可謂非此即彼,必然存在一種解析漏洞。
延伸一下,其他環境是不是可能出現同樣的問題?比如nginx + php,我進行了測試,發現結果卻有些區別:

如上圖,成功上傳后,訪問卻出現Access denied錯誤。
這也是我預想的結果,因為我在《Fastcgi協議分析 && PHP-FPM未授權訪問漏洞 && Exp編寫》已經提到過,fpm存在一個security.limit_extensions配置,默認只解析php后綴的文件,多一個換行也不行。
漏洞本身其實沒啥意思,但是$這個原理,以后應該還會有更多用處。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/556/
暫無評論