收藏
评论

安全课堂|关于小程序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泄露漏洞


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


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

52 个评论

  • 天昭灯饰 老邓 131 6986 7666
    天昭灯饰 老邓 131 6986 7666
    发表于移动端
    2022-05-24
    具体如何操作
    2022-05-24
    赞同 2
    回复 9
    • SHAN
      SHAN
      2022-05-25回复社区运营专员-wetingtu
      "去除请求和响应中的session_key字段",是可以换成别的字段表示吗?因为在做关联手机号那块需要用到session_key去解密手机号。
      2022-05-25
      回复
    • momo
      momo
      2022-05-25回复社区运营专员-wetingtu
      我自己再把session_key加个密传输行不行?
      2022-05-25
      2
      回复
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      2022-05-25回复momo
      session_key不应在前端进行传输,涉及敏感数据的加密解密等,只能在后端进行
      2022-05-25
      回复
    • 社区运营专员-wetingtu
      社区运营专员-wetingtu
      2022-05-27回复SHAN
      1.更换字段名无法从根本上消除风险,session_key这个字段及对应值不应该传到小程序客户端等服务器外的环境2.解密应该在后端进行,或者可使用新版本getPhoneNumber接口,只需code即可换取相应信息
      2022-05-27
      回复
    • sky💫
      sky💫
      2022-06-17回复社区运营专员-wetingtu
      你们检测的这个是只检测前端明文传输了session_key吗?还是后端返回的值里面有session_key也会被检测到?
      2022-06-17
      回复
    查看更多(4)
  • 星尘
    星尘
    发表于移动端
    2023-03-16
    怎么屏蔽安全检测?我的接口没问题,对session key进行了二次加密(且不可逆),只是字段还叫session key,实际上已经不是平台给我返回的key了。
    2023-03-16
    赞同 1
    回复
  • Augenstern
    Augenstern
    2023-03-16

    使用bindgetphonenumber获取不到code?

    2023-03-16
    赞同 1
    回复 1
    • Augenstern
      Augenstern
      2023-03-16
      刚看了基础库的问题,但是基础库 2.21.2以下要怎么处理怎么获取?
      2023-03-16
      回复
  • 阿白
    阿白
    2022-12-26

    session_key传到小程序为什么会泄露?

    2022-12-26
    赞同 1
    回复
  • 贝诗美
    贝诗美
    发表于移动端
    2022-12-09
    :你好,检测发现你的小程序appid:wx927f151a39da34a7在通信过程中明文传输session_key(传输url:https://api.xaypd.cn/index/wxauth_code),请去除请求和响应中的session_key,以便消除风险。
    2022-12-09
    赞同 1
    回复
  • YC-Jonny(预约号
    YC-Jonny(预约号
    发表于移动端
    2022-06-18
    你好,我问一下!对于我英语单词都看不懂的人,需要怎么操作修改?小程序出现问题,难到不应该是你们运营商处理的么?还有,如出现客户数据信息泄露,我可以起诉你们吗?求解!
    2022-06-18
    赞同 1
    回复 1
  • 李腾飞
    李腾飞
    09-12

    是只要session_key不暴露就行是吧,openid可以暴露吗

    09-12
    赞同
    回复 1
  • 大想
    大想
    06-01

    这个不改会影响搜索排名吗?

    06-01
    赞同
    回复
  • 大想
    大想
    05-30

    这个不处理是否会影响小程序排名?

    05-30
    赞同
    回复
  • 群仔噢
    群仔噢
    05-03

    “你好,检测发现你的小程序appid:wx75af871578d856f4在通信过程中明文传输session_key(传输url:https://www.tjqytech.tech/GetOpenId/getOpenId),请去除请求和响应中的session_key,以便消除风险。”,但是在代码中没有传过session_key,整个代码中也没有session_key,是不是检测失误了

    05-03
    赞同
    回复

正在加载...

登录 后发表内容