适合小白的全文通读xhcms练习

前言

由于我之前都是功能点和敏感函数回溯的,所以我看下新手入门的 xhcms全文通读
说难也不难,说简单也不简单(我技术菜)
准备工具:seay源代码审计工具、burp

正文

0x01.查看目录架构

拿到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读完就开始看前台文件了

0x02

前台审计,我们先去查看跟目录下的index.php 因为那个是入口

短短七行 首先是关闭错误回显,注释已经写好了,然后通过addslashes去过滤我们传入的
参数,这里我就不解释了,不懂的百度一下,就是对 / ‘ “ 加个转义
第五行就是三目运算符,间接的等于if,如果变量file等于空,则到目录首页,如果不为空,
就接受第四行传入的参数
然后再进行包含 a c t i o n , 这 时 候 action,这时候 actionaction间接的等于r的参数传入(简单的这么说一下)

也就是说r是可以被我们控制的

这时候我们可以尝试着在跟目录创建个phpinfo


这时候发现可以直接执行了,也有些人可能会不知道要跳多少下目录

这里可以看出,r传参都是在file文件夹下面,然后我们要包含的文件是在根目录下,这
时候就可以跳一层,如果实在不懂的话,那么就多执行几个 …/ 这样最简单粗暴了

这里差不多就这一个漏洞了

0x03,这里就是前端了


2~3行是配置文件,然后查询数据库,这里我们无法控制,所以就不用看了
看到下面有个我们可以控制的r传参,但是发现这里使用了addslashes,就不用看了
这种情况只能尝试字符逃逸,但是这边没有开启gbk
继续往下看,也都没有我们可以控制的参数了,那就前端莫得了,然后我们去看后端

0x04. 登录处看有没有


好家伙,登录处又来了个文件包含,跟前面那个差不多,这不过这里多跳一下就到了
这边思路也是一样的,通过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也不咋地,审计这玩意就是,看到陌生函数先看是不是自定义的,然后再去百度一下,就懂啥意思了

然后像这种小型的cms看着还好,像其他代码量大的,我脑瓜子都要看懵逼了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值