微信私钥泄露的危害:一个微信公众号漏洞案例分析 201608152

前言

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

一个偶然的机会得到了公众号接口的权限,发现很多「有趣的事」,据说还可以黑产。目前该漏洞已经提交给微信号开发方完成修复,这篇文章主要告诫各位微信公众号开发人员关于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插件,但是没有及时关闭所导致的。

如下图所示:

微信私钥泄露的危害:一个微信公众号漏洞案例分析 201608152_第1张图片

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

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

注意到最后的几个变量WECHAT_APPID和WECHAT_APPSECRET

微信私钥泄露的危害:一个微信公众号漏洞案例分析 201608152_第2张图片

一开始不认识,但是看见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

微信私钥泄露的危害:一个微信公众号漏洞案例分析 201608152_第3张图片

返回了一串很长的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
        }
    ]
}

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

微信私钥泄露的危害:一个微信公众号漏洞案例分析 201608152_第4张图片

选其中人数最多的两组,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群

微信私钥泄露的危害:一个微信公众号漏洞案例分析 201608152_第5张图片

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

微信私钥泄露的危害:一个微信公众号漏洞案例分析 201608152_第6张图片

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

后记

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

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

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

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

安全路漫漫,希望大家吸取个教训。

*本文原创作者:岚岚自语,转载须注明来自FreeBuf.COM

收藏该文
岚岚自语

岚岚自语1篇文章等级:2

再不学就浪费了自己的专业了。。

个人主页  发私信

这些评论亮了

  • Jumbo (5级) 中国白客联盟:www.chinabaiker.com 回复
    你都拿到key了还说啥呀.....就好比我进入服务器了,我发现能添加用户一样................
    ) 7 ( 亮了
发表评论

已有 24 条评论

  • 爱捣蛋的鬼  (2级)  2016-08-11 回复 1楼

    还没有利用最大化, 有了access_token可以做很多事

    亮了( 3)
    • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复

      @ 爱捣蛋的鬼  就发这一句已经被人批评了一上午 :?:

      亮了( 4)
      • freebuf  2016-08-11 回复

        @ 岚岚自语  因为对开发者来说没有人发现漏洞就是安全,即时被利用了造成损失了,一句话黑客入侵就可以甩锅。没给你处分算不错的了。在他们眼里这就是黑客,根本没有什么白帽子测试一说。

        亮了( 3)
      • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复

        @ freebuf 没办法 新手不懂

        亮了( 0)
  • softbug  (7级) 四川建设网安全工程师  2016-08-11 回复 2楼

    黑不了别人的服务器,就拿微信群发玩,没有料,纯搞笑。 这样的文章只能算日记。

    亮了( 3)
    • XXXX  2016-08-11 回复

      @ softbug  这种意淫式的黑阔很多,不差这一个嘛

      亮了( 3)
      • 冰海  (2级) 我思故我在……  2016-08-11 回复

        @ XXXX 说到点上了[/哈哈],但是反过来,应该认可一下。

        亮了( 2)
    • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复

      @ softbug  就是个日记 :cool:

      亮了( 0)
  • 冰海  (2级) 我思故我在……  2016-08-11 回复 3楼

    全程我是提着心看完的,以为能看到大杀器。。。

    亮了( 2)
    • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复

      @ 冰海  新手,见笑了 :?:

      亮了( 0)
  • Jumbo  (5级) 中国白客联盟:www.chinabaiker.com  2016-08-11 回复 4楼

    你都拿到key了还说啥呀…..就好比我进入服务器了,我发现能添加用户一样…………….

    亮了( 7)
    • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复

      @ Jumbo  就是给开发者提个醒,都认为主机入侵危害大,这危害也不小

      亮了( 0)
  • HD MOORE  2016-08-11 回复 5楼

    Not useful! I can ROOT your server in seconds

    亮了( 2)
    • ArthurKiller  (6级) FreeBuf的隔壁邻居------老王  2016-08-11 回复

      @ HD MOORE so what? I can root the server that u hacked.

      亮了( 3)
  • ArthurKiller  (6级) FreeBuf的隔壁邻居------老王  2016-08-11 回复 6楼

    说是话,技术的确没有很高深的地方。
    好比我说我知道了你的QQ密码了,发现还可以发消息给你的朋友!好神奇!
    但是站在另外一个角度看,的确有部分移动开发人员很容易忽视主站WEB的安全设计,文中就是一个例子。
    以为流量都是走移动端,用户不会去POST网站的URL或者IP就不去担心这方面的设计,导致debug一直在开启状态,就是这样才泄露密钥。
    客观评价,不喜勿喷。 :?:

    亮了( 4)
    • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复

      @ ArthurKiller  可以 这很客观

      亮了( 0)
  • soild  2016-08-11 回复 7楼

    q群258246920,备注:哪有

    亮了( 1)
    • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复

      @ soild 群已关 :neutral:

      亮了( 0)
  • 神TMNPC  2016-08-11 回复 8楼

    这能算什么漏洞?就好像把自家银行密码随手写在墙上一样,私钥随便debug打印也是6得飞起

    亮了( 0)
    • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复

      @ 神TMNPC freebuf上一定要发漏洞吗…

      亮了( 0)
  • 湖北凌辉峰科技  2016-08-11 回复 9楼

    转发微博

    亮了( 0)
  • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复 10楼

    @ Jumbo 就是给开发者提个醒,都认为主机入侵危害大,这危害也不小

    亮了( 0)
  • 岚岚自语  (2级) 再不学就浪费了自己的专业了。。  2016-08-11 回复 11楼

    围观各路大神给我拍的砖 我都搬了 :neutral:

    亮了( 1)
  • global_hacker  (4级)  2016-08-11 回复 12楼

    哈哈 666 娱乐了 微信

    亮了( 0)

你可能感兴趣的:(逻辑缺陷)