目标环境
比如,目标存在一个上传的逻辑:
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
绕过黑名单 getshell
正常上传 php 文件,被拦截:
可以上传 1.php.xxx,但是不解析,说明老的 Apache 解析漏洞不存在:
我们利用 CVE-2017-15715,上传一个包含换行符的文件。注意,只能是\x0A,不能是\x0D\x0A,所以我们用 hex 功能在 1.php 后面添加一个\x0A:
然后访问/1.php%0A,即可发现已经成功 getshell:
nginx + php,我进行了测试,发现结果却有些区别:
成功上传后,访问却出现 Access denied 错误。
这也是我预想的结果,fpm 存在一个 security.limit_extensions 配置,默认只解析 php 后缀的文件,多一个换行也不行。
~谢谢打赏~
赏