问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
蓝凌OA WechatLoginHelper.do SQL注入漏洞复现分析
漏洞分析
蓝凌OA的wechatLoginHelper.do接口处存在SQL注入漏洞,攻击者可以利用 SQL 注入漏洞获取数据库中的信息(管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。
漏洞简介 ==== 蓝凌OA的wechatLoginHelper.do接口处存在SQL注入漏洞,攻击者可以利用 SQL 注入漏洞获取数据库中的信息(管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。 资产测绘搜索语句 -------- hunter:app.name="Landray 蓝凌OA ![0.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-8414ae935bdb1bdb6687cb9c9d6f64631c2b1401.png) 路由与鉴权分析 ======= 通过分析web.xml配置文件,我们可以发现以下路由定义。 ![7.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-2c66a2070332001074c02ab08e378438ddb495c4.png) 定义了一个名为 `springmvc` 的 Servlet,并将其映射到多个 URL 模式。包括所有以 `/data/` 开头的 URL,所有以 `/api/` 开头的 URL,所有以 `.do` 结尾的 URL。 查看`KmssSpringDispatcherServlet`,分析可以知道继承`DispatcherServlet`,并添加了一些自定义的初始化和处理逻辑。自定义的上下文创建、刷新处理逻辑、异常处理以及静态资源处理。用于接收并处理所有进入的 HTTP 请求。由此我们知道\*.do路由为springmvc架构。 ![6.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-a0e4a38b804b813849d56bd212cc0b2d3326fcfa.png) 我们可以发现配置文件design.xml中的配置,这个配置文件中定义了一些与“第三方微信”模块相关的设置。有包含模块定义、请求权限、首页配置和微信集成后台配置。 ![5.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-a0ea8e70b8229edef4991d252b8c3bde8dc17ecd.png) `path="wechatLoginHelper*"`:这个属性定义了请求的路由模式。也就是路由以 `wechatLoginHelper` 开头,后面可以跟随任意字符的路由的`defaultValidator`属性="true"这个属性表示对于该路由的请求验证使用默认验证器。在这里,它被设置为 true,也就是任何用户都可以访问这个请求,无需权限验证。 相应的design.xml加载流程在`/sys/config/design/SysConfigs.java`中,这里就不过多解释。 漏洞分析 ==== 通过查看相应配置的spring-mvc.xml文件,可以发现如下定义,将`"/third/wechat/wechatLoginHelper.do"` URL 映射到 `WechatLoginHelperAction`类。 ![4.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-c805785dba79c247eecc8d595d897ea8079488a3.png) 查看`WechatLoginHelperAction`类定位到漏洞方法`edit`相应代码。 ![3.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-976331080da29a24cb65b034d43d22b8dec47b53.png) 先从从请求中获取 `openid`、`nickname`、`image` 和用户 ID (`uid`) 的参数。这里输入的`uid`会传参给`id`,然后进行身份验证判断,`if (id == null || "".equals(id))`这里方id为空表示用户未登录。后续会通过方法`UserUtil.getKMSSUser()` 获取当前用户对象,然后通过`user.getUserId()`方法获取id。因为id为注入点,这里直接让id不为空就可跳过判断。 然后会通过`getServiceImp(request).findList("fdEkpid='" + id + "'", null);`方法进行id查询,这里也是注入点,可以看到`uid`从输入到进入`findList`方法,除了一次是否为空的判断,没有任何过滤。 这里继续跟进`findList`方法到DAO层。 ![2.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-efec2c91015d116c9d20bee500fcd0f378393252.png) 通过调用 `createHbmQuery` 方法,创建了一个 Hibernate 查询(Query)对象。然后通过**`list()`**方法执行查询,并将结果放入 `rtnList` 中并返回查询的结果列表。 我们继续分析是否有回显,`findList`方法将查询到的值传给`l`,随后进行判断`if (l == null || l.size() == 0)`检查查询结果是否为空,为空则表明该用户尚未创建配置,然后进行相应配置。若不为空,则配置存在,取出第一个配置对象 `wc`,然后根据请求参数更新 `wf` 和 `wc` 的属性。没有报错的话,最后会通过`return getActionForward("edit", mapping, wf, request, response);`转发到编辑视图,获得回显。 漏洞复现 ==== ![1.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-6c4f1c4b010e404a2478ad6e3e55d14f24dd18bd.png) 注入出管理员密码. 参考 == [https://blog.csdn.net/qq\_39342001/article/details/137354047](https://blog.csdn.net/qq_39342001/article/details/137354047)
发表于 2024-08-09 09:56:49
阅读 ( 2157 )
分类:
OA产品
2 推荐
收藏
1 条评论
liangjian
1秒前
结尾那里没有成功啊,那个是fdId, 并不是fdPassword
请先
登录
后评论
请先
登录
后评论
F82
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!