渗透实战系列|某后台管理系统的审计

华盟原创文章投稿奖励计划

渗透实战系列|某后台管理系统的审计

目录

0x01 框架结构0x02 Admin.php 任意修改管理员用户名及密码 SQL注入0x03 Index.php 用户留言处存储型XSS0x04 Controller.php 任意增删改查数据表内容 任意文件上传0x05 一些XSS 结语



0x01 框架结构

渗透实战系列|某后台管理系统的审计

渗透实战系列|某后台管理系统的审计

采用thinkphp5作为框架,版本为5.0.2,默认开启debug模式,数据库默认使用PDO连接

打了补丁,修复了RCE通用漏洞

渗透实战系列|某后台管理系统的审计

如图,增加了白名单,不能任意调用其他方法进行利用

0x02 Admin.php

任意修改管理员用户名及密码

漏洞点:
admin/controller/Admin.php

渗透实战系列|某后台管理系统的审计


_initialize()方法:在任何方法执行之前,都要执行此方法,包括_construct构造函数。

跟进一下父类的_initialize()方法

渗透实战系列|某后台管理系统的审计

方法为空,无语住了

所以该方法相当于只获取了Session而没有进行判断,可以未授权调用管理员方法

接下来跟进一下doUpdate方法

渗透实战系列|某后台管理系统的审计

可以看到$user_id$data[‘username’]都是通过用户输入获取而没有使用Session,字段都可控,并且存在sql注入

POC:

渗透实战系列|某后台管理系统的审计

SQL注入

还是doUpdate方法

渗透实战系列|某后台管理系统的审计

重点看这一条:

$is_have = Db::name(‘admin’)->where(“id != $user_id AND username = ‘”.$data[‘username’].”‘”)->value(‘id’);

sql语句直接将字符串进行拼接而没有使用PDO绑定,并且$user_id也没有用引号包裹

看下input方法

渗透实战系列|某后台管理系统的审计

作用是从某个指定的来源中获取数据,但默认过滤器为空

渗透实战系列|某后台管理系统的审计

回到之前,$user_id$data[‘username’]获取数据时都没有使用过滤器,所以两个字段都是注入点

POC:
懒得手注了,直接sqlmap一把梭

渗透实战系列|某后台管理系统的审计

0x03 Index.php 用户留言处存储型XSS

漏洞点:
api/Index.php

渗透实战系列|某后台管理系统的审计

可以看到$data没有进行过滤,也没有限制列名,但下面会将一些特定字段进行覆盖

渗透实战系列|某后台管理系统的审计

可控的有idusernametelephoneacreage字段,但真正可利用的只有usernameacreage

POC:

渗透实战系列|某后台管理系统的审计

渗透实战系列|某后台管理系统的审计

0x04 Controller.php

任意增删改查数据表内容

漏洞点:
admin/controller/Admin.php
admin/traits/controller/Controller.php

渗透实战系列|某后台管理系统的审计

根据上文已经了解到Admin.php未进行鉴权,并且引入了一个公共控制器Controller.php,我们来跟进一下

先看下index方法

渗透实战系列|某后台管理系统的审计

首先用$controller = $this->request->controller()获取当前请求的控制器名称,然后通过$m = model($controller)返回模型对象。后续的数据库操作是以模型对象来进行的,而数据库的表名默认是模型名,所以这两行代码可以理解为由哪个控制器调用就操作与哪个控制器同名的表。

跟进下search方法

渗透实战系列|某后台管理系统的审计

作用相当于将$param里的数组添加到where[‘map’];所以get请求不要添加参数,让$param置空,返回全部数据

 

渗透实战系列|某后台管理系统的审计

接下来看edit方法

渗透实战系列|某后台管理系统的审计

同样的没有任何限制,跟进下isAjax方法

渗透实战系列|某后台管理系统的审计

可以看到只要var_ajax的伪装变量在参数中存在,就返回true

var_ajax的默认伪装名为_ajax

渗透实战系列|某后台管理系统的审计

所以只要在POST请求中添加参数_ajax=1就能进入判断

继续

渗透实战系列|某后台管理系统的审计

allowField用于检验请求的列名是否存在

渗透实战系列|某后台管理系统的审计

如果不是Ajax请求,则将id作为筛选条件,返回查询数据

配合上文的index方法获取的id,即可进行修改和查询

POC:
查询:

渗透实战系列|某后台管理系统的审计

修改:

渗透实战系列|某后台管理系统的审计

增加和删除的代码和上面的几乎一样,所以就不分析了

增加:

渗透实战系列|某后台管理系统的审计

删除:

渗透实战系列|某后台管理系统的审计

任意文件上传

渗透实战系列|某后台管理系统的审计

可以看到什么过滤都没,还贴心的返回路径给你

POC:

渗透实战系列|某后台管理系统的审计

渗透实战系列|某后台管理系统的审计

0x05 一些XSS

上文已知只要控制器没做好鉴权,就可以调用Controller.php里的方法;我们可以利用这点,添加带有XSS的文本到数据库里

首先看下Base控制器

渗透实战系列|某后台管理系统的审计

代码很简单,但也能做到基本的鉴权

接下来看Page.php控制器

渗透实战系列|某后台管理系统的审计

把父类继承的鉴权方法重写置空,不知道作者为什么要这样写,跟故意留个后门一样

其他控制器如Product.phpService.phpXcxaccount.php都像Page.php一样无效鉴权,这里只挑两个进行演示

POC:

渗透实战系列|某后台管理系统的审计

渗透实战系列|某后台管理系统的审计

渗透实战系列|某后台管理系统的审计

渗透实战系列|某后台管理系统的审计

结语

这个cms审起来比较轻松,漏洞都比较简单且典型,属于有手就行系列。

第一次写审计类的文章,没办法做到详略得当,还请各位师傅多多包涵。

文章来源:Hacking黑白红

黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

如侵权请私聊我们删文


END

渗透实战系列|某后台管理系统的审计

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容