最高权限,我们先感受一下
a.png

状态:已修复

注入点

这次的目标是某校云课堂,找了一圈发现了它的FAQ界面http://x.edu.cn/faqManageController/FaqDetailForUser的搜索框存在注入点,引号报错:
b
从报错信息可以看出是spring后端,sqlmap level5都搞不了,看来只能手工注了,脚本小子是没有前途的2333

山重水复疑无路

根据log信息可以还原出查询语句:

select count(0) from 
(select * from
    (
        select a.sort,b.*
        from faq_question_group_realation a
            join
            frequently_asked_questions b
        on
            a.faq_id = b.id
        where
            a.faq_role_id = '4a32a2cff5db11e7a6ac000c2974f54a'
        and
            a.question_group_id = '23b1e460f5db11e7a6ac000c2974f54a'
        order by
            a.sort
        ASC
    )c  
    WHERE question like '%[CONTROLABLE]%'
) tmp_count

返回4个字段,可以控制[CONTROLABLE]的值,fuzz了半天发现这个过滤非常的变态:

  • 不允许注释
  • 不允许写文件
  • 不允许sleep,benchmark,user,database等敏感函数(盲注、报错注入GG)
  • 不允许访问information_schema
  • 不允许恒真或恒假表达式出现在where中(静态检查,可以通过rand()<1绕过,这个很关键)

看了看返回的报错怀疑是用的mybatis+druid,自带几乎过滤了所有东西基本上无从下手。唯一可以绕过的就是where表达式,这给了我们闭合引号的机会。构造payload:

1' union select [..] from [..] where [..] and rand() < '1

这样组合起来就是

...WHERE question like '%1' union select [..] from [..] where [..] and rand() < '1%'

and后值恒真但是却绕过了静态检查,从而闭合引号可以有数据库读取权限,但是这里有个问题由于不允许敏感函数以及不允许访问information_schema表我们不能获得数据库名、表名等信息,必须明确知道表和字段名才可注入。

柳暗花明又一村

本来到这里基本上没办法下手了,猜了几个表名都不存在,然而脑抽了一下在谷哥上试图以关键字starmooc搜索,没想到真就从github上找到了残缺的源码!?白盒就有说法了,虽然没有faq界面的源码不过问题不大我们的目标也不是这个,mooc的dao层一看果然是mybatis。

有了源码数据库结构基本就清晰了,用户信息存的表原来叫user_account而不是user23333,不过很遗憾直接尝试依然是错的,然而出错信息starmoocfaq.xx doesn't exist其实已经泄漏了数据库名,由于正常人数据库一般都是一个服务器上的,且应该不会一库一用户,试试去掉faq

1' union select * from starmooc.user_account ui where ui.id<10 and rand() < '1

哈哈,返回different number of columns!说明我们注入基本成功了,稍微改一下payload:

1' union select null,null,t.password,null,null from starmooc.user_account t where t.login_name='admin' and rand() < '1

即可爆出admin密码(注释说好了的加密存储呢??),瞬秒。

Next?

由于云课堂与教务系统是对接的,因此我们有可能横向渗透拿到教务系统的最高权限,这里就不说了:)

修复

官方修复很暴力直接把FAQ界面删了……这也太粗暴了8……

总结

mybatis的SQL过滤其实是半自动的,并不能一劳永逸,如果不用#预编译的话本质还是字符串拼接,而字符串拼接很难做到完全,比如这个案例中过滤几乎完美了druid起了很大作用,但是还是可以绕过。
这里再次说明了先验信息的重要性,没有数据库结构只能靠猜表名,成功率很低,再次印证了最危险的还是人,社会工程学赛高!

时间节点

2019-06-27 漏洞初次发现
2019-06-28 漏洞上报,厂商确认,优先度严重,rank 8/10(这才8分woc)
2019-07-05 测试发现漏洞已修复
2019-07-06 漏洞公开

最后修改:2019 年 10 月 21 日 02 : 30 AM
如果觉得我的文章对你有用,请随意赞赏