解析漏洞介绍

简单来说比如一个png照片文件我们把他解析成php脚本来执行,就叫做解析漏洞

环境下载

phpstudy(8.1.0.7版本)

影响版本

phpstudy:phpstudy : <=8.1.0.7

安全配置错误漏洞

1、由于用户的错误配置导致 nginx 把以 .php 结尾的文件交给 fastcgi 处理,为此可以构造 http://www.xxx.com/test.gif/xx.php (任何服务器端不存在的php文件均可,比如a.php)

2、但是 fastcgi 在处理 xx.php 文件时发现文件并不存在,这时 php.ini 配置文件中 cgi.fix_pathinfo=1 发挥作用,这项配置用于修复路径,如果当前路径不存在则采用上层路径。为此这里交由 fastcgi 处理的文件就变成了 /test.gif 。

3、 最重要的一点是 php-fpm.conf 中的 security.limit_extensions 配置项限制了 fastcgi 解析文件的类型(即指定什么类型的文件当做代码解析),此项设置为空的时候才允许 fastcgi 将 .png 等文件当做代码解析。

漏洞复现

环境搭建

安装phpstudy(8.1.0.7版本)

自己写了一个文件上发的脚本
里面过滤不是照片的文件
a.php文件
代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

<?php
if (isset($_POST['submit'])) {
//上发文件的位置
$a="C:\d\phpstudy_pro\WWW\\".$_FILES["upload_file"]["name"];
move_uploaded_file($_FILES["upload_file"]["tmp_name"],$a);
echo "文件在".$a;
}
?>


<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
<p>请选择要上传的图片:<p>
<input class="input_file" type="file" name="upload_file"/>
<input class="button" type="submit" name="submit" value="上传"/>
</form>

<script type="text/javascript">
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
</script>

当我们上传web木马的时候发现php被拦截了,

我们就可以利用这个解析漏洞

在一个照片后面添加一个web语句话木马

发现能上传上去

我们就可以利用解析漏洞去执行里面的php脚本

URL地址http://192.168.31.113/webshell.png/xxx.php?cmd=ipconfig
URL介绍
webshell.png这个是那个我们上发的文件
后面随便跟上xxx.php他就可以把webshell.png照片解析成php脚本
可以看见执行成功