毕业设计临近啊~ 要检查了~ 赶紧去网上扣了几套SSM的论坛程序。顺手就审计了一下。
源程序下载地址: http://www.mycodes.net/143/9369.htm
官网: http://bbs.javaee.cc/
审计出来之后就赶紧跑去官网测试。谁知道,不能注册。于是找了其他的站点进行了复现~
这个是黑盒测试出来的,因为用了Ueditor的富文本编辑器。然后直接构造了payload,导致帖子正文xss
直接发帖->将富文本切换为HTML源代码编辑->发帖->查看帖子->触发正文xss
这里是因为输出的时候没过滤。导致的xss。先讲利用方法:
修改个人资料处,修改真实姓名为payload
前台访问会员个人资料处,触发
后台管理员再次触发
我们再来看一下更新的SQL语句
在入库的时候完全没做任何过滤,我们跟踪一下更新的方法。
eclipse跟踪一下方法
直接把前端表单传入的值放到了user这个类中,然后执行update方法,在跟一下service层
没有进行任何过滤。
然后看下sql语句
确实是没做啥过滤,直接入库了。然后从从数据库把内容拿出来渲染到页面上,也没做任何过滤,所以造成了xss
触发的原因主要还是因为拼接了SQL语句。在mybatis框架中用了“#”符号才会预编译,用“$”符号就会拼接SQL语句了,如果这部分用户可控,那么就会造成SQL注入了,有人可能会问那我写SQL语句的时候全部用“#”号不就行了吗,这种想法是错误的。因为在某些常见场景下你必须要用”$”符号来进行SQL拼接,不然mybatis框架会报错。例如 like,in此类查询的时候就必须要用到“$”符号。详细可以看看这篇文章
https://mp.weixin.qq.com/s?__biz=MjM5OTk2MTMxOQ==&mid=2727827368&idx=1&sn=765d0835f0069b5145523c31e8229850&mpshare=1&scene=1&srcid=0926a6QC3pGbQ3Pznszb4n2q
这里的话,我们先来看下程序员对于所有的语句是怎么写的,查找一下用到了$符号的场景。
在JifenMapper.xml中看到了这处,其实还有很多处
然后全局搜索调用这个方法的类,因为大部分程序员是有规范的。我就发现了在JifenContriller这个类中调用了findpage这个方法
我们再来看下代码层,有没有做过滤。
还是直接一步传入,然后在入库的。
现在我们来分析入口在哪,
我们可以看到,从方法的定义来看,访问链接为 /user/jifen/index.do ,传入的参数是来自jifen,page两个类。那么,我们来看下jifen跟page这两个类有什么属性。
在Jifen这个类中,我们可以看到有着跟前面SQL语句中对应的字段,也就是说,starttime跟endtime这两个字段是用户可控的。
然后我们把它跑起来,查看这个请求是在哪个点触发的。经过测试之后,发现触发点是在积分搜索处触发的。
点击查询,抓包。
经过上面的分析,我们能确定是这个入口点了。然后先走一遍正常请求。
SQL日志:
打个单引号,看看~
看下SQL日志:
根本就没进库。
然后看下控制台,有我们熟悉的mysql语法报错了,确定了没过滤了。
构造payload
starttime=2018-09-13'or 1=1 or'&endtime=2018-09-20&type=1
跑出数据库
因为官网注册不了,于是找了其他站点做了测试。同样是成功注入出来的。
跑出了user():root@localhost
对于注入这些的敏感点,还是要注重写代码层的防御。