Mao10CMS V6 两处过滤不严可导致XSS、CSRF、XSS Wrom
0x00 前言
虽然手速没有别人快,漏洞也比较简单,还是把过程贴出来慢慢努力吧
- 官网v6.1.6版本,http://www.mao10.com/?m=post&a=single&id=44
- 测试环境docker wnameless/mysql-phpmyadmin(apache2,php5,mysql5)
由于该cms第一个注册的用户默认是管理员账户权限较大,其他用户再未特殊的设置下均为普通账户,在测试时需加以注意。(如下说明中admin为管理员账户,larry0x为普通账户)
0x01 第一处XSS
在黑盒测试当中,普通用户登陆后在进入个人主界面,在发表动态处未对输入及输出进行过滤,可导致客户端的代码攻击:
黑盒逆向追踪源代码分析如下:
右键源代码之后可以发现232~244为form表单进行动态内容的提交
在do/activity.php的1~17行有:
其中将post的content直接传递进入hmset进行数据库的操作,跟进在mysql.php中的409~439行讲保存数据的数组进行了自定义的序列化之后插入数据库:
跟进do/function.php的50~57行,这里只是简单得序列化压缩编码保存进入了数据库:
至此我们的恶意输入已经保存在了服务器上。
由于所有的用户动态都会反应在页面坐下脚的“最新动态的面板”当中,让我们继续看看此处的输出是否有过滤。
在全局搜索“最新动态”的div的class名“activityShowList”,可发现该模板页面在theme/default/activity.php当中,再次全局搜索activity.php的调用,发现theme/default/footer.php会对其进行包含,而footer.php在模板页面中均会被包含。
下面定位到theme/default/activity.php的1~39行:
其会取出最近5次的用户动态,并在第35行中调用hget方法对动态的内容进行输出。
在mysql.php的366~372行当中也是对其内容反序列化后就返回结果,最终传递到模板当中:
所以整个参数的传递过程中从入库到出库都未进行过滤直接输出后即可导致恶意的客户端代码执行。
0x02 第二处XSS
第二处的XSS存在与发布文字的话题处,此处可由用户创建任意的话题,此处也未对恶意输入进行过滤并输出,进而导致客户端代码的可执行性,在查看文章和主页显示最新文章时都可触发:
首先在发布文章处右键源代码,定位到486~517为创建话题的form表单:
随后跟进到do/pubform-topic.php文件中,在1~37当中:
由于没有POST id值,直接进入21行的逻辑,虽然在第26,27行对提交的内容有严格的过滤,并在29行对数据进行序列化存储到数据库当中。但注意到在第25行则是直接对POST的话题title插入到zset表当中,而未进行任何过滤:
由于最后的输出点在主页的热门文章当中,我们来看看输出情况是如何的,定位到theme/default/index.php中的56~62行:
在58行中通过maoo_term_title获取文章话题的title,跟进do/function.php的918~926行:
这里直接通过zscore函数从zset表中获取对应的content,最后输出到页面中:
0x03 危害
以下均已最新动态的处的xss为例,当然在热门文章处也是可以利用触发的,原理相同
XSS
最简单的打cookie喽:
不过在利用时会有一些限制,在do/function.php的426~497行当中:
这里使用token登陆我是没有找到其他的逻辑,所以就受限于485行的验证ip了,若达不到ip的话就只能进行IP伪造(该cms存在该缺陷)去暴力了
其他有趣的玩法比如插入<script>document.location="http://www.baidu.com";</script>
就可以“恶意跳转”啦,其他的可以自己发挥~
CSRF
在这里附送一个CSRF,在用户主页当中,存在一个删除用户动态的链接:
接着让我们定位到do/delete.php的229~238行:
在第231行虽然对权限进行了判定,只有管理员可以删除,但是并未对来源进行限制,因此可以对管理员进行CSRF攻击删除所有用户的动态信息,利用代码类似如下:
XSS Worm
由于在最新动态处都会显示最新的5条动态信息,并且是包含在模板页面当中的,也就说任何用户登陆后即可加载我们插入的js,进行恶意操作,这里我以关注对应用户和发布动态(维持Worm状态)为例,js代码如下: