联系我们
  • 联系人: 侯女士?

    电 话: 025-58630787?

    邮 箱: [email protected]?

    手 机: 18052008777

    公司地址:南京市雨花台区雨花大道2号邦宁科技园1-4层


微信私钥泄露的危害:一个微信公众号漏洞案例分析
2016-8-12
来源:freebuf
点击数: 3664          作者:江苏天网
  • 前言

    学校有个比较知名的公众号,用了两年感觉还是非常不错的,查成绩查公交查图书啥都有。

    一个偶然的机会得到了公众号接口的权限,发现很多「有趣的事」,据说还可以黑产。目前该漏洞已经提交给微信号开发方完成修复,这篇文章主要告诫各位微信公众号开发人员关于WECHAT_APPID和WECHAT_APPSECRET的重要性。

    信息收集

    数据包截断

    首先使用抓包软件,比如BrupSuite对微信公众号的数据包进行截取,数据包的URL地址大概如下:

    www.xxxx.com/tools/query

    去掉参数和路径直接用一级域名访问

    www.xxxx.com

    访问域名

    这个时候跳转到一个博客,为了不泄露隐私就不截图了。应该是开发人员的个人博客,翻了一下没啥能用的信息。用nslookup查ip发现超时看,ping一下获得了ip地址,是阿里云的主机。nmap扫了一圈,发现开了mysql和phpmyadmin(在端口8181上)。

    访问IP报错

    但是没有找到好的利用姿势,于是直接用ip访问了一下,爆出大量错误信息!应该是使用了laravel的debug插件,但是没有及时关闭所导致的。

    如下图所示:

    QQ截图20160808200431.jpg

    右下角往下拉,可以看到包括所有laravel的环境变量都显示了出来,包括数据库信息。

    但是ip在内网,而且也不能用来登录mysql和myadmin。

    注意到******的几个变量WECHAT_APPID和WECHAT_APPSECRET

    1.jpg

    一开始不认识,但是看见secret关键字,应该是不能随意泄露的,怎么用呢?让微信官方教我们吧

    这里是天时地利人和获得的WECHAT_APPID和WECHAT_APPSECRET,如果通过其它web漏洞进入了服务器,同样可以通过找配置文件获取这些值,所以说现在需要留意的不仅是数据库连接信息了。

    漏洞利用

    微信公众平台开发者文档

    官方说,access_token是公众号的全局******票据,公众号调用各接口时都需使用access_token。

    公众号可以使用AppID和AppSecret调用接口来获取access_token,于是我们获得的数据派上了用场。

    接口调用请求说明

    http请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 

    获取token.jpg

    返回了一串很长的token,以后调用接口都带上这个access_token参数即可,官方说有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

    参照官方文档,应该有很多利用姿势,毕竟能群发,能获取到用户地址之类的隐私数据,但是也有部分功能需要后台填写url地址才行,具体的大家可以研究下上面的文档,挖掘更多姿势,下面我就演示下影响比较大的群发。

    群发演示

    再次参照官方文档

    想群发所有人,需要使用is_to_all参数,但是有次数限制,所以先查分组,使用分组发送。

    查询所有分组

    接口调用请求说明

    http请求方式: GET(请使用https协议) https://api.weixin.qq.com/cgi-bin/groups/get?access_token=ACCESS_TOKEN 

    返回说明正常时的返回JSON数据包示例:

    {
        "groups": [
            {
                "id": 0, 
                "name": "未分组", 
                "count": 72596 }, 
            {
                "id": 1, 
                "name": "黑名单", 
                "count": 36 }, 
            {
                "id": 2, 
                "name": "星标组", 
                "count": 8 }, 
            {
                "id": 104, 
                "name": "华东媒", 
                "count": 4 }, 
            {
                "id": 106, 
                "name": "★不测试组★", 
                "count": 1 }
        ]
    } 

    我使用文档里的接口调试工具演示这次的实例

    分组.jpg

    选其中人数最多的两组,id为0和104

    根据分组进行群发【订阅号与服务号认证后均可用】

    接口调用请求说明

    http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=ACCESS_TOKEN 

    POST数据说明

    POST数据示例如下:

    文本:

    {
       "filter":{
          "is_to_all":false,   
          "group_id":"2" },
       "text":{
          "content":"CONTENT" },
        "msgtype":"text" } 

    官方文档这里的false后面少了个逗号是最骚的,我给大家加上。发送的信息是宣传学校的安全qq群

    2.jpg

    这样发送请求(图里也少了一个逗号)是不行的,因为发了没编码的中文。返回的错误代码是消息类型错误,******改成\u的unicode编码,回复的错误代码为0就是成功,结果发出去变成了这样(群发有延迟,需耐心等待)

    3.jpg

    但是因为粉丝比较多,没有进一步测试怎么正确发中文,但是瞬间有8个人加了我的群,原来是微信一键翻译能解码,神人真多。。

    后记

    虽然这次没有控制主机,但是拥有大量粉丝的公众号的公信力,******会成为黑客的利用目标,如果群发的是钓鱼链接和虚假的充值活动之类的链接,用户损失的是钱财,商家损失的是信誉,得益的是黑产。后来公众号负责人找到我,探讨了一下该不该这样做测试,******算是和解,不追究造成的粉丝损失,群发里宣传的群在公众号负责人的要求下也已经关闭了。

    这次漏洞产生的主要原因为以下两点:

    1.Domain未开启CDN,导致服务器IP暴露。

    2.程序员一直开启debug模式,导致关键信息被泄露。

版权所有 Copyright(C)2009-2013 江苏天网计算机技术有限公司 苏ICP备16029720号

玄机二句是2019