前言——首先我这是在前辈的经验上自己动手做了这次实验,全都仰仗前辈的经验总结。
漏洞简介:
apache httpd是一款http服务器,它可以通过mod_php来运行php网页,其中2.4.0~2.4.29版本中存在一个解析漏洞,在解析php时,1.php、0xa将被按照php后缀进行解析,导致绕过一些服务器的安全策略。
复现:
我是在kali环境下,预先已经装好了docker。
不知怎么下载docker的和安装的可以去vulhub上自行解决:漏洞搭建环境指导
下载漏洞集成环境vulhub:
git clone https://github.com/vulhub/vulhub.git
启动docker:
systemctl start docker
- 在物理机上创建目录
- mkdir -p /var/www/html、
- 然后创建个容器,并关联物理机的/var/www/html目录
- docker run -d -v /var/www/html:/var/www/html -p 8080:80 --name apache php:5.5-apache
- 再把物理机的/var/www/html开放写权限
- chmod 777 /var/www/html/
在html目录下编辑一个php文件,内容如下:
该代码为模拟一个存在解析漏洞的环境
<?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);
}
对这个代码进行分析的话,发现这里获取文件名是需要单独post一个name的,如果通过下面这样的方式就会把\0xa自动去除,也就不会造造成这个漏洞
$_FILES['file']['name']
接着创建一个index.html文件:
内容如下:
<form action="/你的PHP文件名.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="text" name="name">
<input type="submit" value="submit">
</form>
这是创建了一个上传表单
我们创建一个php文件,内容如下:
<?php
phpinfo();
?>
直接将其上传会显示上传失败
将其上传后抓包,在Hex选项卡中name=你的php文件名.php后面0d的位置右键-Insert byte,添加一个0a,然后发包,成功上传
浏览器访问:ip:8080/x.php%0A成功解析
回车的(0D)是不行的,虽然能上传成功,但是无法解析
优秀复现文章: