由于我之前都是功能点和敏感函数回溯的,所以我看下新手入门的 xhcms全文通读
说难也不难,说简单也不简单(我技术菜)
准备工具:seay源代码审计工具、burp
拿到cms的第一步就是看下cms的架构,看各个文件之间都是干哈的
Index.php 是入口文件
Admin文件夹
Css 就不说了,看着好看的玩意
Files 这里应该就是前台的功能点
Images 一些没用的图片
Inc一般都是配置文件
Install 是安装文件
Seacmseditor 第三方编辑器,seacms是海洋cms
Template 模块
Upload 一般都是上传的图片地址
Index.php是前端的入口函数
从这图可以看出,cms全文通读就是这样开始审计的,然后前台再依次细细划分
这里我们就从 install文件夹开始
我们进入install/index.php
Seacms.sql是导入数据库的文件,也就是说没有的话就会导入
首先是关闭错误回显,然后通过header来进行编码
然后if判断是否存在installlock.txt,如果有,则输出你已经安装过了,然后就exit
这个if可以跳过,因为我们还没安装
这时候就是变量,然后这些变量全是由post包提交的,由于英语不好,我们可以先进入看下页面是怎么样的,然后把这些参数一一对应
一一对应上了,save应该就是按钮【确认正确并提交】
然后进入接下来的判断语句
$save不等于空,应该就是不能为空,然后才执行下面的玩意儿 QAQ
好家伙,这里是包含了个配置文件呢,我还以为怎么就突然要new个对象出来
好长,但我丝毫不慌,QAQ
定义一个 dbmanage的类,然后定义属性啥的,还有什么私有公有的,直接理解为变量就可以了,整这么花里胡哨的
然后就是构造方法,那个construct是构造函数,当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的
然后看看备注就行了,这里没啥好看的了
再返回看刚刚的代码
这里就是导入 seacms.sql数据库
然后就是连接数据库
通过52行,又包含了个配置文件
然后发现这个配置文件就是 连接的地址,用户名,密码,库名
Fopen就是写入,然后再输出连接配置成功
丝毫不慌,重点来了,连接数据库,发现这边用mysql_error()
看来这里是存在报错注入了,我们继续往下看,看哪个变量可以被我们控制
看到第63行
发现 user,password,name都被执行了,这时候我们就可以抓包,尝试报错注入
"UPDATE manage SET user='$user',password='$password',name='$user'";
我们就拿user来测,先闭合单引号
"UPDATE manage SET user=''or $user or‘',password='$password',name=
'$user'"
也就是说,我们加个 ‘or $user or’
就可以了
那么就实操
' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or'
成功的构造处payload并执行
然后install方面也就没什么问题了,install读完就开始看前台文件了
前台审计,我们先去查看跟目录下的index.php 因为那个是入口
短短七行 首先是关闭错误回显,注释已经写好了,然后通过addslashes去过滤我们传入的
参数,这里我就不解释了,不懂的百度一下,就是对 / ‘ “ 加个转义
第五行就是三目运算符,间接的等于if,如果变量file等于空,则到目录首页,如果不为空,
就接受第四行传入的参数
然后再进行包含 a c t i o n , 这 时 候 action,这时候 action,这时候action间接的等于r的参数传入(简单的这么说一下)
也就是说r是可以被我们控制的
这时候我们可以尝试着在跟目录创建个phpinfo
这时候发现可以直接执行了,也有些人可能会不知道要跳多少下目录
这里可以看出,r传参都是在file文件夹下面,然后我们要包含的文件是在根目录下,这
时候就可以跳一层,如果实在不懂的话,那么就多执行几个 …/ 这样最简单粗暴了
这里差不多就这一个漏洞了
2~3行是配置文件,然后查询数据库,这里我们无法控制,所以就不用看了
看到下面有个我们可以控制的r传参,但是发现这里使用了addslashes,就不用看了
这种情况只能尝试字符逃逸,但是这边没有开启gbk
继续往下看,也都没有我们可以控制的参数了,那就前端莫得了,然后我们去看后端
好家伙,登录处又来了个文件包含,跟前面那个差不多,这不过这里多跳一下就到了
这边思路也是一样的,通过r传参,来调用file文件下面的内容
Ob_start() 函数一般是用来获取 页面的执行结果的,可以用来作缓存 或者 Ajax 调试时的追踪
然后包含conn.php,这里面是连接数据库的文件
然后就是login,user,password,checkbox
通常不知道啥玩意点开抓包看一下,俗话说:burp在手,天下任我走
User就是用户名
Password就是密码
Checkbox是记住一个月
Login就是登陆按钮
从源码中可以看出 $user 没有一点点过滤
这里也用了 mysql_error() ,所以就可以用报错注入,不然的话就得用盲注了
mysql_num_rows() 是获得结果集中的内容
(不懂php+mysql的可以去看看《PHP从入门到精通4》)
有的话则执行这条if,但是前面加了个!,可以看成小学中的 绝对值,意思就是取反
那就说明只有当这个函数没有值的时候才会执行
然后就exit() 退出,不执行接下的内容
然后下面是判断两个密码的 md5值是否相等,如果不相等就退出,并报错
虽然不能进入后台,但是这边存在报错注入
然后接下来就没啥了,这里的话
然后 admin/file/index.php 里面也就没有什么可以控制的传参
所以我们就得看看一下其他页面的内容了
因为这个文件是多入口文件,也就是说每个页面会有一个php文件
所以我们看这个file下的文件
关键代码在这
这边有个addslashes,看来是过滤了其中的传参,但是没事
这边没有过滤xss,也没有过滤csrf,至于csrf就不演示了
我们直接进入后台找到这个页面,这个应该是广告页面
或者直接在r后面传参这个页面名字就可以了
这时候我们再去前台查看这个页面,就会发现成功弹窗
然后下面就是html页面了,没意思,接下来就继续看第二个页面,看看columnlist.php有什么洞
第一个是检查是否登录,第二个包含配置文件
然后传参get
这时候$delete 不等于空,也就是我们的传参delet不为空时,就会执行下面那玩意儿
这边也没用,被单引号包围了
然后差不多就这样继续看下去了,因为每个页面都差不多的
(主要是我比较懒,xhcms的每一个页面对应一个PHP文件,所以对新手玩家很友好)
然后我的PHP也不咋地,审计这玩意就是,看到陌生函数先看是不是自定义的,然后再去百度一下,就懂啥意思了