收藏
评论

安全课堂|关于小程序session_key泄露漏洞官方

为进一步提升小程序的安全性和用户体验,目前平台对提审的小程序均需进行安全检测,在检测过程中发现仍有许多小程序存在安全漏洞,其中涉及session_key泄露漏洞,希望通过以下相关的漏洞介绍、案例分析和修复建议,开发者能更加了解如何对该漏洞进行防御。

一、漏洞介绍

为了保证数据安全,微信会对用户数据进行加密传输处理,所以小程序在获取微信侧提供的用户数据(如手机号)时,就需要进行相应的解密,这就会涉及到session_key,具体流程可参考开放数据校验与解密开发文档。

session_key指的是会话密钥,可以简单理解为微信开放数据AES加密的密钥,它是微信服务器给开发者服务器颁发的身份凭证,这个数据正常来说是不能通过任何方式泄露出去的。小程序若存在session_key泄露漏洞的情况,则代表微信侧传递的用户数据有被泄露、篡改等风险,开发者应及时发现该漏洞并快速修复相应问题。

二、漏洞案例

某小程序因为session_key泄露,导致该小程序可以使用任意手机号进行登录,造成了极大的安全风险。

我们可以很明显地看到,下列请求中的session_key已经被泄露:

通过获取该session_key,我们可以结合iv解密出密文:

只需如下脚本即可进行解密,所以攻击者也可利用同样的信息去篡改用户数据,然后加密后返回给服务器,从而达到使用任意手机号进行登录的目的。

三、漏洞修复

通过上述案例,我们了解到session_key泄露会对小程序造成的危害,而导致session_key泄露的原因则可能有以下两种:

1.通过auth.code2Session接口获取用户openid时,返回小程序的数据中包含了session_key字段,以泄露的url:/api/get_openid.php?code=xxxx为例,具体的表现如下图所示:



查看后端get_openid.php的源码,经排查发现$response 变量包含了session_key字段,开发者应去掉变量中的session_key字段,若需获取openid,应只提取该字段返回小程序即可。



2.在解密开放数据时,使用了错误的方式,以获取手机号接口为例,通过事件回调获取微信服务器返回的加密数据(encryptedData和iv)后,将服务端中的session_key传送至小程序前端,直接在前端进行解密:

这种方式是绝对不可取的,正确的流程应该是将加密数据(encryptedData和iv)传至服务端后,结合服务端中的session_key进行解密获取手机号,然后返回给小程序。另外,目前平台已对获取手机号接口进行了安全升级,建议开发者使用新版本,以增强小程序的安全性。

若小程序存在相应的session_key泄露漏洞问题,请开发者尽快自查并修复漏洞:

请尽快在网络请求中,去除请求和响应中的session_key字段及其对应值,后续也不应该将session_key传到小程序客户端等服务器外的环境,以便消除风险。


其他常见问题

Q1: 如何进行相应的修复,是需要把session_key字段更换个名字就可以了吗?

A1: 不是,更换字段名无法从根本上消除风险,session_key这个字段及对应值不应该传到小程序客户端等服务器外的环境,需去除请求和响应中的所有相关信息,才可对该漏洞问题进行修复。

Q2: 解密开放数据的正确方式是什么?

A2: 以获取手机号接口为例,通过事件回调获取微信服务器返回的加密数据(encryptedData和iv),将加密数据传至服务端后,结合服务端中的session_key进行解密获取手机号,然后返回给小程序。而不应将服务端中的session_key传送至小程序前端,直接在前端进行解密。


相关文章

安全课堂|关于小程序AppSecret密钥泄露漏洞

安全课堂|关于小程序云AK/SK泄露漏洞


如有其他相关疑问,欢迎随时参与官方社区讨论。


212710浏览
最后一次编辑于  2022-09-09
收藏

