将客户端数据以文件形式封装,通过网络协议发送到服务器端。在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存。
通常一个文件以HTTP协议进行上传时,将POST请求发送至Web服务器,Web服务器收到请求并同意后,用户与Web服务器将建立连接,并传输数据。
服务器配置不当
文件上传限制被绕过,过滤不严
开源编辑器的文件上传漏洞
文件解析漏洞导致文件执行
攻击者通过上传恶意文件传递给解释器去执行,然后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理、命令执行等恶意操作,从而控制整个网站、服务器。
这个恶意的文件又称WebShell。
可能存在漏洞的位置
图片上传功能
头像上传功能
文档上传功能
了解
webshell 是以asp、jsp、或cgi等网页文件形式存在的一种命令执行环境,也可以称之为网页木马后门。
攻击者可以通过这种网页后门获得网站服务器操作权限,控制网站服务器进行上传下载文件、查看数据库、执行命令等。
后门
一台计算机上有65535个端口,每个端口是计算机与外界连接所开启的门,每个门都有计算机提供的一些服务,攻击者利用这些服务,获取服务器的权限,给自己进入计算机留下一个后门。
分类
-
根据文件大小分类:
一句话木马:通常只有一行代码
小马:只包含文件上传功能
大马:包含很多功能,代码通常会进行加密隐藏
-
根据脚本类型分类
jsp
asp
aspx
php
特点
- webshell大多以动态脚本形式出现
- webshell就是一个asp或者php木马后门
- webshell可以穿越服务器防火墙,攻击者与被控服务器交换数据都是通过80端口传递
- webshell一般不会在系统日志中留下记录,只会在web日志中留下数据传递记录。
攻击流程
- 利用web漏洞获取web权限
- 上传小马
- 上传大马
- 远程调用webshell执行命令
常见webshell
PHP
<?php eval($_GET[pass]);?> <?php eval($_POST[pass]);?>pass为参数,打开木马后需要在网址中回显
http…/?pass = phpinfo(); 或者system(ipconfig);等命令
ASP
<%eval request(“pass”)%>
ASPX
<%@ Page Language=“Jscript”%><%eval(Request.Item[“pass”])%>
JSP
<%Runtime.getRuntime().exec(request.getParameter(“i”)));%>
1.可执行脚本
HTTP数据包
2.数据传递
3.执行传递的数据
直接执行
文件包含执行
动态函数执行
回调函数
一句话小马
<?php fputs(fopen("up.php","w"),'<?php eval($_POST["cmd"])?>');?>在当前目录下创建up.php文件,文件内容为PHP代码
通过小马上传大马
使用base64工具将PHP代码转成字符串(需要二次编码去除+=等特殊字符)
创建up.php,将文件上传PHP代码写入up.php中
<?php fputs(fopen(base64_decode(dXAucGhw),w),base64_decode(base64_decode(PHP代码编码)));?>base64_decode()做解码处理 dXAucGhw是up.php的编码处理。
之后可以通过文件上传功能传入大马。
1.中国菜刀(caidao) (比较落后,有后门)
2.c刀(cknife)
3.Weevely3 (kali中自带)
4.中国蚁剑(AntSword)
5.冰蝎(Behinder)
对数据传递会进行加密,可以很好的绕过防火墙。
客户端JavaScript检测(检测文件扩展名)(前端检测)
服务端MIME类型检测(检测content-type内容)
MIME 参考手册 (w3school.com.cn)
服务端目录路径检测(检测根path参数相关的内容)
服务端文件扩展名检测(检测跟文件extension相关的内容)
服务端文件内容检测(检测内容是否合法,是否含有恶意代码等)
使用burpsuite工具进行抓包,然后进行对文件的修改,使其达到符合服务器检测的形式。
绕过客户端检测(前端JavaScript检测)
客户端检测原理:
通常在上传页面里含有专门检测文件上传的JavaScript代码,最常见的就是检测文件类型和扩展名是否合法。
方法:
在本地浏览器客户端禁用JS即可。
可以使用火狐浏览器的NoScript插件、IE中禁用JS等方式实现。
绕过服务端检测
服务端检测原理:
服务端的代码通常检测三个点:
MIME类型、文件后缀、文件内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afZHgJBZ-1677413271759)(C:UserswrzAppDataRoamingTypora ypora-user-imagesimage-20230226183230079.png)]
文件幻数:文件中开头的几个字节,可以标识文件为何类型的文件。
文件格式的幻数File Format and Magic Number_BloodyEve的博客-CSDN博客_文件幻数
使用WinHex工具可以查看相应文件幻数。
绕过方法:
1.绕过MIME类型检测
原理:
检测图片类型文件上传过程中http包的Content-Type字段的值,来判断上传文件是否合法。
方法:
用burpsuite截取并修改数据包文件的content-type类型进行绕过。
2.绕过文件后缀检测-黑名单
原理(黑名单策略):
文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含常见的危险脚本文件。
方法:
-
后缀大小写绕过 (.pHp)
在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过。
-
空格绕过 (.php )
如果黑名单没有对后缀名进行去空处理
可以通过在后缀名后加空进行绕过。
-
点绕过 (.php.)
如果黑名单没有对后缀名进行去点处理
利用Windows系统的文件名特性,会自动去掉后缀名最后的点,通过对文件名后缀加点进行绕过。
-
::$DATA绕过
如果黑名单没有进行去::$DATA处理
利用Windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA,绕过黑名单的检测。
Windows会自动把::$DATA过滤。
-
配合Apache解析漏洞
Apache解析有一个特点:
解析文件从右往左判断,如果不可识别解析再往左判断。
如aa.php.owf.rar文件,Apache不可识别解析rar和owf,便会解析成php文件。
-
.htaccess文件(分布式配置文件)
配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测。
.htaccess文件,全称为Hypertext Access(超文本入口)。
提供了针对目录改变配置的方法。
文件上传到服务器时,服务器会找到.htaccess文件进行读取,解析配置。
可以自定义此配置,来使文件绕过检测。
3.绕过文件后缀检测-白名单
原理(白名单策略):
文件扩展名不在白名单中为不合法。
绕过方法:
服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析。
可以利用00截断的方式进行绕过,包括%00截断与0X00截断。
例子:上传文件名为aa.php%00.png的一个文件
服务端判断文件类型是从后往前判断,服务器读取到%00时会解析成0X00,当存在0X00时,自动忽略0X00后面的内容,
那么就会把此文件当成png文件上传,绕过白名单。
当服务器保存文件时,从前往后解析,自动忽略.png,就会保存为php文件。
注意:
在url中变为aa.php%00.png,在文件扩展名中,需要将%00进行解码再添加进文件扩展名。
用burpsuite工具添加,先在需要添加%00的地方添加空格,然后查看HEX位置,空格的HEX是20,将此位置改为00,即为%00的解码。
4.绕过文件内容检测
原理:
一般通过检测文件内容来判断上传文件是否合法。
两种检测方法:
通过检测文件幻数。
调用API或者函数对文件进行加载测试。常见的是图像渲染测试(可能会二次渲染测试)。
绕过方法:
- 绕过文件幻数检测
在文件开头添加相应文件幻数。
如:绕过jpg文件幻数检测就要添加FF D8 FF E0 10 4A 46 49 46
- 绕过文件加载检测
对渲染/加载测试攻击----代码注入绕过
攻击原理:
在不破坏文件本身的渲染情况下找一个空白区进行填充代码
一般是图片的注释区,可以保证文件结构完整。
对二次渲染的攻击方式-----攻击文件加载器自身
攻击原理:
通过溢出攻击对文件加载器进行攻击,
上传恶意文件后,服务器上的文件加载器会主动测试,加载测试 时被溢出攻击执行shellcode.
Apache解析漏洞
解析文件从右往左判断,如果不可识别解析再往左判断。
如aa.php.owf.rar文件,Apache不可识别解析rar和owf,便会解析成php文件。
IIS6.0解析漏洞
1.目录解析
形式:www.xxx.com/xx.asp/xx.jpg
原理:服务器默认会把.asp目录下的文件都解析成asp文件。
2.文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服务器默认不解析分号后面的内容,因此xx.asp;jpg 便被解析成asp文件了
IIS7.0解析漏洞
形式:任意文件名/任意文件名.php
**原理:**IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,
对任意文件名 只要在URL后面追加上字符串"/任意文件名.php"就会按照php的方式去解析
Nginx解析漏洞
形式1:任意文件名/任意文件名.php
**原理:**对任意文件名 后面添加"/任意文件名.php"就会按照php的方式去解析,如test.jpg/x.php
形式2:任意文件名%00.php
对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击