Weaver-Ecology-Oa-Checkserver-Sqli Analyze
type
status
date
slug
summary
tags
category
icon
password
前言
博客好久没更新了,主要是我一些东西都记录在notion里了;博客的作用 基本可有可无,因为一些东西 还是不大方便公开嘛~,毕竟学的都是别人分享给我的。
想着还是要除除草,恰好前段时间 泛微的ecology不是出了个注入嘛(一堆厂商发布预警公告,其实我感觉这洞是有坑的...),想着来分析一手看看,但是是找别人要的Poc,又不方便公开;后来xray出了个Poc,就有理由了 哈哈
https://github.com/chaitin/xray/releases/tag/1.9.8,更新内容这块写了如何使用这条poc来检测
环境搭建
可以找一些网上的文章 来进行搭建,因为别人给我的Poc是sleep来验证的 所以我就搭的Mysql的环境
其中一些坑点 我也不在这一一赘述了
Poc
其实很简单,访问这条
/mobile/plugin/CheckServer.jsp?type=mobileSetting
uri,response是{"error":"system error"}
漏洞分析
泛微提供了更新补丁包,可以通过diff两个更新包 来寻找漏洞,因为他会记录利用(访问漏洞页面 比如出现单引号啥的 进行记录),这也大大方便了我们安全人员进行漏洞分析,当然更方便厂商人员进行定位攻击者
我就没有下更新包进行diff,因为之前就拿到Poc了。
补丁Diff,就是《ecology 9 SQL 注入漏洞分析》这篇文章中的手法,可以看到文章图片中,访问存在漏洞文件的话,参数是触发注入的Poc 他就进行写入日志 记录漏洞利用
直接定位到CheckServer.jsp里,找参数关键字type和mobileSetting
可以看到第13行,先将request请求 封装为了FileUpload类;后面提取type参数,比如 如果type=="mobileSetting"就调用
PluginServiceImpl.syncMobileSetting
方法所以我们起码有三个参数
type
settings
timestamp
看下
PluginServiceImpl.syncMobileSetting
方法883行:var1也就是settings参数的值咩,然后调用
JSONArray.fromObject
,将我们传入的参数 初始化为JSONArray
类;所以大致可以判断出 我们的settings参数就是一个json数组884行:转换为List
887:判断settings是否为空,不为空就进行if内部;然后将var6 搞个迭代器,为var8
892开始:就进入while循环,从var8从判断是否有值,有就接着进入;然后var9就是var8中的值,进行提取,参数有
scope
module
这俩都转换为了Int 故大概率不会出现注入;重点关注下面的setting
modulename
include
orasc
接着看下面的代码
其实这里没有啥sql操作的函数,除了935行的(没截上) 下面就是
乍一眼看 其实就看到了调用
saveMobileDocSetting
方法(当时就心想 不会是insert注入吧...)902-912行:先判断了var11,就是settings里的module参数;不是1, 7, 8, 9, 10 就会进入这个if分支;下面还有一个if 我们要让他不成立
!=2
为true,所以我们传"module":"2"
就可以了,直接跟进这个saveMobileDocSetting
方法 ,看下var1 var2 var3,传入的分别是settings里的 scope
setting
modulename
首先951行 判断了 我们的scope 要大于0;var2也就是setting 不为空,
isBlank
取反;下面映入眼帘的就是仨sql语句(var2为空 也就是settings里的 setting参数是空的),这里有可能就会出现insert注入 因为var3是我们可控的嘛 modulename;但是不会这么容易 因为有泛微的全局检测(
SqlInjectionRule
应该是这个,我没有去跟 如果不对 请大佬赐教小弟,主要不知道这个检测是在filter的时候 还是executeSql的时候 进行检测 哈哈 之前看的时候 忘跟了)然后我们接着下面找 sql语句 如果找到疑似的sql注入 再进行看代码逻辑
998行 很明显的 字符串拼接,那么就看看这个var12砸来的,984行 赋值 或者是 990赋值,主要看var7;如果是984行的 正好会url decode一下 那么应该就不会检测注入了,所以我们的payload 要url encode一下
那么去看var7,var7是961行,判断是否以
@
开头,这里我就明白了 大哥给的Poc 为什么有个@符了然后我们要看var11,明显是个数组 [0],可以看到 是从973行 从var10 进行分割出来的(这里 之前没注意 985行 的var11[1] 必须有值 要么会catch 所以 我们传入的 得是
@1|1
至少让它分割出来有值)var10 是var8数组里的,var8就是var2分割# 得来的;也就是从我们setting里来的
那么尝试闭合 进行构造就好了
成功延时 存在sql注入
坑点又来了,
一开始调试的时候,idea里 在select这里 成功sleep了,明显延时了
但是我后来 监控sql语句 但是居然是insert?! 没有select
但是假如要是 调试上,select和insert就有了
所以这里 肯定会insert
也就是后面 第 1005 行 来导致的
所以这个b点 其实是insert注入。那么注的时候 就要考虑一下了
这里就不放出Poc了,根据前面 就可以构造出来
碎碎念
其实 碰到一些洞,还是要自己分析一下 或者至少看看分析文章;
不要无脑exp 打打打,因为有些漏洞 真的不知道会导致功能如何
就比如这个点 有可能很简单的以为 是 select注入,然后有可能无脑sqlmap跑,然后就insert了 一堆垃圾数据
非常感谢给我Poc和环境的两位大哥,可以让我这么舒服的 分析这b洞