环境配置
l 系统:Winserver2019
l 数据库:MySQL5.7.26
l JDK:java 1.8.0_371
l 复现版本:ecology9_V10.42
源码分析
接口位置:mobile/plugin/CheckServer.jsp ,如下图所示:
首先从FileUpload对象中获取type参数,然后根据type参数值可进入不同分支。着重关注当type等于“mobileSetting”时所进入的分支。
获取了settings和timestamp参数,然后调用ps.syncMobileSetting()方法,追踪进去,如下图所示:
可以看到第845行代码:把实参settings转换为json数组。然后再转换为列表并赋值给var6。对var6进行判空,不为空的话,放到迭代器对象var8里。继续往下看,如下图所示:
遍历var8对象,且把var8里的元素转换成Map集合赋值给var9。后面依次获取scope、module、setting、modulename、include、orasc数据。当module不为1、7、8、9、10进入第一个if语句;当module等于2或3时,进入else分支调用this.saveMobileDocSetting()方法。跟进去,如下图所示:
这里的形参依次对应的参数是scope、setting、modulename。如果scope大于0且modulename不为空,则进入if语句。
从数据库MobileDocColSetting表中删除scope值的数据。如果setting值为空,向MobileDocColSetting表中插入一条数据;否则进入else分支。
移除setting首尾的空格,在判断是否以@开头,如果是的话去除@后赋值给var2。以#字符对var2进行分隔并赋值给var7,如果var7为空,则直接return返回。
继续往下看,如下图所:
遍历var7数组,去除数组里单个元素的|符号后赋值给var10,并判断var10数组是否为空。当setting是以@开头时,进入if分支。对var10数组中的第一个元素进行URL解码;第二个元素转换成Int类型并赋值给var19;根据数组后面是否还有元素进行相应赋值。注意看到第958行代码:直接使用String类型的var11拼接到insert语句中,且没有对它进行过滤处理,造成了SQL注入漏洞。
漏洞验证
构造的数据包如下图所示:
发送构造好的数据包,确定存在时间盲注。
分享文章,私信获取相关代码学习资料
公众号:
刑天攻防实验室
扫码关注 了解更多内容
原文始发于微信公众号(刑天攻防实验室):泛微OA CheckServer.jsp SQL注入漏洞分析及复现
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论