前言
越来越多的网站数据传输都选择了前台js加密,如果不了解其加解密方式会对我们的渗透带来极大困扰。笔者对于js调试,加解密这块知识都非常的薄弱,这里系统的学习总结一下。
常见的加密方式
对称加密
对称加密就是指加解密都是使用同一个密钥的加密方式,发送方使用密钥将明文数据加密成密文,然后发送出去,接收方收到密文后,使用同一个密钥将密文解密成明文读取。
常见的对称加密有:AES,DES,3DES,RC4,RC5…
特点:加密解密效率高
,速度快
,适合进行大数据量
的加解密。
非对称加密
非对称加密算法需要两个密钥:公开密钥(public key)和 私有密钥(private key)。
公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密,这种情况主要用来加解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密,这种情况主要用来做为签名。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法
最常见的非对称加密算法便是RSA算法
特点:算法复杂
,加解密速度慢
,但安全性高
,一般与对称加密结合使用(对称加密对内容加密,非对称对对称所使用的密钥加密)
单向散列函数加密
特点:
- 不管明文多长,散列后的密文定长
- 明文不一样,散列后结果一定不一样
- 散列后的密文不可逆
- 一般用于校验数据完整性、签名 sign
- 由于密文不可逆,所以后台无法还原,也就是说他要验证,会在后台以跟前台一样的方式去重新签名一遍。也就是说他会把源数据和签名后的值一起提交到后台。所以我们要保证在签名时候的数据和提交上去的源数据一致,这种算法特喜欢在内部加入时间戳
常见算法:MD5,SHA1,SHA256,SHA512,HmacMD5…
BASE64
- 所有的数据都能被编码为只用65个字符就能表示的文本。
标准的Base64每行为76个字符,每行末尾添加一个回车换行符(\r\n)。不论每行是否满76个字符,都要添加一个回车换行符。 - 65字符:A
Z az 0~9 + / =
URL Base64算法中,为了安全,会把 + 替换成 - ,把 / 替换成 _
= 有时候用 ~ 或 . 代替 - Base64的应用
密钥,密文,图片,数据简单加密或者预处理 - Base64编码解码与btoa、atob
HEX
- 二进制数据最常用的一种表示方式。
- 用0-9 a-f 16个字符表示。每个十六进制字符代表4bit。也就是2个十六进制字符代表一个字节。
js断点调试
断点,调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析。也可以在一次调试中设置断点,下一次只需让程序自动运行到设置断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时间。——百度百科
chrome的开发调试工具里面就很多调试方法,支持的断点方法如下图尖头所指列表。
上面图标代表各个功能分别为:
- Pause/Resume script execution:暂停/恢复脚本执行(程序执行到下一断点停止)。
- Step over next function call:执行到下一步的函数调用(跳到下一行)。
- Step into next function call:进入当前函数。
- Step out of current function:跳出当前执行函数。
- Deactive/Active all breakpoints:关闭/开启所有断点(不会取消)。
- Pause on exceptions:异常情况自动断点设置。
断点方法很多本文不做详细记录具体可参考文章:https://www.cnblogs.com/bmjoker/p/11784817.html
定位前端加密方法
无法定位到加密方法所在就无法准确的了解到对方使用的加密方式,后面编写脚本测试自然也无从下手。
onClick定位法
有时候在触发提交表单的标签中会存在一个onClik属性,该属性的值正好是一个js函数。而这个函数往往就是我们要找的数据加密函数。我们只需要找到它定义的地方即可。
关键词定位
以某东为例子,登陆抓包或者使用chrome开发者面板下network下的XHR获取加密的参数。
切换到控制台Source 选项卡全局搜索nloginpwd参数,可以看到一个显眼的函数,最后在全局搜索该函数的出处即可
或者直接使用一些常用的加密函数来进行搜索,如md5,aes,des,rsa,encrypt,tripedes,publickey,setpubkey,setpublickey…
Event Listeners定位法
利用开发者工具Event Listeners面板监听登陆过程中的click事件
不少文章都有提到该方法,但我在使用过程中体验不佳等后面我有对该方法更多心得体会再继续更新该方法的使用。
使用BurpCrypto进行爆破测试
burp插件下载地址:https://blog.wanghw.cn/security/burpcrypto-tutorial.html
该插件使用的详细用法文章:https://blog.wanghw.cn/security/burpcrypto-tutorial.html
常规的AES,RSA这种加密我暂时没有找到实际例子而且这种比较简单这里就不展开细说,最重要的是是否能够找到key值与lv偏移量注意其输出编码方式。具体可以看我兄弟的实战文章:https://www.cnblogs.com/Mikasa-Ackerman/p/ji-yi-ci-shen-tou-ce-shi.html
这里我比较关注直接将加密算法的Javascript脚本运行的ExecJs功能
ExecJs功能
以某网站为例子,首先尝试登陆看看数据传输格式。
非常多的登陆参数,很有可能加入时间戳等方式防止登陆爆破这种情况我更加推荐使用python调用浏览器来模拟登陆进行爆破。
先查找加密方法全局查找password参数
在全局搜索进行定位方法:
测试到可以在本js文件中直接调用
我们把该js文件直接copy过去
成功执行js代码进行加密,后面只需要使用该方法进行爆破即可