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 利用漏洞的前提条件

  1. 文件上传功能可以正常使用。
  2. 上传的文件路径可知。
  3. 上传的文件可以被访问
  4. 上传的文件可以被解析

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/htmlHTML网页文件,通常以.htm和.html文件扩展名结尾。
image/jpegJPEG图像文件,扩展名为.jpg和.jpeg。
image/pngPNG图像文件,扩展名为.png。
image/gifGIF图像文件,扩展名为.gif。
application/pdfPDF文件,扩展名为.pdf。
application/zip压缩文件,扩展名为.zip。
application/xmlXML 文档,常见扩展名为:.xml。还有.xsd等扩展名。
audio/mpegMP3音频文件,扩展名为.mp3。
video/mp4MP4视频文件,扩展名为.mp4。
video/x-msvideoAVI视频文件,扩展名为.avi。
video/mpeg视频文件,扩展名为.mpeg/mpg。
application/mswordWord-2003,扩展名为.doc
application/vnd.ms-excelExcel-2003,扩展名为.xls
application/vnd.ms-powerpointPowerPoint-2003,扩展名为.ppt
application/vnd.openxmlformats-officedocument.wordprocessingml.documentWord-2007,2016~2019,扩展名为.docx
application/vnd.openxmlformats-officedocument.spreadsheetml.sheetExcel-2007,2016~2019,扩展名为.xlsx
application/vnd.openxmlformats-officedocument.presentationml.presentationPowerPoint-2007,2016~2019,扩展名为.pptx
application/vnd.ms-word.document.macroEnabled.12Word-2010,扩展名为.docm
application/vnd.ms-excel.sheet.macroEnabled.12Excel-2010,扩展名为.xlsm
application/vnd.ms-powerpoint.presentation.macroEnabled.12PowerPoint-2010,扩展名为.pptm
application/vnd.ms-word.documentWord-2013,扩展名为.docx
application/vnd.ms-excelExcel-2013,扩展名为.xlsx
application/vnd.ms-powerpointPowerPoint-2013,扩展名为.pptx
application/jsonjson格式文件,扩展名为.json
application/octet-stream表示未知的二进制数据流,常用于未知文件类型的传输
application/x-httpd-phpphp格式文件,扩展名为.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 文件内容检测绕过

文件内容检主要有两种方法:

  1. 检测文件的魔术字节
  2. 文件加载检测:一般是调用 API 或者函数对文件进行加载测试。常见的是图像渲染测试,再严格点是进行二次渲染。

2.4.3.1 魔术字节检测绕过

魔术字节检测:文件开头的一组特定字节,用于标识文件类型。不同类型的文件有不同的魔术字节。通常情况下,可以判断前10个字节即可。
常见的各种文件类型的魔术字节如下:

图像魔术字节
JPEGFF D 8 FF E 0
PNG89 50 4 E 47 0 D 0 A 1 A 0 A
GIF47 49 46 38 39 61 或 47 49 46 38 37 61
BMP42 4 D
TIFF49 49 2 A 00 或 4 D 4 D 00 2 A
压缩文件魔术字节
ZIP50 4B 03 04
RAR52 61 72 21 1A 07 00
7z37 7A BC AF 27 1C
Gzip1F 8B 08
文本魔术字节
ASCII文本通常没有固定,但常以#!<?<!开头
UTF-8文本EF BB BF
Unicode文本(小端序)FF FE
Unicode文本(大端序)FE FF
PDF25 50 44 46 2D

具体的绕过方法:

  1. 通过16进制编辑器,在图片后面,插入各种木马。常用的16进制编辑器:010editor、winhex 等。

  2. 通过执行命令将图片与木马进行拼接。

    • 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. 文件上传的防御


  1. 上传的目录设置为不可执行。只要无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身也不会收到影响。
  2. 对于文件后缀的判断使用白名单的方式。
  3. 限制上传的文件大小。
  4. 对文件服务器和 web 服务器进行分离。上传的文件单独存放到其他的服务器中。
  5. 不需要返回文件路径的情况下,要随机改写文件名