BlueCMS 简单入手的代码审计

地球胖头鱼 2020-11-09
Web安全 发布于 2020-11-09 10:18:41 阅读 39 评论 0

前言

大家好,这里给大家介绍一个框架BlueCMS,这个工具一直都是PHP代码审计入门非常好用的代码审计入门极品。这次配合一个案例来进行学习。提前说一下我说的代码审计方法是针对代码基础比较薄弱的人进行的人来说的,大佬们不要来喷我有不对的可以指教。

什么是CMS

可能很多人一直说CMS但是可能一直都知不道什么意思,CMS又称网站系统,主要用途是为了节约网站开发的成本而开发的建站系统。早期的网站系统一般叫自助建站系统。

系统框架

1. C/S架构
C/S(client/server)架构,即客户端服务器端架构,是一种典型的两层架构,客户端包含一个或多个在用户电脑上运行的程序。而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。

C/S架构也可以看作是胖客户端架构。因为客户端需要实现绝大多数的业务逻辑和界面展示。这种架构中,作为客户端的部分需要承受很大的压力,因为显示逻辑和事务处理都包含在其中,通过与数据库的交互来达到持久化数据,以此满足实际项目的需要。

2. B/S架构
B/S架构(browser/server),即浏览器/服务器结构。Browser指的是Web浏览器,极少数事务逻辑在前端实现,主要事务逻辑在服务器端实现。Browser客户端、WebApp服务器端和DB端构成所谓的三层架构。B/S架构的系统无须特别安装,只要有Web浏览器即可。

B/S架构中,显示逻辑交给了Web浏览器,事务处理逻辑放在了WebApp上,这样就避免了庞大的胖客户端,减少了客户端的压力。因为客户端包含的逻辑很少,因此也称为瘦客户端。

环境需要

  • PHPstudy
  • BlueCMS v1.6 sp1源码
  • 代码审计工具(Seay源代码审计系统)

过程

我们拿到一个CSM,有很多审计方式,常用的就是黑盒测试+白盒测试。我这里比较偏向黑盒的代码审计,拿到代码后我们应该先对其功能进行分析,看一下该CMS存在哪些功能,我们找漏洞肯定是从网站中的正常功能进行测试,这是黑盒测试的一个方法。挖漏洞的核心在于传参,知道每个传参的意义就等同于知道代码会做什么要做什么。

下图是BlueCSM v1.6 sp1的功能特点:

正常来说我们拿到一个CMS第一步先要进行一个安装,正常而言CMS的源码放入web目录下后我们会访问install目录,然后进行安装。这里安装完成以后我们是不是该开始拿一个黑客的角度来进行思考了,我们马上应该想到是否能够再次访问install目录,进行重新安装呢?如果能够进行重新安装,是不是就可以将整个网站的数据全部重装,然后拿到设置新的管理员账号,然后通过后台拿到webshell?

带着问题去访问这个页面,发现访问正常而且可以进行重新安装:

于是第一个问题就出现了,然后我们再看一下这个网站一般而言网站都有展示类和功能类。那很多人就会问了展示类有什么,功能类又有什么呢?

  • 展示类:新闻站、门户站
  • 功能类:商城、OA办公系统、其他系统

但是无论是展示类还是功能类如果我们能拿到一个普通用户的权限是不是会更加容易进行渗透测试,测试点会不会更多。

有了这个想法我们应该去实施一下,注册一个账号:

在注册账号的时候我在想有提交表单,是不是可以试一下XSS,我们先注册账号然后输入用户名,我们使用BP抓包

很明显这个数据包是用来检测你的用户名是否有人注册过,那么我们是不是可以通过爆破user_name传参进行爆破出用户名。(爆破出用户名后爆破密码更容易)

然后填完所有内容,提交,然后抓到了数据包,我们发现是被提交到user.php

然后我们通过代码审计工具去找那个文件

在传参中我们看到了我自己输入的账号|密码|邮箱|验证码,然后最后出现了一个act传参,打开这个user.php我们可以看出这个文件有好几个功能,act就是决定我的数据包是干什么的传参,于是乎复制这个传参值去源码中寻找这个传参

