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']会将我们添加的换行给去掉)

posted @ 2019-12-16 00:30  Zahad003  阅读(1074)  评论(0编辑  收藏  举报