代码审计-Mini CMS
0x01 前言
依然是比较小众且N年前已经停止维护的CMS。
0x02 环境
lamp+Mini cms
安装的时候将install.txt后缀改为php即可。
简单看了一下关于这个cms的介绍,这个cms属于轻量级个人网站,不需要数据库支持,没有成员和权限评论插件什么乱七八糟的功能,类似于hexo,但是不同于静态博客,它是动态的,这里不说它的优缺点,因为这不是重点。
0x03 代码审计
安装结束后,install.php文件会自动删除,所以不存在重装漏洞。
保存的文章会在/mc-files/posts/data/下,格式为.dat
mc-admin/head.php-越权
我们查看一下登录模块
index.php
代码包含了mc-conf.php文件,该文件中是网站配置信息,后台账号密码等
然后是判断token是否和预设的相同,token是使用admin账号密码组合成的字符串md5。如果相同则跳转到post.php,cookie用于持久维持在线状态,下面的判断则是用于首次登陆。
如果登陆成功会跳转到post.php.我们看一下post.php的内容
post.php中有一个函数delete_post()
此函数对应着删除功能。
我们先想一下正常逻辑:应该是先登陆,判断登陆账号的权限,然后再执行相应的功能。
我们看一下post.php是否做了权限判断
post.php
搜一下关键字token
未找到,还有一种可能就是在他包含的文件中存在校验。那我们找第二个关键字include/require
第一个
这个我们分析过了,下一个
第二个
我们没分析过,拉出来看看
head.php
刚开始就是权限判断,我们不看下面的代码,这里使用的token机制依然是登陆模块的机制,所以无法绕过。
但是。
php作为一种没有程序入口的语言,肯定是从上往下执行的。那么问题就来了,在post.php中,第188行才包含了文件head.php,但是 delete_post() 函数在第33行就已经执行了。所以这就导致了越权漏洞。
我们来试一下,退出登录,由于没有退出这个功能,所以只能使用清除cookie 的方式退出。然后构造请求,请求如下
文件已删除
post-edit.php/conf.php-存储型xss
直接看代码:
这里的变量$post_content 为文章主题,由于未做html特殊符号转义,所以导致了存储型xss。对变量content的处理为检测magic_quotes_gpc是否为on状态,如果是on状态,则执行stripslashes()函数,删除addslashes()函数的转义操作。但是这里的代码仅仅做了删除操作,如果 magic_quotes_gpc 为off状态呢,既没有对特殊字符做删除反斜杠处理也没有对特殊符号进行过滤。这就导致了存储型xss的产生。就算是on状态,代码也是删掉了转义符,也没有进行过滤。所以xss无论如何都存在。
简单测试:
点击文章触发xss。
同样的漏洞也存在于conf.php文件
熟悉的操作嗷
此xss在点击文章的时候会被调用,所以点击文章即可触发。
这个cms差不多就这俩漏洞了。因为本身非常轻量级,功能也少,没涉及到数据库。所以漏洞也不是很多。
0x04 漏洞修复
越权
这个简单,把包含的php文件挪到php代码最上层即可
来试一下:
漏洞已修复
存储型xss
原因在于没有过滤,那么增加一次过滤即可
再试一下:
ok修复
0x05 结语
目前准备做10??个php的cms,这是第二个。