这段源码就是关于你的注册,我们可以看到INSERT INTO 插入,然后我们看是否存在过滤,很明显这里没有过滤,那么我们尝试进行XSS以及SQL注入。

先抓包,正常的填写注册,然后将数据包拦截(这是为了防止前端检测)

修改数据包,加入XSS语句,我是在邮件的地方加的。

然后惊喜的发现成功弹窗:

事实证明这里存在一个存储型XSS,然后我们再去看看SQL注入

这很明显是他的SQL语句,然后我们尝试使用updatexml的报错

构建下payload:

‘ or updatexml(1,concat(0x7e,(SELECT database())),1),1,1)#

然后执行,居然成功执行了。没有过滤?居然能成功执行,说明单引号没有起作用,是不是存在魔术引号?试试宽字节:

%df’ or updatexml(1,concat(0x7e,(SELECT database())),1),1,1)#

然后成功报错

很明显这里存在SQL注入,但是这里神奇的很,我这里报错说语法错误,我直接去本地执行却没问题!源码中对报错做了限制。只能通过盲注来解决.

我们仔细思考,这里是一个插入语句,那么我们是不是可以尝试插入多行数据,我们通过语句构建,再建立一个用户,然后用子查询填充邮箱处,然后我们登陆这个账号是不是就可以看到邮箱字段里面的内容,走,说干就干!!

构建payload:

%df’,1,1),(100,0×6162717765,md5(123456),(select database()),1,1)#

闭合原本的语句,然后再插入一条数据,然后执行成功.

然后登陆账号很明显库名在邮箱处显现,我们在用相同的办法试一下登陆页面看看存在SQL注入吗。

还是那个文件,就是act变为了index_login

还是老样子,没有任何过滤,我们试一下万能密码:

%df’) or 1=1#

你会惊奇的发现万能密码登陆成功,万能密码登陆成功也就是说存在POST类型的注入,尝试使用SQLmap开始跑数据包,在PWD字段

然后登录后修改资料处也存在SQL注入和XSS

然后我们看到了别人的文章,我们看到我们可以评论

然后果断评论,我尝试了不登录也是可以评论,然后我们抓包看一下:

查看文件会发现有一个滤,Htmlspecialchars会将尖括号转化为HTML实体,那么不能出现尖括号,w我们发现传参里面有Ip,留言中记录ip都是常规操作。那我们看到了他实际上插入了ip的值是特意拼接是,是由这个自定义函数设定getip()。我们找到这个函数的定义,这里有一个getenv,实际上就是获取系统的环境变量.

那么问题来了,我们似乎可以控制请求头中的X-Forwarded-For控制ip的传参,ip的传参会直接被拼凑到SQL语句,废话不多说开始注入,设置X-Forwarded-For1然后出现报错,因为这个不是输入的连宽字节都不用试了,这样基本都能注入成功。

这里面还有很多很多SQL注入和XSS这里就不一一列举了,大家感兴趣的可以自己一点一点摸索出来,这里带大家看点不一样的。

我们在后台会发现可以备份数据库如下图:

从中可以看出备份的文件是按照日期进行备份的,我们可以尝试爆破地址:

爆破成功后访问会发现有管理员账号,密码为MD5加密区CMD5去破解一下,我们就可以拿到管理员的权限了。

总结

其实这个CMS存在的问题和漏洞不仅仅只有这些,这里只是抛砖引玉,其实现在很多代码审计工具需要有一定的代码基础才能更好地完成代码审计,这里配合BlueCMS只是说出一个更适合代码基础比较薄弱的同学进行代码审计的方法,文章中可能出现一些错误和Payload不能成功的错误,请大家多多指教,谢谢大家花费时间读完这篇文章在这里感谢大家。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
地球胖头鱼
未填写
  • 作者发布文章112
  • 作者收获粉丝2
  • 作者收到点赞0
  • 所有文章被收藏了0
  • 博客总访问量排行第3
  • 博客总访问量1.1 万(每日更新)
查看所有博文