专业编程基础技术教程

网站首页 > 基础教程 正文

PHPCMS V9.6.2 SQL注入漏洞分析 sql注入漏洞实战

ccvgpt 2024-10-22 10:37:53 基础教程 7 ℃

作者:0r3ak@0kee Team

PHPCMS V9.6.2 SQL注入漏洞分析 sql注入漏洞实战

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

前言


通过这篇文章的分析:http://bobao.360.cn/learning/detail/3805.html ,详细讲述了PHPCMS V9.6.1文件读取漏洞的触发成因,当发现网站是phpcms并且成功利用任意文件读取漏洞读取时系统文件时是否可以进行下一步的利用,在phpcms的核心文件/caches/configs/system.php中存储了phpcms全站的加密密钥与全局的配置参数:

利用这个密钥可以对 phpcms传输的数据加解密,使用SkyWolf在PHPcms 9.6.2中挖掘到了一枚配合密钥利用的SQL注入漏洞,以下是详细过程与分析。

Skywolf


SykWolf介绍

什么是SkyWolf?SkyWolf是一款自动化灰盒审计系统,所谓灰盒审计,在日常对cms的代码审计中可以理解为白盒结合黑盒的安全测试,以PHP扩展形式加载,通过污染传递的方法污染程序整个执行流程,并对程序处理流程进行安全性分析。

Skywolf控制台地址:

https://0kee.360.cn/skywolf/

通过访问网站接口skywolf会主动的分析中间调用逻辑,来罗列出可疑的漏洞

告警处理:展示Skywolf发现业务已经触发的漏洞告警信息,点进去看到详细的漏洞信息:

可疑点:服务端数据库执行的可疑语句

调用栈:程序在执行这一次请求当中所调用的函数与代码文件物理路径、在文件中的行数。

SQL注入漏洞分析


当访问到phpcms的member接口:

skywolf发出了相关告警:

详细分析如下:

在会员前台管理中心接口的继承父类foreground:

/phpcms/modules/member/index.php LINE 11

这里继承了foreground,跟进去:

/phpcms/modules/member/classes/foreground.class.php line 19-38:

首先看到这里是验证前台会员用户是否登录,验证方法是解析客户端的cookie_pre_auth参数:

跟到get_cookie函数:

/phpcms/libs/classes/param.class.php LINE 107-116

首先读取system.php(网站全局配置./caches/configs/system.php)中的配置参数cookie_pre,也就是网站默认随机分配的cookie前缀,然后再读取到客户端cookie中的cookie_pre_auth值放入sys_auth中解密,那么客户端的cookie_pre_auth应该是经过加密处理后的,有了这些信息后get_cookie先放到这里往下走到get_auth_key:

这里咱们看到DECODE用到的key是$auth_key,而$auth_key又是通过get_auth_key('login’)获得的,再跟进get_auth_key:

./phpcms/libs/functions/global.func.php LINE 1601-1611:

可以看到这个$prefix即是外部传入的login,满足$prefix==‘login’后开始拼接客户端ip地址再对值进行md5加密,发现ip()是可以伪造的:

最后得到的md5值就是sys_auth($phpcms_auth, 'DECODE', $auth_key)的解密key了,这样来分析的话payload就是经过了两次加密,完全无视任何第三方防御。

加密流程:

漏洞利用


利用方式就简单了:

通过任意文件读取获取到全局配置文件的auth_key值:

首先执行get_auth_key加密,在代码中输出$authkey = md5($prefix.$pc_auth_key)的值:

方便测试,IP参数伪造为X-Forwarded-For: 123.59.214.3,输出了$authkey后直接exit了:

然后把phpcms关键的加解密函数sys_auth单独写到某个php文件里面:

sys_auth_key.php:

带入$authkey与sqli payload:

第一次加密:

第二次加密:

然后带入到auth中里面去访问member接口:

伪造session进入后台


众所周知,通过sql注入得到的phpcms的管理员密码是无法破解出来的,具体加密啊算法:

/phpcms/libs/functions/global.func.php LINE 1248

简单来说就是把明文密码做md5加密再连接上encrypt值(encrypt是创建用户的时候随机分配的字符串),再做一次md5加密,这样就很难解密了。

然而phpcms一直存在一处问题就是管理员登陆后台会将服务端的session值保存在数据库中,通过注入可以获取到session值来伪造访问后台页面,具体配置在system.php中:

mysql存储方式,session有效期为30分钟。

/phpcms/libs/classes/session_mysql.class.php

只要触发了gc或destroy函数就会删除数据库中的session值,当管理员重新登陆后台后才重新生成session插入数据库中。

session数据库存放位置:

从mysql日志中分析可知:当管理员登陆后台会插入新的session到v9_session表中,每次后台操作都会进行这样的操作,使数据库中的sessionid保持最新,但是值不变。

在管理员登陆后台并且在未注销的前提下是可以通过获取管理员session值来伪造登陆的,限于篇幅,注入过程不再细说,这里直接上图:

得到sessionid,在得到这个参数后还需要一个值,就是pc_hash值,这个值在后台是个随机数,作者是想防止越权以及csrf而设计的,然而对于获取到了后台权限的我们只是一个摆设,下面直接提交数据包访问控制台首页:

修复方案


最新版本的phpcmsv9.6.3都已经修复了任意文件读取漏洞与sql注入点,可以下载最新版的补丁进行防护:

UTF8:

http://download.phpcms.cn/v9/9.0/patch/utf8/patch_20170503_20170515_UTF8.zip

gbk:

http://download.phpcms.cn/v9/9.0/patch/gbk/patch_20170503_20170515_GBK.zip

Tags:

最近发表
标签列表