截至至目前,北京市全部中小学在校内均部署cmis系统,而且业务面极广,内含大量敏感数据,包括学生家长,应届毕业生在内的详细到电话住址的记录,所以cmis也成为针对学生的诈骗,营销的黑色产业链的主要数据来源。同样,由于和多套其它系统同时部署,也会互相殃及。
结合另外一个漏洞成功变time-based为error-based,绕过过滤策略。这一处SQL注入可以在cmis内执行任意SQL语句,通过特定构造可以任意添加管理员,修改,下载敏感数据。
首先是信息收集环节
因为北京每个学校都部署了相同系统
所以很顺利地找到了官网:card.bjedu.com
下载安装包,进行反编译
<img src=".https://wooyun-img.oss-cn-beijing.aliyuncs.com/upload/201410/31230032de80946ecf011ee342a3a075cd411d72.jpg" alt="" />
反编译问题class文件
\ediasoft\webapps\cmis40\WEB-INF\classes\com\becom\cmis40\webapp\action\PictureFOS.class
观察到pid参数是直接request.getParameter()传入,
跟进findPictureForTOrS()
反编译\ediasoft\webapps\cmis40\WEB-INF\classes\com\becom\cmis40\webapp\action\communityUtilityExt.class
"select picture from " + table + " where p_id=" + pid;
我们看到pid被直接拼接在sql语句中,造成一处注入,又因为在performTask()中没有对访问者身份进行验证,从而造成越权,所以无需登录即可利用。
接下来找到了重置密码函数
得知用户密码存在 o_userpassword 中,并以encryption.encodePassword()加密。
跟进加密函数
-->
-->
computeDigest()实现MD5加密
encrypt()中调用computeDigest()两次
由此得知加密算法为md5(md5(pass))
也就是说更新admin密码sql如下
但是这时候问题来了
经过反复地排查,我确认在我下到的这个版本源码中并没有相关安全策略,估计是做了更新
于是便尝试绕过
http://wooyun.org/bugs/wooyun-2010-081581
结合这个漏洞
对本地文件包含进行利用,成功包含cmis的错误日志
写了中转脚本对错误日志进行筛选匹配再观察(放到测试代码里了)
得出了如下过滤策略
经过实验,得出如下绕过策略:
尝试在中转脚本使用sqlmap,但是无奈注不动只能手动
构造出poc
例如md5(md5('admin'))='74D839D98630E280DF752E8939454A6B'
构造语句修改admin密码为admin:
就是这样,反编译OUser.class OUserpassword.class OUserrole.class观察表结构,并对改变用户函数updateRole进行追踪:
可以很容易构造出添加管理员,改变用户角色,mask一下
,exp放在测试代码里了