1. webshell
1.1 基本介绍
Webshell 指的是一种可以在服务器上执行命令的脚本,通常是以 Web 页面的形式出现,可以通过浏览器等 Web 客户端访问并执行系统命令。Webshell 通常由 PHP、JSP、Python 等。Webshell 的出现给了攻击者执行攻击的极大便利,因此也成为了常见的攻击手段之一。
1.2 分类
- 根据文件大小
- 一句话木马。简短,方便使用。
- 小马。体积小,通常只有文件上传功能。
- 大马。体积大,包含很多功能。
- 根据编程语言分类
1.3 特点
多数的 webshell 都是动态的脚本。可以穿过服务器的防火墙,直接与被控者的服务器交换数据。
webshell 一般不会在系统日志中留下记录,会在 web 日志中留下数据传递记录。
1.4 webshell 管理工具
1.4.1 蚁剑
GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器
GitHub - AntSwordProject/antSword: 中国蚁剑是一款跨平台的开源网站管理工具。AntSword is a cross-platform website management toolkit.
AntSword 文档 · 语雀
1.4.2 哥斯拉
GitHub - BeichenDream/Godzilla: 哥斯拉
1.4.3 冰蝎
GitHub - rebeyond/Behinder: “冰蝎”动态二进制加密网站管理客户端
1.4.4 中国菜刀
过于经典,学习使用可以,大厂已经可以屏蔽。
1.4.5 webshell 及工具收集
GitHub - tennc/webshell: This is a webshell open source project
2. 文件上传漏洞
Note
文件上传漏洞是指 Web 应用程序在处理用户上传的文件时,未能正确验证文件类型、文件名、文件大小、文件内容等,导致攻击者可以利用该漏洞上传恶意文件,进而对服务器进行攻击、控制或者数据篡改等。
为防止文件上传漏洞的发生,应用程序可以采用多种方式进行防御,如文件类型、文件大小的校验、对上传文件的存放位置和权限的限制、使用图片压缩等工具将图片转换为不易执行的格式等措施。此外,定期检查服务器上的上传文件,及时删除无用文件,减少攻击面也是重要的防御手段。
靶场:upload-loads
2.1 文件上传检测方式
- 客户端 JavaScript 检测:检测文件扩展名。
- 服务端检测文件类型:检测文件的后缀名、文件 MIME 类型、文件的魔术字节(文件开头的几个字节,用于确定文件的类型。)
- 服务端检测文件名:检测文件名,是否包含特殊字符、空格、点等不合法的字符;或者在文件名中输入脚本;限制文件名长度。
- 服务端检测目录路径:上传的文件需要在一个安全的位置,限制访问权限。检测文件路径是否合法,是否包含特殊字符、空格、点等。
- 服务端检测文件内容:检测内容是否含有恶意代码。
2.2 利用漏洞的前提条件
- 文件上传功能可以正常使用。
- 上传的文件路径可知。
- 上传的文件可以被访问。
- 上传的文件可以被解析。
2.3 客户端的检测方法绕过
部分网站会在允许上传文件处,使用 JavaScript 来验证上传的文件类型和大小等属性。如果可以禁用客户端的 JavaScript,可以绕过这种验证方式,直接将图片上传到服务器中。
禁用客户端 JavaScript 的方法:
- 通过浏览器直接禁用 JavaScript:根据不同的浏览器,具体设置方法不同,还可以针对指定的网站进行设置。
- 浏览器插件
2.4 服务端的检测方法绕过
服务端通常会检测文件的扩展名,MIME类型,文件内容。
2.4.1 MIME 检测绕过
MIME(Multipurpose Internet Mail Extensions)是一种互联网标准,用于表示文档、图像、视频等文件在发送时的内容类型。
- 检测:通常是检测文件上传过程中的数据包的
Content-type字段,来判断上传内容是否合法。 - 绕过:通过 burpsuite 抓取请求包,并修改
Content-type的类型进行绕过。
常见的 MIME 类型如下:
| MIME | 含义 |
|---|---|
| text/plain | 纯文本,不包含任何格式的文本文件,例如.txt和.log等。 |
| text/html | HTML网页文件,通常以.htm和.html文件扩展名结尾。 |
| image/jpeg | JPEG图像文件,扩展名为.jpg和.jpeg。 |
| image/png | PNG图像文件,扩展名为.png。 |
| image/gif | GIF图像文件,扩展名为.gif。 |
| application/pdf | PDF文件,扩展名为.pdf。 |
| application/zip | 压缩文件,扩展名为.zip。 |
| application/xml | XML 文档,常见扩展名为:.xml。还有.xsd等扩展名。 |
| audio/mpeg | MP3音频文件,扩展名为.mp3。 |
| video/mp4 | MP4视频文件,扩展名为.mp4。 |
| video/x-msvideo | AVI视频文件,扩展名为.avi。 |
| video/mpeg | 视频文件,扩展名为.mpeg/mpg。 |
| application/msword | Word-2003,扩展名为.doc |
| application/vnd.ms-excel | Excel-2003,扩展名为.xls |
| application/vnd.ms-powerpoint | PowerPoint-2003,扩展名为.ppt |
| application/vnd.openxmlformats-officedocument.wordprocessingml.document | Word-2007,2016~2019,扩展名为.docx |
| application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Excel-2007,2016~2019,扩展名为.xlsx |
| application/vnd.openxmlformats-officedocument.presentationml.presentation | PowerPoint-2007,2016~2019,扩展名为.pptx |
| application/vnd.ms-word.document.macroEnabled.12 | Word-2010,扩展名为.docm |
| application/vnd.ms-excel.sheet.macroEnabled.12 | Excel-2010,扩展名为.xlsm |
| application/vnd.ms-powerpoint.presentation.macroEnabled.12 | PowerPoint-2010,扩展名为.pptm |
| application/vnd.ms-word.document | Word-2013,扩展名为.docx |
| application/vnd.ms-excel | Excel-2013,扩展名为.xlsx |
| application/vnd.ms-powerpoint | PowerPoint-2013,扩展名为.pptx |
| application/json | json格式文件,扩展名为.json |
| application/octet-stream | 表示未知的二进制数据流,常用于未知文件类型的传输 |
| application/x-httpd-php | php格式文件,扩展名为.php |
2.4.2 文件扩展名检测绕过
- 检测:扩展名检测通常会使用白名单+黑名单的方式进行。黑名单中通常会包含常见的危险文件类型。
- 黑名单绕过:
- 后缀大小写绕过:在 Windows 中,后缀的大小写是不敏感的。可以采用更改后缀的大小写进行绕过。
- 空格绕过:如果服务端没有对后缀名进行去空处理,可以通过后缀名后加空格进行绕过。
- 点绕过:如果服务端没有对后缀名进行的
.进行处理,利用 Windows 的文件特性,会自动的去除后缀名最后的.。可以通过在文件名后加.进行绕过。 ::$DATA绕过:如果服务端没有对后缀名进行删除::$DATA处理,可以利用 Windows 文件特性,可以在后缀名加::$DATA进行绕过。- 双写绕过:如果服务端会对黑名单中的文件后缀进行删除,可以尝试使用双写的方式进行绕过。
.htaccess文件绕过:.htaccess文件是一种配置文件,通常用于为 Apache Web 服务器中的特定目录提供额外的配置选项,可以用来控制网站的访问权限、URL 重写、错误页面的自定义等等。其中可以包含各种指令,用于修改服务器的行为。通过修改.htaccess文件,攻击者可以实现在服务器上上传恶意文件。# 方法1: # 将as.png名称的文件,解析为php文件 <FilesMatch "as.png"> setHandler application/x-httpd-php </FilesMatch> # 方法2: # 将.jpg格式文件,解析为php文件 # 在htaccess文件中添加如下指令: AddType application/x-httpd-php .jpg
- 白名单绕过:
00 截断:服务端判断文件类型是从后往前判断,对于文件解析是从前往后解析。00截断的方式包括 %00 截断和 0x00 截断。同时 php 版本小于5.3.29。- %00 截断:url 发送到服务器后,会被服务器解码。这时候还没传到验证方法的函数。验证函数接收到的是解码后的 %00,最终会解码成 0x00。
- 0x00 截断:系统对文件名进行读取时,遇到 0x00 会认为读取已经结束。
2.4.3 文件内容检测绕过
文件内容检主要有两种方法:
- 检测文件的魔术字节
- 文件加载检测:一般是调用 API 或者函数对文件进行加载测试。常见的是图像渲染测试,再严格点是进行二次渲染。
2.4.3.1 魔术字节检测绕过
魔术字节检测:文件开头的一组特定字节,用于标识文件类型。不同类型的文件有不同的魔术字节。通常情况下,可以判断前10个字节即可。
常见的各种文件类型的魔术字节如下:
| 图像 | 魔术字节 |
|---|---|
| JPEG | FF D 8 FF E 0 |
| PNG | 89 50 4 E 47 0 D 0 A 1 A 0 A |
| GIF | 47 49 46 38 39 61 或 47 49 46 38 37 61 |
| BMP | 42 4 D |
| TIFF | 49 49 2 A 00 或 4 D 4 D 00 2 A |
| 压缩文件 | 魔术字节 |
|---|---|
| ZIP | 50 4B 03 04 |
| RAR | 52 61 72 21 1A 07 00 |
| 7z | 37 7A BC AF 27 1C |
| Gzip | 1F 8B 08 |
| 文本 | 魔术字节 |
|---|---|
| ASCII文本 | 通常没有固定,但常以#!或<?或<!开头 |
| UTF-8文本 | EF BB BF |
| Unicode文本(小端序) | FF FE |
| Unicode文本(大端序) | FE FF |
| 25 50 44 46 2D |
具体的绕过方法:
-
通过16进制编辑器,在图片后面,插入各种木马。常用的16进制编辑器:010editor、winhex 等。
-
通过执行命令将图片与木马进行拼接。
image.jpg是原始图片文件payload.php是要合并的木马文件image_payload.jpg是合并后的文件名
# 方法1: # 以二进制的读取image.jpg和payload.php copy /b image.jpg + payload.php image_payload.jpg # 以二进制的读取image.jpg。以ASCII码读取payload.php copy image.jpg /b + payload.php /a image_payload.jpg # 方法2: cat image.jpg payload.php > image_payload.jpg
2.5 条件竞争绕过
服务器中可能会有先将文件保存到指定位置,然后再判断文件是否合法,如果不合法则删除。这种情况可以用多线程,利用上述提到的方法,不断的去上传、访问文件。在服务器完成删除之前,已经访问到了上传的文件,即可完成绕过。
<?php
fputs(fopen('shell.php', 'w'),'<? @eval($_POST[1])?>');
?> 只要可以成功访问到payload.php,就可以创建一个名为shell.php的文件,并写入<? @eval($_POST[1])?>。
可以通过burpsuite不断的上传、访问。直到服务器内部存在一个不会被删除掉的恶意文件。
3. 解析漏洞
3.1 IIS解析漏洞
3.1.1 目录解析漏洞
形式:www.xxx.com/xxx.asp/xxx.jpg
若服务器中存在.asp结尾的文件夹,服务器会将该文件夹中的所有文件解析为asp文件。
3.1.2 文件解析漏洞
形式:www.xxx.com/xxx.asp;.jpg
服务器默认不解析分号;后面的内容,所以xxx.asp;.jpg会被解析为asp文件。
3.2 Apache解析漏洞
Apache解析文件的规则是从右向左开始判断解析,如果后缀名不可识别,就向左判断。
4. 文件上传的防御
- 上传的目录设置为不可执行。只要无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身也不会收到影响。
- 对于文件后缀的判断使用白名单的方式。
- 限制上传的文件大小。
- 对文件服务器和 web 服务器进行分离。上传的文件单独存放到其他的服务器中。
- 不需要返回文件路径的情况下,要随机改写文件名。