复现环境

docke

apache 2.4.0到2.4.29即可

php5.5

 

复现过程

先在物理机上创建目录

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/

写一个文件上传的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); }

这里过滤了php,php3,php4,php5,phtml,pht

访问下抓包

然后更改请求方式和内容类型

 

上传一个1.php文件,会被拦截

上传个2.txt,上传正常

在上传个3.php并在文件名后面添加0a

上传成功

 

 

访问xxx/3.php%0a发现解析成功

 

后记

1. 默认的Apache配置文件即可利用,因为Apache配置使用了<FileMatch>:

<FilesMatch \.php$>    

SetHandler application/x-httpd-php

</FilesMatch>

后来测试发现回车的(0D)是不行的,虽然能上传成功,但是无法解析

火狐

谷歌

2. 获取文件名时不能用$_FILES['file']['name'],因为他会自动把换行去掉,这一点有点鸡肋

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