渗透测试之js加密解密安全过程

         在分析客户端本地加密破解案例之前,有必要抛出明文传输的问题。明文传输问题经常出现在web应用程序测试场景中。在客户端和服务器之间,使用HTTP.FTP和Telnet等非通道加密协议,没有对数据进行任何其他加密处理。敏感数据以明文直接传输。为了避免这个问题的影响,通道加密可以使用HTTPS协议。虽然大多数web应用程序已经转向HTTPS协议,但攻击者仍然可以在局域网中攻击HTTPS流量,并通过嗅探窃取用户的敏感信息。因此,HTTPS加密通道中出现了二次加密技术。

outputo-20220221-094928-269-vwhx.png

开发人员在实现二次加密需求时,会考虑利用客户端本地JavaScript技术对用户名、密码等敏感信息进行加密,然后发送到服务器端,通常采用base64编码、md5摘要、对称加密、非对称加密、自定义加密等方式对数据进行加密。然而,base64编码的处理极易恢复明文数据。本测试案例重点介绍了如何破解加密技术,篡改和传输数据,以达到攻击的目的。

案例一

微信公众号前端和服务器端通信采用AES加密,可在前端JavaScript中找到加密钥,加解密方法如下:在浏览器的控制里直接调佣解密函数,将密钥和加解密方法写入JavaScript代码里:接下来可以对登录进行暴力破解,这里做一个延伸,常见的Web登录暴力破解有三种模式:

1.固定账号暴力破解密码。

2.固定密码(通常设置为弱密码)在得知账号有一定规律性或通过其他方式获取大量账号的前提下,列出账号。

3.撞库攻击。

现场已知账户呈现一定的规律性,适用于第二种暴力破解模式:

第一步,根据上述方法调用解密函数解密登录数据:

{“type”:“dlyz”、“openid”、“o1vecufzn****pdcxu6ythrbk”、“accounttype”、“C”、“acount”、“61**01***01”、“password”、“16*****”、“valid_code”

修改account为不同值后,按照上述方法调用加密函数对登录数据进行加密,得到暴力破解所需的字典。这里建议写一个脚本进行批量处理。以下是暴力破解的结果。如果返回长度为1010和1004,登录成功。

案例二

开发人员使用自主开发的加密算法(简单的字符替换)加密所有请求和响应,所有请求通过POST请求的encode参数发送到服务器端,如退出登录请求如下:

在前端JavaScript中找到加解密码:代码定义了一个数组,用于存储一些字符串的ascii代码。取出数组第一位的数字c,如果不是0,将i对应的ascii代码转换为字符串ic。并将第一位对应的数字c转换为字符串,与ic构成加密字典encodearay(这个decodearay和encodearay一样)。例如,数组第25位对应数字47,asci码25对应字符%,asci码47对应字符/,从而形成字典%:/,以此类推构成encodearay和decodearay。

encode函数处理过程是将数据中的每一位进行分割,并通过encodearay找到相应的密文,完成加密。因此,可以编写逆算法脚本,根据字符替换关系进行逆向替换,从而获得明文数据。用脚本解密密文,如下图所示:篡改明文数据后,调用加密函数完成篡改后请求的加密,即可继续进行暴力破解、SQL注入、越权等漏洞测试。

渗透测试小结

针对明文传输问题,建议采用HTTPS协议进行通信。如果采用本地加密,建议使用不对称加密算法。HTTPS协议也是非对称算法安全交换密钥的重要保证。

防止数据篡改攻击,除了加密外,还可以使用数据签名机制防止数据被篡改。对于暴力破解攻击,建议从以下几个方面进行防御:

1.账户锁定。

账户锁定是一种非常有效的方法,因为暴力破解程序不太可能在5-6次检测中猜测密码。但它也拒绝了正常用户的使用。如果攻击者在用户名检测成功后进行暴力破解,就会造成严重的拒绝服务攻击。对于固定密码列出账户的模式,账户锁定无法防止暴力破解攻击。服务器端不返回任何锁定账户的提示信息,这可能会混淆攻击者,但用户体验会受到影响,因此需要找到安全和用户体验之间的平衡。

2.封锁多次登录的IP地址。

这种方法也有缺点,因为攻击者可以定期更换IP。

3.验证码

验证码是防止暴力攻击的好方法,但有设计缺陷的验证码可以绕过,开发人员在编码时应考虑风险。

分享: