Apache解析漏洞復現(CVE-2017-15715),可以繞過黑名單


 
照着P神的文章准備復現一下(總結一下經驗)

 

環境的安裝

 
這里面直接使用的vulhub里面的環境來進行安裝的(為了方便嗎)

 
基礎環境如下
 

實際上Apache版本在2.4.0~2.4.29即可

 
index.php文件內容
 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<form action="" method="post" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="text" name="name">
  <input type="submit" value="submit">
</form>

<?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);
}?>
</body>

可以看到進行了黑名單處理
 

正常的php后綴會被攔截

嘗試上傳未知的后綴名,但是不能解析(apache老的解析漏洞不存在)

利用burp的十六進制功能來插入oa(其實也就是換行符,因為\n的十六進制就是0a)

明顯的多個換行

 

 
在服務器上生成了對於的文件

訪問http://ip:port/xxxx.php%0a即可Getshell
 

漏洞原理

其實就是正則的一個坑,在默認的Apache的配置里面,判斷是否解析為php文件是使用正則來匹配的(php|php4|phtml)$,而這個\(符號不僅僅是可以匹配行尾,還可以匹配一個換行(因此我們上傳的帶有換行的文件就會被解析,但是\)_FILES['xxx']['name']會默認的將換行給去掉,因此就顯得有些雞肋了,當然P神也說了,$這個思想是值得學習的)
 

后記

這里面特地的使用POST發送用戶名(因為使用$_FILES['xxx']['name']會將我們添加的換行給去掉)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM