首页 > 其他分享 >代码审计入门之XHCMS

代码审计入门之XHCMS

时间:2023-09-05 16:22:22浏览次数:41  
标签:审计 文件 入门 admin 漏洞 XHCMS php cms

啥是xhcms

熊海CMS 是由熊海开发的一款可广泛应用于个人博客,个人网站,企业网站的一套网站综合管理系统,采用了前后端整套,只需要环境Apapche+Mysql+PHP5即可开箱即用。

现在好像停止维护了

工具准备

  • seay源代码审计系统

环境安装

环境下载:https://www.lanzoux.com/izeFjfxbxah

安装请使用php5版本,本次示例使用php5.5.9,将文件放到网站的根目录,在浏览器打开网站即可安装。

wKg0C2OhZymASCEGAADk2T4Q1wE692.png

代码审计

审计的方式大致可以分成:把握全局-功能分析-回溯敏感函数

把握全局就是将整一个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.php

审计开始

ok,大致了解了一下流程之后,就可以开始上手审计啦!

使用seay源码审计系统对整个cms环境文件进行扫描

新建项目-选择cms的根目录-自动审计-开始

wKg0C2OhZ9OAYv2AAACS71yTIE258.png

wKg0C2OhaA2AToM4AAH3HfkbLS8339.png

见上图,已经扫描出了一些可疑的文件,接下来进行审计,按照上面提到的功能分析和回溯敏感函数,映入眼帘的就是index.php了,seay源码审计系统给出的描述是可能存在文件包含漏洞,是不是可能存在,双击打开看看源码审计一下就知道了。

wKg0C2OhbMqAXyi3AABp2r5PSVQ008.png

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'); //载入相应文件
?>

wKg0C2OhdDSABlJfAAB3qjeHTg148.png

可是我们不一定能保证网站有php文件,所以这个时候就得想办法读别的文件了,但是文件后缀名又被固定住了,读取/etc/passwd时,会自动添加.php变成/etc/passwd.php,这里可以用

  • %00截断(PHP版本小于5.3.4)
  • 使用.或者./截断 (在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃)
  • 使用?

但是有一些是有版本或者功能限制的,就比如00截断,现在基本上很难见到了,如果突破了这一层的限制,那么就可以通过包含日志文件或者session文件写入shell。

该漏洞修复也很简单,在不改变源码的情况下,可以在index.php或者php.ini中添加一行ini_set('open_basedir','files/')即可;

继续看seay源码审计系统,由于有十多个文件是admin/目录下的,通常都是需要登录admin才有权限去访问,姑且先放一边,先审计前端可以任意访问的文件,将目光看向第15行,疑似存在sql注入

wKg0C2OheiWAJn6EAABG7Ujyts291.png

双击这一行读取源码:

wKg0C2OhekAFFKJAAEJmJ7Hqns855.png

黄色标记的就是疑似存在漏洞的语句,从第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

wKg0C2OhfSuACrUCAADoObCshjw314.png

报错注入:

http://127.0.0.1/20221220/xhcms/?r=content&cid=1%20and%20updatexml(1,concat(0x7b,(database()),0x7d),1)

wKg0C2OhffOAXgVDAAA75Qd199I684.png

获取manger表字段:

wKg0C2OhgTKAbAe3AABI6JeGBeg769.png

获取密码md5值:

wKg0C2OhgeSAdAH8AAA0Xp4H3d4712.png

数据库监控:

wKg0C2OhntKATqjNAAEKzcAy2N0825.png

同样的,存在SQL注入的文件不仅仅只有这一个:

software.php

http://127.0.0.1/20221220/xhcms/?r=software&cid=1%20and%20updatexml(1,concat(0x7b,database(),0x7d),1)

wKg0C2Ohh7CAFMyIAAC1FDQw9l8850.png

刚刚使用报错注入已经将数据的管理员账号密码给整出来了,如果管理员是一个安全意识不高的人,设置的密码是很常见那种,那么获得到的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

wKg0C2OhnGGANQeaAAAz93r4upI528.png

wKg0C2OhnJuAW0LUAABlAROQsok920.png

没有任何过滤,可以直接联合注入。

editsoft.php

http://127.0.0.1/20221220/xhcms/admin/?r=editsoft&id=-2%27%20and%20updatexml(1,concat(0x7b,database(),0x7d),1)%23

wKg0C2OhnRaAHLOGAAC2My1GzuI484.png

wKg0C2OhnSOAcDrLAAA6m7dm7Q837.png

基本上后台能在线编辑的文件都存在注入漏洞,这里不一一列举了,各位师傅可以自己尝试去发现剩下的。

漏洞存在于/inc/checklogin.php,用户可以自定义user从而绕过账号密码登录。

登录页面是/admin/login.php,这里使用了POST接收了两个主要的参数:user和password,传进来后,进入第9行进行判断,如果不等于空的话,就放入数据库中查询,查询有改用户时继续跳转到第18行,使用数组将该用户的password提取出来,然后使用md5值进行比对,正确的话,设置一个user=$user的cookie然后自动跳转到/admin/index.php。

wKg0C2OhjKSAeFlgAADa0x8JPA476.png

继续跟进登录成功后跳转到的index.php,发现包含了一个checklogin.php的文件

wKg0C2OhjeCAfxOuAACtol8BRjY297.png

继续跟进checklogin.php,源码的意思是读取一个cookie为user的参数,如果等于空,就跳转到login.php进行登录,漏洞点出在这里,如果在知道了用户名的情况下,既可构造一个请求头Cookie: user=admin;进行登录。

wKg0C2Ohi9KABNnBAABLHkr05Ak570.png

自定义一个cookie然后保存

wKg0C2OhkRWAJl44AABQcJUJg428.png

保存后直接访问index.php,然后发现已经绕过登录了。

http://127.0.0.1/20221220/xhcms/admin/?r=index

wKg0C2Ohll6AQDNiAACsEsctPIw201.png

这个xss的利用其实挺鸡肋的,用来盗取cookie的话,也没必要了,都进后台了。

http://127.0.0.1/20221220/xhcms/admin/?r=adset

wKg0C2OhlzAGDjAACa97UcxqE291.png

wKg0C2Ohl1aAdtkNAABYGHKLyLc139.png

在任意广告位置输入\<script>alert(document.cookie)\</script>

wKg0C2Ohl6yASihmAADBhq1kPFo050.png

还有一个前台的反射性xss在/files/contact.php中

通过传入page,任何直接拼接在page中,可造成xss

wKg0C2Ohot2AJbkfAACtt5uE2kc466.png

http://127.0.0.1/20221220/xhcms/?r=contact&page=%3Cscript%3Ealert(/by_vFREE/)%3C/script%3E

wKg0C2OhoxaAEVihAAClauCK9CU398.png

漏洞文件在 /admin/files/linklist.php中

wKg0C2OhpHiAZLvkAABnm3JlRUU752.png

删除连接时,没有任何有效的验证,点击即可删除,根据这种特性,可以构造恶意连接诱导其他用户点击。

wKg0C2OhpcSAIqpoAACrljA7AKc597.png

除此之外,以下文件也存在csrf:

/admin/files/commentlist.php

总结

这个cms系统的作者好像是一个人写出来的,怎么说呢,这个cms是很久以前的,版本也是比较老,没有维护,初始版本的漏洞还挺多的,所以这个cms非常适合新手入门代码审计这一关。虽然我不是大佬,但是这篇文章可以给你带来一点点审计的思路和过程(大佬轻点喷)。

带带我怎么了!!!_带带_怎么表情

标签:审计,文件,入门,admin,漏洞,XHCMS,php,cms
From: https://www.cnblogs.com/SecIN/p/17679976.html

相关文章

  • IIncrementalGenerator 增量 Source Generator 生成代码入门 从语法到语义 获取类型完
    本文告诉大家如何在使用IIncrementalGenerator进行增量的SourceGenerator生成代码时,如何从语法分析过程,将获取的语法Token转换到语义分析上,比如获取类型完全限定名。一个使用的例子是在拿到一个Token表示某个类型时,本文将演示通过语义分析获取到拿到的Token的Type类......
  • Android入门教程 | DialogFragment 的使用
    弹窗,是常见的一种提示方式。DialogFragment是在3.0时引入的,是一种特殊的Fragment,用于在Activity上展示一个模态的对话框。DialogFragment示例确定UI样式首先我们得知道做成什么样。一般来说简单的弹窗是一个标题,一端文字内容。或者带有一两个按钮。这里我们做一个有标题和文字......
  • CentOS Linux release 7.6.1810 Zabbix 4.2 快速入门与实践:构建强大的企业级资源监控
    目录:0x00Zabbix介绍0x01Zabbix安装0x02Zabbix配置0x03Zabbix-Web配置与使用0x04Zabbix实战配置0x0nZabbix入坑配置0x00Zabbix介绍描述:zabbix是一个开源的企业级性能监控解决方案,可以实时监控服务器/网络设备等硬件资源与其相关的各项指标是否是正常的,而且能够更加方便......
  • MySQL入门系列2-数据控制语言(DCL)
    一、概念DCL数据控制语言,用来管理数据库用户、控制数据库的访问权限。二、查询用户select*frommysql.user;其中Host代表当前用户访问的主机,如果为localhost,代表只能够在当前本机访问,不可以远程访问的。User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯......
  • 软件测试|Django 入门:构建Python Web应用的全面指南
    引言Django是一个强大的PythonWeb框架,它以快速开发和高度可扩展性而闻名。本文将带您深入了解Django的基本概念和核心功能,帮助您从零开始构建一个简单的Web应用。什么是Django?Django是一个基于MVC(模型-视图-控制器)设计模式的Web框架,旨在简化Web应用程序的开发过程。它由Django软......
  • 【Kafka系列】(一)Kafka入门
    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址系列文章地址Kafka是什么?一句话概括:ApacheKafka是一款开源的消息引擎系统什么是消息引擎系统?消息引擎系统(MessageBrokerSystem)是一种中间件软件或服务,用......
  • 入门篇-其之二-Java基础知识
    目录对第一个Java程序的思考外层结构——类内层结构——main方法输出语句注释单行注释多行注释文档注释文档注释常用标签使用javadoc命令生成网页风格的文档阿里巴巴Java开发手册关于文档注释的规范关键字标识符变量变量的概念定义并初始化变量使用变量的注意事项对第一个Java程......
  • Python入门 - 推导式
    推导式是什么?用于创建容器对象的一种语法,主要用于创建list,dict,set,tuple。 1,list推导式遍历+条件+产生的元素,用[]包装产生的每一个元素,其中条件是可选的。my_list=[1,2,3]result=[elem+1foreleminmy_list]print(type(result),result)#<class'list......
  • Socket.io入门
    Socket.io入门根据官方文档socket.io使用必须客户端根服务端一致,socket.io不兼容webSocket或者其他模块,因为socket.io在连接时做了自定义处理,所以不同的长连接npm模块并不互通首先安装npm包:客户端(vue):[email protected]服务端(express):npmisocket.io@4......
  • Zookeeper入门
    简介ZooKeeper是Apache软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。可以理解为zookeeper是文件系统+监听通知机制。ZooKeeper的架构通过冗余服务实现高可用性。Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服......