目录
三.3种webshell管理工具的使用方法(演示使用该工具连接webshell及抓取流量包进行分析特征)
1. 文件上传防御手段及绕过手段总结
2. 文件上传常用一句话木马
3. 课中所讲的三种webshell管理工具的使用方法(演示使用该工具连接webshell及抓取流量包进行分析特征)
4. 文件上传无回显如何查找webshell地址
5. 文件上传表单的无参/有参情况下构造表单
6. upload-labs靶场通关第6-第10关
一.文件上传防御手段及绕过手段总结
文件上传的防御手段
1. JS前端校验文件类型
说明:在文件选择阶段,通过JavaScript(JS)对文件类型进行初步校验,减少后端处理压力。
具体做法:
- 使用
<input type="file" accept="...">
标签的accept
属性限制用户只能选择特定类型的文件。 - 编写JS函数,在文件选择后通过文件扩展名或MIME类型(
file.type
)进行校验。 - 对于更严格的校验,可以读取文件的前几个字节(文件签名)来判断文件类型。
2. 校验上传文件类型
说明:在后端对上传的文件类型进行进一步校验,确保文件类型的安全性。
具体做法:
- 检查文件扩展名是否在允许范围内。
- 检查文件的MIME类型是否合法。
- 使用文件签名技术(如检查文件头的前几个字节)进行类型验证。
3. 校验上传文件内容
说明:对文件内容进行扫描,检测是否存在恶意代码或病毒。
具体做法:
- 使用病毒扫描软件或库对上传的文件进行扫描。
- 对特定类型的文件(如脚本文件)进行内容解析,检查是否存在危险代码。
4. 校验上传文件大小
说明:限制上传文件的大小,防止过大的文件占用过多服务器资源或导致服务拒绝。
具体做法:
- 在前端和后端都设置文件大小限制。
- 检查文件大小是否超过预设的阈值。
5. 校验上传文件路径
说明:确保上传的文件不会被存储在可执行的目录下,防止被当作脚本执行。
具体做法:
- 将上传的文件存储在非可执行的目录下。
- 禁止上传的文件具有执行权限。
6. 校验请求头Content-Type字段
说明:检查HTTP请求头中的Content-Type字段,确保其与上传的文件类型一致。
具体做法:
- 在后端接收文件时,检查Content-Type字段是否匹配文件类型。
- 如果不匹配,则拒绝上传。
7. 文件上传后存储到存储桶中
说明:将上传的文件存储在云存储桶中,实现文件的安全存储和高效管理。
具体做法:
- 使用云存储服务(如AWS S3、阿里云OSS等)创建存储桶。
- 将上传的文件保存到指定的存储桶中。
8. 文件上传后以时间戳方式重写文件名
说明:为了防止文件名冲突和猜测文件名进行攻击,使用时间戳作为文件名的一部分。
具体做法:
- 在文件上传时,生成一个包含时间戳的唯一标识符。
- 将这个唯一标识符与原始文件名结合,生成新的文件名。
9. 设置可执行目录白名单
说明:明确指定哪些目录是可执行的,防止上传的文件被误执行。
具体做法:
- 在服务器上设置可执行目录的白名单。
- 确保只有白名单中的目录具有执行权限。
文件上传的绕过手段
1. 大/双写文件名绕过
说明:通过修改文件名(如添加空格、双写扩展名等)来绕过文件类型校验。
示例:将malicious.php
修改为malicious.php.jpg
或malicious.php .jpg
。
2. 恶意文件内容以多段拼凑/拆解的形式组合
说明:将恶意代码分散在文件的多个部分,避开简单的内容扫描。
示例:将恶意代码隐藏在图片文件的末尾或中间部分。
3. 目录穿越到可执行目录
说明:通过构造特殊的文件路径,将文件上传到可执行目录下。
示例:上传文件时指定路径为../executable/
,尝试穿越到可执行目录。
4. 修改MIME类型
说明:通过修改HTTP请求头中的MIME类型字段,绕过MIME类型校验。
示例:将Content-Type
字段修改为image/jpeg
,但实际上传的是PHP脚本。
5. 大小写绕过
说明:利用系统对文文名大小写的不敏感性,绕过基于文件扩展名的校验。
示例:将malicious.PHP
(大写PHP)上传到只检查小写扩展名的系统。
6. 图片木马
说明:将恶意代码隐藏在看似正常的图片文件中,通过特殊手段触发执行。
示例:在JPEG图片中嵌入PHP代码,并修改图片文件头以绕过校验。
7. 文件包含绕过
说明:利用服务器上的文件包含漏洞,执行上传的恶意文件。
示例:通过上传包含恶意代码的文件,并利用文件包含漏洞将其包含到PHP脚本中执行。
8. 文件竞争绕过
说明:利用文件上传和处理的时间差,上传恶意文件并快速执行。
示例:在文件上传后,利用文件处理的时间窗口快速访问并执行恶意文件。
9. 修改文件后缀名
说明:通过修改文件的后缀名来绕过基于文件扩展名的校验。
示例:将malicious.php
修改为malicious.jpg
并上传,然后尝试通过其他方式执行该文件。
二.文件上传常用一句话木马(表格总结)
脚本语言 | 一句话木马示例 | 备注 |
PHP |
| 常用的PHP一句话木马,通过POST请求执行任意PHP代码 |
ASP |
| ASP环境下的一句话木马,执行通过请求传递的cmd参数 |
ASPX |
| ASPX环境下的一句话木马,使用JScript执行请求中的cmd参数 |
备注:
@
符号在PHP中用于抑制错误信息的显示,即使执行出错也不会显示错误信息。eval()
函数用于执行字符串作为PHP代码。$_POST['cmd']
、request("cmd")
、Request.Item["cmd"]
分别是从HTTP POST请求中获取名为"cmd"的参数值。
三.3种webshell管理工具的使用方法(演示使用该工具连接webshell及抓取流量包进行分析特征)
蚁剑流量分析
生成木马
编辑一句话木马
配置代理
蚁剑设置BurpSuite代理
BurpSuite开启抓包,蚁剑连接后随便点开几个目录文件,查看流量特征
分析特征
抓包后会发现每个请求体都存在以@ini_set(“display_errors”,“0”);@set_time_limit(0)开头的字符串
冰蝎流量分析
生成木马
冰蝎生成木马
放到本地phpstudy的WWW目录下,连接冰蝎
配置代理
冰蝎设置BurpSuite的代理
BurpSuite开启抓包,冰蝎连接后随便进几个目录文件,查看流量特征
分析特征
冰蝎4.0
- Accept字段(弱特征):通常是
Accept: application/json, text/javascript, /; q=0.01
意思是浏览器可接受任何文件,但最倾向application/json 和 text/javascript。 - Content-Type字段(弱特征):通常是
Content-type: Application/x-www-form-urlencoded
- 随机User-Agent:查阅资料得知,冰蝎设置了10种User-Agent,每次连接shell时会随机选择一个进行使用。
验证如下,多次连接,截到与第一次不一样的图 - PHP webshell 中存在固定代码
默认时,冰蝎 webshell都有“e45e329feb5d925b” 一串密钥 - 固定的请求头和响应头:逆向分析加密算法
请求字节头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M
响应字节头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd
翻车了,不会解密
哥斯拉流量分析
生成木马
生成木马gsl.php
配置代理
放到本地phpstudy的WWW目录下,配置BurpSuite代理,连接哥斯拉
分析特征
- User-Agent字段(弱特征),如果采用默认的情况,会暴露使用的jdk信息。不过哥斯拉支持自定义HTTP头部,这个默认特征是可以很容易去除的。
- Accept字段(弱特征):默认是Accept:text/html, image/gif, image/jpeg, *; q=.2, /; q=.2。同上,只能作为辅助检测的特征。
- Cookie中有一个非常关键的特征,最后会有个分号
- 响应体的数据有一定特征,哥斯拉会把一个32位的md5字符串按照一半拆分,分别放在base64编码的数据的前后两部分。整个响应包的结构体征为:md5前十六位+base64+md5后十六位。
- 数据包以
eval
开头
三种工具流量抓包如下:
四.文件上传无回显如何查找webshell地址
- 检查服务器日志:
-
- Web服务器日志:检查Apache、Nginx等Web服务器的访问日志和错误日志,看是否有关于文件上传的记录。这些日志可能会显示上传文件的尝试以及上传后文件被保存的位置。
- 应用程序日志:如果应用程序有自己的日志记录功能,检查这些日志以获取上传文件的相关信息。
- 分析源代码:
-
- 如果可能的话,获取并分析目标网站的源代码。检查文件上传功能的实现,看是否有关于文件保存路径的硬编码或可预测的命名规则。
- 特别注意那些处理文件上传的PHP、ASP、JSP等脚本文件,查看它们是如何处理上传的文件并保存到服务器的。
- 利用已知漏洞:
-
- 如果目标网站存在已知的上传漏洞或安全漏洞,可以利用这些漏洞来上传webshell并获取其地址。这通常需要对目标网站进行详细的漏洞扫描和渗透测试。
- 使用Webshell扫描工具:
-
- 使用专业的Webshell扫描工具(如D盾、河马等)对网站进行扫描。这些工具能够识别并定位网站中的Webshell文件。
- 注意,使用这些工具需要遵守相关法律法规和道德准则,仅应在授权或合法测试的环境中使用。
- 查看文件系统的变化:
-
- 如果能够访问目标服务器的文件系统(例如,通过SSH、FTP等),可以比较上传操作前后的文件变化。
- 检查新创建或修改的文件,特别是那些位于可写目录中的文件。这些文件可能是新上传的webshell。
- 利用搜索引擎和在线扫描服务:
-
- 使用搜索引擎的site命令(如
site:www.example.com
)结合文件类型搜索(如inurl:.php?pass=
),尝试找到可能包含webshell的URL。 - 利用在线扫描服务或网站监控工具来检测网站上的可疑活动或文件。
- 使用搜索引擎的site命令(如
- 分析网络流量:
-
- 如果能够捕获并分析目标网站的网络流量(例如,通过Wireshark等工具),可以查找与文件上传相关的HTTP请求和响应。
- 特别是关注那些包含文件上传数据的POST请求,以及服务器对这些请求的响应。
五.文件上传表单的无参/有参情况下构造表单
无参情况下构造表单
在无参情况下,通常意味着表单的字段名(如文件输入字段的name
属性)是固定的或已知的。
HTML示例
<form action="http://example.com/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
在这个例子中,文件输入字段的name
属性被设置为file
,这是服务器期望接收文件的字段名。
Burp Suite构造请求体
在Burp Suite中,可以拦截一个类似的POST请求,并修改其请求体以包含文件上传数据。请求体可能看起来像这样(仅展示multipart/form-data
的边界部分,实际请求中边界字符串会更复杂):
--boundary
Content-Disposition: form-data; name="file"; filename="example.txt"
Content-Type: text/plain
文件内容
--boundary--
有参情况下构造表单
在有参情况下,表单的字段名可能是可配置的或未知的。这通常发生在动态生成的表单或API调用中。
HTML示例
假设一个带有动态字段名的表单:
<form id="uploadForm" action="http://example.com/upload" method="post" enctype="multipart/form-data">
<input type="file" id="fileInput" name="dynamicFieldName">
<input type="submit" value="Upload">
</form>
Burp Suite构造请求体
在Burp Suite中,如果知道或能够推断出动态字段名,则直接修改请求体以匹配这个字段名。例:如果动态字段名为someDynamicFieldName
,则请求体可能如下:
--boundary
Content-Disposition: form-data; name="someDynamicFieldName"; filename="example.txt"
Content-Type: text/plain
文件内容
--boundary--
六.upload-labs靶场闯关(6~10)
Pass-06
防御点:服务端黑名单检测后缀
绕过点:文件后缀名大小写绕过
1.直接上传不行,提示该文件类型不允许上传
2.抓包,尝试修改Content-Type字段,仍不允许上传
3.改一下后缀名,转为大写PHP
成功上传
4.查看目录,发现服务端对其进行了更名
5.浏览器访问
Pass-07
防御点:服务端黑名单检测后缀
绕过点:空格绕过
1.这次大小写绕过不行了,查看源码,发现比较白名单前已被转为小写
2.尝试空格绕过,抓包更名为'xxx.php '
3.上传成功,不过又被改名了
4.浏览器访问
Pass-08
防御点:服务端黑名单检测
绕过点:点绕过
1.看看提示
666
2.查看网页源码
3.抓包改后缀,在后面加个'.'
进行绕过【查询资料得知,在Windows系统中,如果保存文件的文件名是以点结尾,系统会自动将点去掉】,那不仅可以绕过,而且也方便后面访问了
4.成功上传
5.浏览器访问
Pass-09
防御点:更高级的先前处理的服务端黑名单检测
绕过点:::$DATA绕过
windows遇见后缀::$DATA,会把它当作文件流处理,不再检查后缀
1.抓包,增加后缀::$DATA
2.放行,成功上传
3.浏览器访问【window会自动把::$DATA删除,所以可以直接访问】
Pass-10
防御点:服务端白名单检测过滤
绕过点:点+空格绕过
1.查看源码
2.查阅资料【deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来】
3.抓包,改后缀名为.php. .
,就可以保留.php
4.成功上传
5.浏览器访问