文章总结: 本文详细分析了帆软报表系统两个历史漏洞的利用案例,分别针对帆软8和帆软9版本。作者通过URL编码、目录遍历、请求方法绕过等技术手段,成功绕过WAF和nginx限制,实现了任意文件读取和文件上传漏洞利用。文章强调了即使面对有WAF保护的老系统,通过深入源码分析和综合利用各种技巧,仍有可能突破防护获取系统权限。
综合评分: 90
文章分类: 渗透测试,漏洞分析,WEB安全
层层防护下的突破之道:帆软漏洞利用深度解析
原创
killer
漫漫安全路
2025年9月15日 16:08
前言
这篇文章讲两个帆软老版本的案例,都是老漏洞主要分享一下某些特定场景的绕过思路。
案例一
22年的时候遇到的一个目标版本为帆软-8很多洞都没修,访问/ReportServer显示如下
点击服务器管理平台进入登录页面返回403
因为/ReportServer可以访问,带参数以后403怀疑是检测参数。
于是将fs_load改为fsa_load
发现不返回403了,报错说没得这个选项。说明对参数值fs_load做了限制。于是直接将fs_load进行URL编码
发现成功访问到登录页,说明使用URL编码参数值可以绕过nginx 403限制。
然后尝试利用很久之前的任意文件读取读取密码解密payload如下
/ReportServer?op=chart&cmd=get_geo_json&resourcepath=privilege.xml
burp发包后直接断开没有返回包猜测存在waf,经过测试只要数据包里有privilege就会拦截,各种测试依然无法绕过,于是再GET和/中间加入大量空格成功绕过。
但是又是403应该是参数值被nginx限制了继续把op、cmd参数值URL编码
成功读到账号和加密的密码,解密密码。burp设置替换规则,然后登录获取session。
制作插件马
上传插件,然后移动缓存目录到web根目录
访问shell路径发现404
使用目录遍历漏洞查看shell是否存在
shell在web目录下,但是无法访问怀疑是做了访问限制。
经过测试发现URL必须为/xxx/ReportServer开头才会转发到后端,于是使用/xxx/ReportServer/..;/test/1.jsp绕过nginx转发限制成功访问到shell
案例二
这个案例是在前段时间遇到的,目标为帆软-9具体测试过程如下。
由于当时一些细节没有截图我这边以本地环境截图说明。
访问/ReportServer
点击服务器管理平台进入登录页面返回403情况和上一个例子一样。
于是直接URL编码参数值发现依然403于是编码op、cmd参数发现成功访问。
这里时间上很容易判断为帆软9版本,因为访问/ReportServer看到的数据决策系统背景色更蓝一些。
或者通过如下请求包获取版本及物理路径
GET /WebReport9/ReportServer?op=fr_base&cmd=evaluate_formula&expression=jvm() HTTP/1.1
Host: 127.0.0.1:8082
Connection: keep-alive
知道目标为帆软9以后开始测试公开的历史漏洞,原始POC如下
POST /WebReport9/ReportServer?op=svginit&cmd=design_save_svg&filePath=chartmapsvg/../../../file.svg.jsp HTTP/1.1
Host: 127.0.0.1:8082
Content-Length: 235
Content-Type: text/xml; charset=UTF-8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
{"__CONTENT__":"shell内容","__CHARSET__":"UTF-8"}
将op、cmd编码发包发现直接断开连接没有返回包猜测存在waf应该是../被拦截了于是先不是用../进行测试发现返回405
经过测试发现任意POST请求都不允许
这个时候就感觉有点麻烦了,有WAF需要绕过../有请求方法限制只能使用GET
../的话可以使用我之前发的帆软编码脚本进行绕过,但是请求方法只能使用GET暂时想不到什么处理办法。于是想着先测试漏洞存不存在再想办法。
根据代码分析可知测试这个漏洞存在只需要GET方法就行,然后我们将filePath参数值设置为chartmapsvg/../../../aaa/file.svg.jsp如果aaa目录被成功创建说明存在漏洞。于是使用cjk_encode编码构建POC
访问
/WebReport/aaa返回302
文件夹创建成功说明漏洞存在,此时只需想办法使用
GET获取文件内容即可getshell继续查看代码
所以我们需要找到在哪里设置了
__CONTENT__这里可以直接在javax.servlet.ServletRequest#setAttribute打上条件断点然后本地发包成功命中
查看调用堆栈可以找到赋值的具体位置
按照经验和直觉来说的话只有
POST请求才有请求体,但是实际上我们将请求改为GET方法javax.servlet.ServletRequest#getInputStream依然可以获取到请求体
__CONTENT__值从json里解析所以可以直接unicode编码,但是在这里测试以后发现也被WAF拦截。注意到以下代码
可以通过
__CHARSET__(非json里的)参数控制请求体的编码解析。所以最终构造如下数据包绕过WAF及POST限制成功写入shell
最后如果要使用哥斯拉连接
webshell需要设置burp规则
总结
从上面两个案例来看现在的环境老漏洞依然是存在的,但是肯定是加了各种限制以及强WAF。这个时候就需要我们深入源码、综合利用各种技巧才能突破层层防护拿下目标。(新漏洞也有后面有机会再分享)
公众号后台回复cjk可获取绕过WAF的编码脚本
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:漫漫安全路 killer《层层防护下的突破之道:帆软漏洞利用深度解析》