【JS逆向分析】某药品网站价格(Price)解密
文章目录
- 1. 写在前面
- 2. 断点调试
- 3. 算法还原
【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章
作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!
1. 写在前面
有时候经常会碰到网站将一些敏感、有价值的信息进行加密,前端页面例如采用字体加密一类的方法对数据进行处理。后端接口则将字段的值进行处理后,返回一串密文
既然要呈现给用户浏览,那么展示的一定是明文的。所以接口返回的密文必然会经过前端JS算法的解密再进行渲染
分析网站:
aHR0cHM6Ly9tYWxsLnlhb2V4LmNvbS92Mi9wYWdlcy8jL3Byb2R1Y3Qvc2VhcmNoP2tleXdvcmQ9JUU1JTg1JUFEJUU1JTkxJUIzJUU1JTlDJUIwJUU5JUJCJTg0JUU0JUI4JUI4
2. 断点调试
老规矩,打开目标网站随意搜索一个关键词查看一下发包内容,可以看到price相关的字段信息都是处理过的密文,如下所示:
接下来我们需要去对密文进行解密还原,不然采集数据的话此类数据于爬虫端业务来说是无效的。这里有经验的都知道大概率是一个AES的加密,通过关键词的盲搜是可以定位到的,如下所示:
这直接就可以结束了!AES.decrypt仿佛在告诉你,别看了它就是你要找的那个人~
如果按照常规的流程来,我们也是可以通过XHR断点配合堆栈来进行分析,首先我们下一个断刷新后查看堆栈简单的静态分析一下JS代码,如下所示:
当你往下看到N的这里时,这里的特征不要错过了,如下图所示:
从上面截图的这部分JS代码,是可以去下断分析的。首先t.forEach()的这一手循环处理操作的对象全都是价格字段。其二就是这个T(e[t])的调用,方法T极有可能就是用于实现价格解密处理的
这里我们可以直接跳到T函数处,可以看到通过循环调用,传过来的font color=#ff0033 size=3>e参数都是不同的价格的密文信息,如下所示:
密文信息再经过b方法进行处理,这里我们直接跟进去。特征一下就明显了!b方法里面用到了AES算法,打上断点进一步可以看到返回值o经过上面的解密处理之后得到了最终的明文价格信息,如下所示:
3. 算法还原
最后,对上面的解密逻辑做一个简单的分析就可以直接实现解密算法了,解密采用了ECB模式和PKCS7填充。e密文信息、t一个固定的短字符串,用来部分替代密钥的一部分、v基础密钥
v.slice(0, 10)取v字符串的前10位,再取t前6位,并用0填充,保持长度为6位,最后两者相加组成新的密钥,解密算法实现如下:
const crypto = require('crypto');function aesDecrypt(e, t = '', v) {const key = Buffer.from(`${v.slice(0, 10)}${t.slice(0, 6).padStart(6, '0')}`, 'utf8');try {const decipher = crypto.createDecipheriv('aes-128-ecb', key, null);decipher.setAutoPadding(true);const decrypted = decipher.update(e, 'base64', 'utf8') + decipher.final('utf8');return decrypted;} catch (err) {return '';}
}const e = '2dPhq7KoBfA0YqBU8zTnBg==';
const t = '419397';
const v = 'GDLSAUO1KUMIIBCE';console.log(aesDecrypt(e, t, v)); // 输出解密后的明文