声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
前言
如意如意顺我⼼意,若不能顺我⼼意,我将竭尽全⼒,⽤⾃⼰的技术改变其意。
笔者是⼀位极其“不听话”的⼈,我不想要程序它觉得,我要我⾃⼰觉得;⾃⼰重新定义程序的逻辑以及游戏规则,掌控这其中的数据,让每⼀个环节都顺⾃⼰的⼼意,直到看到⾃⼰想要的结果为⽌。在这篇⽂章中,作者将会带领⼤家寻找微信⼩程序中特有且常⻅的任意⼿机号登录漏洞,并为读者们带来⼀种你从未听说以及利⽤过 并且只有在⼩程序中才会存在的类似于CSRF的漏洞。
此专题由于篇幅较⻓将会拆分为“如意篇 (上)”、“如意篇(下)”两篇⽂章,还请您⻅谅。
都是sessionkey惹的祸
不知读者们是否发现有些微信⼩程序有“微信⼿机号快捷登录”的功能,轻轻⼀点即会弹出所以保存在微信之中已经被信任的⼿机号,⽆需再接收验证码即可实现⼀键登录已经经过微信验证的⼿机号,⾮常之便捷。
这个功能在微信⼩程序中名为“获取⼿机号”,⽬前只向以中国⼤陆为主体的企业认证账户开放使⽤,并 在越来越多的企业级⼩程序中得到了完美的运⽤,其官⽅说明⽂档如下:
|
|
|
按照官⽅的开发⼿册,想使⽤“获取⼿机号”功能⾸先须在⼩程序内调⽤“wx.login”接⼝,示例代码如下:
wx.login({
success (res) {
if (res.code) {
//发起⽹络请求
wx.request({
url:'https://demo.c-est.cool/Login', console.log('成功将code传给⼩程序后端!')
data: {
code: res.code }
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
当微信⼩程序运⾏⾄“wx.login”代码处时,会调⽤微信服务器的接⼝返回“code”参数:
|
|
|
可以将“code”参数理解为⼀次性校验⽤的token,未使⽤的code有5分钟的有效期,⼀但使⽤⽆论调⽤成 功与否,此code便会失效。当⼩程序成功获取到code时,开发者便可使⽤预留代码将对应的code值传 回⼩程序后端服务器以便接下来调⽤“auth.code2Session”接⼝:
|
|
|
通过使⽤“appId”、“appSecret”和登录时获取到的“code”(js_code)内容来换取:“openid”(⽤户唯⼀ 标识)、“session_key”(会话密钥)等值。如下图所示,可以看到微信拥有⼀套⾮常成熟的⼩程序登录流程:
在这此流程中“session_key”起到了⾄关重要的作⽤,只要能获取此key的内容,便可以控制回调凭证内容,使整套登录安全体系破产。咋们的微信爸爸(滴,5Q币到账)肯定考虑到了这个问题,所以给出了如下提醒:
1.开发者服务器可以根据⽤户标识来⽣成⾃定义登录态,⽤于后续业务逻辑中前后端交互时识别⽤户身份;
2.会话密钥 session_key 是对⽤户数据进⾏ 加密签名的密钥。为了应⽤⾃身的数据安全,开发者 服务器不应该把会话密钥下发到⼩程序,也不应该对外提供这个密钥。
总结⼀下就是:从微信这边获取到的“session_key”打死也不能直接返回给⽤户,但你实在要返回⽤于校 验⽤户身份的话我也拦不住你,但求求你⾏⾏好使⽤⾃⼰⽣成的第三⽅key返回吧,将“session_key”和 ⾃⼰⽣成的key在数据库中做个关联就⾏。
然⽽,这毕竟只是个提醒,总会有开发者“看不⻅”🙈或者不听取的,你懂的。接着我们回到“获取⼿机号”功能,在顺利调⽤“wx.login”和“auth.code2Session”接⼝之后便可轻松得到 加密之后的⽤户⼿机号数据和加密使⽤的初始向量(iv),将这些数据传递给微信⼩程序后端并使 ⽤“session_key”作为解密key可得到如下json数据:
(本段删除)最后我们来到⼩程序包的数据段,数据段的构造⾮常简单仅有“内容块”这么⼀个数据块,⾥⾯储存了每⼀个索引段中存在索引的⽂件的实际内容。
{
"phoneNumber": "+33711123333", "purePhoneNumber": "711123333", "countryCode": "33",
"watermark":
{
"appid":"APPID",
"timestamp": TIMESTAMP
}
}
♥phoneNumber:⽤户绑定的⼿机号(国外⼿机号会有区号);
♥purePhoneNumber:没有区号的⼿机号;♥watermark:内含对应⼩程序的appid和数据加密时的时间戳。
可以看到这些参数都是可以轻易伪造的,并且⼩程序后端并不会对得到的⼿机号做⼆次校验例如短信验 证码校验(不然这个快捷登录功能便失去了意义),故只要“session_key”泄露我们便可以伪造登录凭证 实现任意⼿机号登录。
那便先来聊⼀聊⼩程序数据的加解密吧:微信使⽤的是AES加密,CBC模式采⽤PKCS7填充,数据块⻓ 度为128位,输出使⽤base64编码。AES是⽤于替代DES加密的对称加密算法,对称加密算法最⼤的特 性便是加、解密使⽤的同是⼀串密钥,只要获取到key便可加解⾃如(CBC加密模式下还需要 iv 偏移量参数,⼀般固定不变或作为变量内容传输)
上图为微信服务器加密⽤户开放数据的具体流程,使⽤的加密key与“session_key”为同⼀个,偏移量iv 则直接与加密后的数据⼀起明⽂返回给了⼩程序后端。有细⼼的读者可能会看到此流程中有⼀个⽤于防 ⽌内容被篡改的签名过程,这个签名仅在“获取⽤户信息”功能中才会⽣成,在“获取⼿机号”功能中并⽆, 但这并不是微信的漏洞,因为签名是采⽤ sha1( rawData + sessionkey ) ⽅式⽣成的,若 session_key 泄露则⼀切验证签名的操作均是⽆济于事。
根据微信⼩程序对数据加密的⽅式,我们可以写出如下数据解密脚本:
<?php
echo "请输⼊SessionKey: ";
$sessionKey = fgets(STDIN);
echo "请输⼊本次加密IV: ";
$iv = fgets(STDIN);
echo "请输⼊待解密内容: ";
$encryptedData = fgets(STDIN);
function decryptData( $encryptedData, $iv, $sessionKey ) { $aesIV = base64_decode($iv); $aesCipher = base64_decode($encryptedData);
$aesKey = base64_decode($sessionKey); $result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV); $dataObj = json_decode($result);
return $result;
}
$result = decryptData($encryptedData, $iv, $sessionKey);
echo sprintf("最终的解密结果为: %sn", $result);
以及对应的数据加密脚本:
<?php
echo "请输⼊SessionKey: ";
$sessionKey = fgets(STDIN);
echo "请输⼊本次解密IV: ";
$iv = fgets(STDIN);
echo "请输⼊待加密内容: ";
$decryptedData = fgets(STDIN);
function encryptData( $decryptedData, $iv, $sessionKey )
{
$aesIV = base64_decode($iv); $aesCipher = $decryptedData; $aesKey = base64_decode($sessionKey);
$result = openssl_encrypt($aesCipher, "AES-128-CBC", $aesKey, 0, $aesIV); $dataObj = json_decode($result);
return $result;
}
$result = encryptData($decryptedData, $iv, $sessionKey);
echo sprintf("最终的加密结果为: %sn", $result);
最终加、解密脚本运⾏效果如下
巧妇难为⽆⽶之炊,有了解密之巧⼿,便得开始花式寻找“session_key”了。笔者为⼤家总结了如下三类 常⻅造成“session_key”泄漏的场景供⼤家参考:
第⼀类:微信⼩程序AppSecret泄露
有⼀种看不⻅叫做开发觉得你看不⻅,你可以在⼩程序包内的配置⽂件中、Ta的某个博客某篇⽂章中、 GitHub⼩仓库中等等地⽅找到被泄露的AppSecret
之后通过微信官⽅API的 jscode2session 功能便可直接获取⽬标⼩程序的 SessionKey (此接⼝调⽤没 有IP⽩名单限制)。有读者可能会问,请求参数 code 如何获取?其实⾮常简单,在⼩程序内找⼀个有登 录功能的地⽅(会触发 wx.login 的地⽅),然后开始抓包并⼈⼯触发登录功能,之后⼩程序便会把获 取到的code值传送回后端服务器,这时候只要拦截⼀下数据包即可获取 code 参数。
第⼆类:在请求登录或获取openid时直接返回SessionKey
在许多⼩程序中当⽤户执⾏登录操作时,会将获取到的code值传送回服务器后端以便后端执⾏ jscode2session 操作来⽣成 SessionKey 。但许多程序开发者由于安全意识淡薄,当成功获取 SessionKey 值会将其内容直接返回给⽤户⽽不是与第三⽅key做关联处理返回第三⽅key。例如下图为 ⾮常典型的案例,使⽤code换取session_key:
另外在⼀些⼩程序中需要获取⽤户在此⼩程序中的 openid 来识别⽤户的身份,但由于获取openid与获 取session_key使⽤的api为同⼀个均为 jscode2session ,所以在许多案例中在返回openid的同时也返 回了session_key的值。例如下图案例中,⼩程序只想要获取openid的值,但开发者没有对使⽤API获取 到的数据做过滤,连带着session_key的值⼀起返回了:
这两个例⼦的程序后端部分代码可归纳如下,可以看⻅直接将通过API获取到的内容返回给了⽤户,并未 对获取到的数据做任何⼲预处理:
public void GetCode(string js_code)
{
string serviceAddress = "https://api.weixin.qq.com/sns/jscode2session?appid=XXX&secret=XXX"
+ "&js_code=" + js_code + "&grant_type=authorization_code"; HttpWebRequest
request = (HttpWebRequest)WebRequest.Create(serviceAddress);
request.Method = "GET"; request.ContentType = "text/html"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, System.Text.Encoding.UTF8); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close();
var obj = new
{
data = retString,
msg = "success"
};
Formatting microsoftDataFormatSetting = default(Formatting);
string result =JsonConvert.SerializeObject(obj, microsoftDataFormatSetting); HttpContext.Current.Response.Write(result);
}
第三类:在查询第三⽅key等功能中返回SessionKey 当开发者⾮常规范的使⽤第三⽅key来关联session_key,并且⼀切操作查询均只使⽤第三⽅key,那么 是不是就没法获取到原本的session_key值了?其实也不尽然,例如如下图的⼩程序中整个登录流程⼗分 的规范,乍⼀看⼗分的安全,攻击者⽆法在登录流程中获取到session_key的值:
但问题就出在这第三步操作中,⼩程序在执⾏完登录流程之后,使⽤对应⽤户的第三⽅sessionID查询⽤ 户信息。但在这个api中,开发者将数据库中对应sessionID的数据全部返回了,这其中包含有与其关联 的⼀个或多个session_key的值:
以上这三类就是常⻅的造成session_key泄露的场景,有了它你就可以在各种⼿机号之间来去⾃如了。
招聘启事
安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1. 负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2. 负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3. 参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4. 积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5. 积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。
【任职要求】
1. 责任心强,性格活泼,具备良好的人际交往能力;
2. 对网络安全感兴趣,对行业有基本了解;
3. 良好的文案写作能力和活动组织协调能力。
简历投递至 [email protected]
设计师(实习生)
————————
【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。
【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;
【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽
简历投递至 [email protected]
安全招聘
————————
公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京
工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…
【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案
【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)
【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;
岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)
【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。
【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。
【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。
简历投递至 [email protected]
岗位:红队武器化Golang开发工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)
【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。
【岗位要求】
1.掌握C/C++/Java/Go/Python/JavaScript等至少一门语言作为主要开发语言;
2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验;
3.了解docker,能进行简单的项目部署;
3.熟悉常见web漏洞原理,并能写出对应的利用工具;
4.熟悉TCP/IP协议的基本运作原理;
5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。
【加分项】
1.有高并发tcp服务、分布式、消息队列等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。
简历投递至 [email protected]
专注渗透测试技术
全球最新网络攻击技术
END
原文始发于微信公众号(白帽子):微信小程序的修炼五脉(如意篇上)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论