作者: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:

總結

研究這個漏洞的過程中遇到幾個問題:

  1. 獲取文件名時不能用$_FILES['file']['name'],因為他會自動把換行去掉,這一點有點雞肋
  2. 默認的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后綴的文件,多一個換行也不行。

漏洞本身其實沒啥意思,但是$這個原理,以后應該還會有更多用處。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/556/