原创 | 代码审计入门之XHCMS
点击蓝字
关注我们
现在好像停止维护了
seay源代码审计系统
把握全局-功能分析-回溯敏感函数
把握全局
把握全局就是将整一个cms的代码文件全部通读一遍,这是一种很完整但是很耗时的审计方法,对于小cms系统,代码量不大的话还算是友好,但是对于大型的cms系统就是一项非常耗时耗力的工作,虽然这种方法可以很好地了解整个cms系统的程序逻辑。
功能分析
功能分析就是只针对cms系统的某些功能进行审计,cms的漏洞往往出在功能点上,比如登录框可能会存在SQL注入,搜索框可能存在xss等漏洞,这时候就可以针对一些常出现漏洞的点进行审计。
回溯敏感函数
PHP中存在很多危险的敏感函数,常见的敏感函数比如有可以造成文件读取的file_get_concents、include,造成RCE的eval、assert、system等危险函数,如果对这些函数使用不当或者过滤不严, 就会形成一个极大的危险漏洞。
文件分析
上面提到的功能分析,如果不知道从何下手,可以参考下面列出来的几个文件夹/文件:
/admin:管理员后台
/install:安装目录
/uploads || upload.php:文件上传目录 || 文件上传文件
/sys:可能会存放一些配置文件
config.inc.php || config.php:配置文件,通常可能会泄露mysql的信息
index.php:审计的第一口,index.php有可能会包含很多其他的功能,也是审计不可或缺的一部分
login.php:登录入口,可能是普通用户的,管理员一般是/admin/login.ph
ok,大致了解了一下流程之后,就可以开始上手审计啦!
使用seay源码审计系统对整个cms环境文件进行扫描
新建项目-选择cms的根目录-自动审计-开始
首页存在文件包含漏洞
见上图,已经扫描出了一些可疑的文件,接下来进行审计,按照上面提到的功能分析和回溯敏感函数,映入眼帘的就是index.php了,seay源码审计系统给出的描述是可能存在文件包含漏洞,是不是可能存在,双击打开看看源码审计一下就知道了。
index.php的源码非常简单,并且还很贴心给出了注释,关键点在第六行的include函数,对于敏感函数我们要看参数用户是否可控,如果可控,漏洞存在的几率又上升了一点了
首先使用GET的方式传入一个参数 r 赋值给$file,然后使用三目运算符进行判断传入的文件是否存在或者为空,如果存在就将文件名赋值给$action继续执行include('files/'.$action.'.php');如果不存在的话,就默认赋值index给$action继续执行include。
这里很明显,我们可以控制要读取什么文件,但是include是使用拼接的形式来载入文件,并且写死在files/目录下的php文件,同时还固定了文件的后缀名。虽然看起来限制挺麻烦的,但是依然可以突破这个限制,第一就是可以使用../的方式来进行目录穿越,一个../返回上一层目录,假设我在/var/www/下有一个1.php是执行phpinfo的,那么我只需要执行:http://127.0.0.1/20221220/xhcms/?r=../../1,不用加php,因为已经固定在include里了
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>
%00截断(PHP版本小于5.3.4) 使用.或者./截断 (在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃) 使用?
多个文件存在SQL注入
继续看seay源码审计系统,由于有十多个文件是admin/目录下的,通常都是需要登录admin才有权限去访问,姑且先放一边,先审计前端可以任意访问的文件,将目光看向第15行,疑似存在sql注入
双击这一行读取源码:
黄色标记的就是疑似存在漏洞的语句,从第8行开始审计,首先通过GET的方式接收一个参数cid赋值给$id,如果执行正常的话,就返回一个正常的页面,反之就使用die修正错误.mysql_error()不是很理解为啥语句错误了不执行第10行),这里漏洞就出在cid的参数可控且没有任何过滤(基本上所有传参点都是只用了addslashes函数过滤),并且还输出了mysql的错误信息,这不妥妥的sql注入了,这里可以使用报错注入。
$id=addslashes($_GET['cid']);
$query = "SELECT * FROM content WHERE id='$id'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$content = mysql_fetch_array($resul);
$navid=$content['navclass'];
$query = "SELECT * FROM navclass WHERE id='$navid'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$navs = mysql_fetch_array($resul);
//浏览计数
$query = "UPDATE content SET hit = hit+1 WHERE id=$id"; //存在sql注入的语句
@mysql_query($query) or die('修改错误:'.mysql_error());
正确查询:
http://127.0.0.1/20221220/xhcms/?r=content&cid=1
http://127.0.0.1/20221220/xhcms/?r=content&cid=1%20and%20updatexml(1,concat(0x7b,(database()),0x7d),1)
获取manger表字段:
获取密码md5值:
数据库监控:
software.php
http://127.0.0.1/20221220/xhcms/?r=software&cid=1%20and%20updatexml(1,concat(0x7b,database(),0x7d),1)
刚刚使用报错注入已经将数据的管理员账号密码给整出来了,如果管理员是一个安全意识不高的人,设置的密码是很常见那种,那么获得到的md5密码值就可以拿去破解md5的网站进行爆破,如果破解出来的话,请看下一个任意用户登录漏洞。
editlink.php
http://127.0.0.1/20221220/xhcms/admin/?r=editlink&id=-2%27%20and%20updatexml(1,concat(0x7b,database(),0x7d),1)%23
editsoft.php
http://127.0.0.1/20221220/xhcms/admin/?r=editsoft&id=-2%27%20and%20updatexml(1,concat(0x7b,database(),0x7d),1)%23
基本上后台能在线编辑的文件都存在注入漏洞,这里不一一列举了,各位师傅可以自己尝试去发现剩下的。
任意用户登录
漏洞存在于/inc/checklogin.php,用户可以自定义user从而绕过账号密码登录。
继续跟进checklogin.php,源码的意思是读取一个cookie为user的参数,如果等于空,就跳转到login.php进行登录,漏洞点出在这里,如果在知道了用户名的情况下,既可构造一个请求头Cookie: user=admin;进行登录。
自定义一个cookie然后保存
http://127.0.0.1/20221220/xhcms/admin/?r=index
后台存在xss
这个xss的利用其实挺鸡肋的,用来盗取cookie的话,也没必要了,都进后台了。
http://127.0.0.1/20221220/xhcms/admin/?r=adset
在任意广告位置输入\<script>alert(document.cookie)\</script>
前台反射性xss
漏洞文件在 /admin/files/linklist.php中
除此之外,以下文件也存在csrf:
/admin/files/commentlist.php
这个cms系统的作者好像是一个人写出来的,怎么说呢,这个cms是很久以前的,版本也是比较老,没有维护,初始版本的漏洞还挺多的,所以这个cms非常适合新手入门代码审计这一关。虽然我不是大佬,但是这篇文章可以给你带来一点点审计的思路和过程(大佬轻点喷)。
往期推荐