53 个评论

  • 青寒
    青寒
    2022-04-20

    开发者为什么会这么用会话秘钥呢?

    2022-04-20
    赞同 20
    回复 10
    • 落尽繁华
      落尽繁华
      发表于小程序端
      2022-04-20

      你能

      2022-04-20
      16
      回复
    • 落尽繁华
      落尽繁华
      发表于小程序端
      2022-04-20回复落尽繁华

      不错

      2022-04-20
      9
      回复
    • -
      -
      2022-05-25回复创客惠淘创始人于东亮
      我也是 你解决了吗 我搜我代码我连session这个关键词的都搜不到 压根没用啊……
      2022-05-25
      6
      回复
    • 澄c澄悦
      澄c澄悦
      2022-05-25回复-
      +1
      2022-05-25
      9
      回复
    • 最后的轻语
      最后的轻语
      2022-05-25回复-
      解决了吗
      2022-05-25
      回复
    查看更多(5)
  • z
    z
    2022-06-29

    我查找了相关接口,调用该接口时参数有登录返回的code,微信昵称、性别、国家、省份、城市。返回的数据只有openid以及接口中自行生成的用户id,并没有返回session_key。全局搜索也没有发现有返回或者调用session_key的情况。

    2022-06-29
    赞同 14
    回复 1
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      2022-06-29
      你好,目前该问题已核实,后续请对照推送消息中提及的appid进行排查,以免排查错误哈
      2022-06-29
      1
      回复
  • JiaJieChen
    JiaJieChen
    发表于移动端
    2022-05-25
    我也是收到推送,有没有说是哪个小程序,那个页面,怎么查
    2022-05-25
    赞同 11
    回复 25
    • -
      -
      2022-05-25
      我也是 你解决了吗 我搜我代码我连session这个关键词的都搜不到 压根没用啊……
      2022-05-25
      11
      回复
    • 澄c澄悦
      澄c澄悦
      2022-05-25回复社区运营专员-wetingtu
      我们小程序也收到推送了,可是小程序端都没有用session_key啊,为什么要推送给我们
      2022-05-25
      7
      回复
    • 浮若年华!
      浮若年华!
      2022-05-25回复-
      获取openid的那个接口排查下,应该能捕捉到session_key
      2022-05-25
      3
      回复
    • 耿耿星河
      耿耿星河
      2022-05-25
      是需要把请求参数中叫session_key的名字改一下、把请求返回值的叫session_key的字段换个名字就可以了吗?
      2022-05-25
      1
      回复
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      2022-05-25回复耿耿星河
      不是,session_key这个字段及对应值不应该传到小程序客户端等服务器外的环境,只能保存于开发者服务器之中
      2022-05-25
      5
      回复
    查看更多(20)
  • 旺仔
    旺仔
    发表于移动端
    2022-06-24
    提示我session Key是明文传输,我只是客户端传回服务器,难道还要加密一次再回传吗?
    2022-06-24
    赞同 6
    回复 5
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      发表于小程序端
      2022-06-24

      正常情况下,session_key不会保存于小程序,请按文章指引自行排查

      2022-06-24
      回复
    • 旺仔
      旺仔
      2022-06-24
      那想问一下,开发者服务器如何再小程序用户不传过来的情况下,知道正确的session Key,毕竟几万人,每个人的会话KEY都不一样,而手机号的解密这个是必要参数。
      2022-06-24
      回复
    • 旺仔
      旺仔
      2022-06-24
      这流程图我看有点问题,session Key是客户端和微信服务器通讯的密钥。如果不由客户端或微信服务器告知,开发者服务器是根本不知道的,所以需要有session Key的传输。如果认为客户端传输不安全,那只能请微信开个接口,有人登录就把openid、unionid、session Key发一份到开发者服务器,保存备用。
      2022-06-24
      1
      回复
    • 旺仔
      旺仔
      2022-06-25回复旺仔
      知道处理方法了,之前偷懒了,code解析以后没有存(又不想查次表)。
      2022-06-25
      2
      回复
    • GG
      GG
      2022-06-30
      意思是后端要自己处理完sessionKey再返回给小程序吧?
      2022-06-30
      3
      回复
  • magic
    magic
    2022-05-25

    这个是需要搜索所有网络请求,去掉session_key 返回,还是session_key字段改个名字即可? 或者session_key 的内容加密返回,请问微信是怎么检测的?


    如果只是加密内容,那我字段名称就不用改了,这样清晰


    2022-05-25
    赞同 6
    回复 2
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      2022-05-25
      session_key这个字段及对应值不应该传到小程序客户端等服务器外的环境
      2022-05-25
      1
      回复
    • GG
      GG
      2022-06-30
      你跑人家的接口,人家还能不知道吗,哈哈哈
      2022-06-30
      回复
  • 慕淘子儿童餐厅府谷店
    慕淘子儿童餐厅府谷店
    发表于移动端
    2022-06-24
    不知道是哪个小程序出了问题?修改应该怎么修改?
    2022-06-24
    赞同 5
    回复 1
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      发表于小程序端
      2022-06-24

      收到的推送消息中应该有提示漏洞对应的appid

      2022-06-24
      1
      回复
  • 贝诗美
    贝诗美
    发表于移动端
    2022-12-09
    :你好,检测发现你的小程序appid:wx927f151a39da34a7在通信过程中明文传输session_key(传输url:https://api.xaypd.cn/index/wxauth_code),请去除请求和响应中的session_key,以便消除风险。
    2022-12-09
    赞同 4
    回复 2
    • 贝诗美
      贝诗美
      发表于移动端
      2022-12-09
      这个怎么处理
      2022-12-09
      1
      回复
    • '
      '
      发表于移动端
      06-05回复贝诗美
      https://api.xaypd.cn/index/wxauth_code你的这个后台接口,不要直接返回响应结果就好了
      06-05
      回复
  • !!
    !!
    发表于移动端
    2022-06-17
    不懂改怎么办
    2022-06-17
    赞同 4
    回复 16
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      2022-06-17
      你好,建议多研读小程序开发指南:https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000cc48f96c5989b0086ddc7e56c0a
      2022-06-17
      9
      回复
    • 牛小米
      牛小米
      2022-06-17
      我是这么认为的不知道是否正确,在取到code后,再取openid的请求后,系统返回的是openid和session_key,二个值,我在后台api里把session_key,存到数据库,返回给小程序端的json数据里只给openid的值即可,有错或理解的不正确,请指正,谢谢
      2022-06-17
      4
      回复
    • 柯耳
      柯耳
      2022-06-20回复社区运营专员-wetingtu
      session_key 安全问题,我们不想改字段名称,把内容修改了进行处理可以吗?
      2022-06-20
      4
      回复
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      2022-06-20回复牛小米
      可以,不要将获取到的session_key返回至小程序即可
      2022-06-20
      4
      回复
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      2022-06-20回复柯耳
      可以先描述下session_key是通过什么方式进行了泄露哈,核心不是字段名的问题,是session_key这个字段及对应值不应该传到小程序客户端等服务器外的环境
      2022-06-20
      3
      回复
    查看更多(11)
  • 最后的轻语
    最后的轻语
    2022-05-25

    可以提示扫描的哪个接口有问题吗,排查根本找不到session_key以及甚至session字段,但是却收到了session_key安全通知的推送,请问还有什么方法解决?

    2022-05-25
    赞同 3
    回复 13
    查看更多(8)
  • 贾老师
    贾老师
    发表于移动端
    2022-06-17
    刚找到,问题在这里:在用jscode2session获取用户openid时,返回的数据包含session_key,openid,unionid三个字段字段,如果把返回的数据全部返回到前段就出错了
    2022-06-17
    赞同 2
    回复

正在加载...

登录 后发表内容