问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
通过代码审计某友获取CNVD高危证书
漏洞分析
之前跟朋友聊到这个用友系统,说是存在很多漏洞,他审计了几个反序列漏洞的,也都发证书了。 自己也定了一个目标,今年搞几张高危证书,简单讲一下通过代码审计获取高危证书过程。
环境搭建 ---- 链接:<https://pan.baidu.com/s/10V-1Foq6MJp82JDF3NHKxg> 提取码:9496 数据库:sqlserver 2016 <https://cloud.tencent.com/developer/article/1644863> 操作系统:Windows2016 某友系列很多,本次选择了是一套很老的系统了 ### 用友源码安装 下载百度云下载的压缩包,解压压缩包,运行setup.bat文件   选择模块然后点击安装,建议选择全模块安装,这样功能多,漏洞也多  等待安装完成  安装完成后目录(一般默认安装在C:\\),运行startServer.bat 启动服务   这样本地环境就搭建后了,方便复现漏洞 #### debug调试配置 用友本身是有调试功能的,我们配置一下,在审计代码的断点调试 配置文件路径:`C:\yonyou\home\bin\sysConfig.bat`  将下面的配置填入到虚拟机参数中,一般添加在最前面就可以了 -agentlib:jdwp=transport=dt\_socket,server=y,suspend=n,address=5005 这样在运行服务时监听5005端口  IDEA配置  在jar中class文件下断点    ### cfr批量反编译jar 用友安装后的源码都是jar的,将jar都反编译出来,这样可以很好的审计代码 工具地址:<https://github.com/leibnitz27/cfr/releases/tag/0.152> ```php @echo off color 17 if "%1" == "" ( for /f "delims=" %%i in ('dir /s /b /a-d /o-s \*.jar') do ( echo 正在反编译 %%~ni... title 正在反编译 %%i... java -jar cfr-0.152.jar "%%i" --caseinsensitivefs true --outputdir "%%~di%%~pi%%~ni" echo ----%%i已经翻反编译--- ) goto :end ) else ( title 正在反编译 %1... java -jar cfr-0.152.jar %1 --caseinsensitivefs true --outputdir "%~d1%~p1%~n1" echo 反编译完成. goto :end ) echo 反编译完成. @pause>nul :end pause exit ```  将1.bat和cfr.jar放在一个目录,运行就批量反编译  等待反编译完成,代码太多需要时间有点长 代码审计 ---- 开始分析代码前,可以去用友官网查看历史漏洞  通过这些历史漏洞,可以捡漏。 - 因为一个接口存在漏洞,其他代码中也可能有漏洞 - 避免重复挖掘,不然提交CNVD会重复,白费功夫 主要讲我提交的两个sql注入`workflowService,PaWfm2`,这个系统sql注入还是很多的,只要用心都可以挖到漏洞 ### workflowService sql注入漏洞 漏洞代码路径:`C:\yonyou\home\modules\webimp\lib\pubwebimp_cpwfmLevel-1\nc\uap\wfm\action\WorkflowService.java`  在`WorkflowService`类中,将`proDefPk`参数传入`getWfmXmlByPk`方法 跟进getWfmXmlByPk方法  看到使用到了 `getProDefVOByProDefPk`带入pk参数  `getProDefVOByProDefPk` 是 接口类`IWfmProDefQry`定义的方法 在`WfmProDefQry`类实现`getProDefVOByProDefPk`方法  ```java public WfmProdefVO getProDefVOByProDefPk(String proDefPk) throws WfmServiceException { PtBaseDAO dao = new PtBaseDAO(); SuperVO[] superVos = null; try { superVos = dao.queryByCondition(WfmProdefVO.class, "pk_prodef='" + proDefPk + "'"); } catch (DAOException e) { WfmLogger.error((String)e.getMessage(), (Throwable)e); throw new LfwRuntimeException(e.getMessage()); } if (superVos == null || superVos.length == 0) { return null; } return (WfmProdefVO)superVos[0]; } ``` `getProDefVOByProDefPk`该方法 直接将`proDefPk`参数 传入`dao.queryByCondition`查询 #### `PtBaseDAO`类中 queryByCondition 方法下断点 开启断点调试查看proDefP值传入数据库,`dao.queryByCondition` 连接数据库查询 `D:\CodeQL\databases\nc\home\modules\webbd\lib\pubwebbd_pubLevel-1.jar!\nc\uap\cpb\persist\dao\PtBaseDAO.class`   `strWhere = (isnull(dr,0)=0) and pk_prodef='11';waitfor delay '0:0:4'--'` 可以看到 sql语句 查询pk\_prodef字段是使用`'`闭合了sql,导致注入漏洞  注:提交sql注入给CNVD 需要跑出数据库名称等,不然会被打回。 ### PaWfm2 sql注入漏洞 PaWfm2 漏洞产生的原理和 workflowService都是使用了 `getProDefVOByProDefPk`导致sql注入漏洞  在代码的54行中,使用了`getProDefVOByProDefPk`方法来查询,该方法实现类为`WfmProdefVO` `WfmProdefVO proDefVo = WfmServiceFacility.getProDefQry().getProDefVOByProDefPk(proDefPk);` 跟踪`WfmProdefVO`类实现的`getProDefVOByProDefPk`方法  `getProDefVOByProDefPk`方法 代码 ```java public WfmProdefVO getProDefVOByProDefPk(String proDefPk) throws WfmServiceException { PtBaseDAO dao = new PtBaseDAO(); SuperVO[] superVos = null; try { superVos = dao.queryByCondition(WfmProdefVO.class, "pk_prodef='" + proDefPk + "'"); } catch (DAOException e) { WfmLogger.error((String)e.getMessage(), (Throwable)e); throw new LfwRuntimeException(e.getMessage()); } if (superVos == null || superVos.length == 0) { return null; } return (WfmProdefVO)superVos[0]; } ``` `getProDefVOByProDefPk`该方法 直接将`proDefPk`参数 拼接到sql查询语句中,所以造成了sql注入漏洞 跟workflowService一样都使用了`getProDefVOByProDefPk`该方法 直接 queryByCondition 方法下断点  pk\_prodef字段是使用`'`闭合了sql,导致注入漏洞 `strWhere = (isnull(dr,0)=0) and pk_prodef='11';waitfor delay '0:0:4'--'`  提交了三个漏洞,重复了一个,两个高危   总结 -- - 漏洞挖掘过程本身没有多少技术含量,但是总归收获了高危漏洞证书。
发表于 2024-06-07 11:16:25
阅读 ( 5580 )
分类:
代码审计
5 推荐
收藏
5 条评论
woshidatianguan
2024-06-17 23:07
大佬,报告里你写了几个案例?用友这个版本的系统用的不多了吧?
webqs
回复
woshidatianguan
我没放案例,我直接将代码审计流程放上和本地漏洞复现结果
请先
登录
后评论
Itachi
2024-12-21 16:12
师傅----C:\yonyou\home\modules\pqm\client\lib\uipqm_qualityrecord.jar宸茬粡缈诲弽缂栬瘧--- 姝e湪鍙嶇紪璇?pubpqm_evaluatemng... 'java' 不是内部或外部命令,也不是可运行的程序 或批处理文件。这种类似的报错怎么解决啊
webqs
回复
Itachi
没遇到这种情况,可以加我v发截图看看 WYru130
请先
登录
后评论
CoC0
2025-01-12 17:49
师傅,protal接口访问报错您这边遇到过吗?
请先
登录
后评论
请先
登录
后评论
webqs
3 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!