点击上方「蓝字」,关注我们
环境配置
l 系统:Windows Server 2016 Standard
l 数据库:Oracle11G
l JDK:java 1.8.0_202
l 复现版本:用友NCCloud2005
源码分析
FileConsoleService服务接口所在路径:
/NCCloud/home/hotwebs/fs/WEB-INF/web.xml。
Jar包所在位置:
/NCCloud/home/modules/uapbs/lib/pubuapbs_fsLevel-1.jar!
类方法代码位置:
/uap/pub/fs/console/FsConsoleService.class
从请求包request中获取username、password后,调用SuperUserVerify.checkUserPassword()方法校验该用户名username是否是合法用户,跟进去看看:
这里不会跳到56行。57行调试进去后跳到定位器NCLocator.class类:
通过NCLocator定位器得到系统当前已经实例化的该类对象。
Lookup()方法查找该类对应Service。
调用类Service的实现方法Impl:
然后调用this.baseDAO.retrieveByClause()方法,该方法前先把字符串添加到缓冲区:
构造一个字符串构建器,其中不包含任何字符,初始容量为16个字符。
把我们的字符串以“为分隔分别append到Stringbuilder缓冲区,变量名为condition。
this.baseDAO.retrieveByClause()方法详细代码如下:构造的数据包以及结果如下:
调用对象持久化管理器抽象类manager的retrieveByClause()方法:
通过使用不同的自身构造器,最终进入到第676行的retrieveByClause()方法,并创建BeanListProcessor对象。
而后返回查询数据库的结果。
先看内层方法buildSql():
把获得的表名追加到SQL语句的缓冲区。
这里的condition不为空,且不是以“ORDER”开始的,按照要求追加到SQL语句的缓冲区,然后返回它。
SQL语句建造好后,调用executeQuery()执行SQL语句。
整个过程下来,没有对我们客户端输入的数据做过滤以及限制,就拼接到SQL语句中,导致了SQL注入漏洞。
漏洞复现
Sqlmap测试username参数的结果显示有时间盲注:
构造的数据包以及结果如下
https://www.cnblogs.com/pursue-security/p/17685151.html
刑天攻防实验室
扫码关注 了解更多
原文始发于微信公众号(刑天攻防实验室):用友NCCloud fs文件服务器SQL注入漏洞分析与复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论