声明
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
逆向目标目标:Steam登录
主页:aHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL2xvZ2lu
接口:aHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL2xvZ2luL2RvbG9naW4v
逆向参数:
FormData:
password:MzXb8uvaNe//lkf+15sx6hnLD/L1BX......captchagid:rsatimestamp:逆向过程抓包分析
来到Steam的登录页面,随便输入一个账号密码登录,抓包定位到登录接口为aHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL2xvZ2luL2RvbG9naW4v,POST请求,FormData里,donotcache是13位时间戳,密码password被加密处理了,captchagid和rsatimestamp不知道是什么,captcha_text是验证码:
我们注意到登录请求的上面,还有一个getrsakey的请求,很明显和RSA加密有关,应该是获取key之类的参数,可以看到其返回值类似于:
{"success":true,"publickey_mod":"b1aefdedcbda75cdc8cdbed5bd17dbaf75e1e......","publickey_exp":"","timestamp":"","token_gid":"ce76aad12"}
这里可以发现登录请求的rsatimestamp参数就是这里的timestamp,其他参数在后面会用到。
XHR断点定位本次案例我们使用XHR断点来定位加密的位置,首先了解一下什么是XHR,XHR全称XMLHttpRequest,XHR可以在不重新加载页面的情况下更新网页、在页面已加载后从服务器请求、接收数据,是Ajax的基础,属于Ajax特殊的请求类型,利用浏览器控制台可以过滤XHR请求。
既然是XHR断点,那么这种方法就只能用于XHR请求,这也是这种方法的缺点,通过XHR断点,定位到的位置通常在加密处理完成之后,已经准备发送请求了,这样的优点是我们可以跟踪栈,能比较容易地找到加密的地方。
XHR断点定位有两种方法,第一种是找到发送请求的URL之后,截取URL的一部分,在Source面板下,右侧XHR/fetchBreakpoints里添加你截取的URL,如下图所示,已成功断下:
第二种方法,在Network面板,点击XHR过滤XHR请求,在Initiator项里可以看到调用的JS,鼠标移到JS上,可以看到调用栈,点击第一个,即可进入到发送请求的地方,定位到的位置和第一种方法是一样的。这种方法需要注意的是,XHR过滤不一定准确,但是只要是Initiator项里可以看到JS,就说明可以跟进去进行调试,如果是通过Form表单或者其他方式发送的请求,Initiator项会显示Other,此时就不能通过这种方法进行调试。
参数逆向前面XHR的两种方法,无论使用哪一种,定位到的位置都是一样的,查看右侧CallStack,即调用栈,一步一步往上查看调用的函数,在login.js里面,可以找到语句varencryptedPassword=RSA.encrypt(password,pubKey);,非常明显的RSA加密:
可以关键代码改写一下,方便本地调试:
functiongetEncryptedPassword(password,results){varpubKey=RSA.getPublicKey(results.publickey_mod,results.publickey_exp);password=password.replace(/[^\x00-\x7F]/g,);varencryptedPassword=RSA.encrypt(password,pubKey);returnencryptedPassword}
找到加密的位置后,就可以埋下断点,取消XHR断点,重新进行调试,可以看到results就是前面getrsakey请求返回的数据:
RSA.getPublicKey和RSA.encrypt分别是rsa.js里面RSA的getPublicKey和encrypt方法:
将整个rsa.js复制下来进行本地调试,会提示BigInteger未定义,鼠标放上去会看到是用到了jsbn.js里面的方法,如果一个一个函数去扣的话会比较麻烦,直接将整个jsbn.js文件代码复制下来即可:
完整代码GitHub