记一次某公众号平台前端加密算法的解密


在一个风和日丽的上午,领导安排我对某公众号平台开展渗透测试。两天的测试结束后,撰写了本文。本文的重点将放在该公众号前端的AES加密算法的解密上,不足之处敬请包涵,谢谢!

一、信息搜集确定加密算法

(一)在电脑端访问微信公众号

首先打开测试网址,看看长啥样,我提示需要用微信登陆,意料之中,毕竟这是个公众号平台。
在这里插入图片描述一般而言在电脑上搞渗透测试比用模拟器去模拟手机环境方便很多,因此我考虑尽可能在电脑端去测试。那么这种情况一般用两种办法:第一是尝试修改UA请求头,另一种是查看前端代码看看获取了什么信息,是根据什么来判断客户端不是手机微信用户的。这里采用第二种,按F12查看前端代码,全局搜索Useragent
在这里插入图片描述看到前端代码中使用了该字段来获取客户端的信息,因此考虑用浏览器插件来伪造客户端的UA。打开插件,找到相应的选项,粘贴安卓客户端微信UA头部信息:
在这里插入图片描述然后激活该选项:
在这里插入图片描述
这里我使用的UA内容是:

Mozilla/5.0 (Linux; Android 10; ELE-AL00 Build/HUAWEIELE-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2691 MMWEBSDK/200901 Mobile Safari/537.36 MMWEBID/215 MicroMessenger/7.0.19.1760(0x2700133F) Process/toolsmp WeChat/arm64 NetType/WIFI Language/zh_CN ABI/arm64

该UA可用于模拟安卓手机用户。如果目标要求使用苹果客户端,可以使用以下UA:

Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176 MicroMessenger/4.3.2

本人使用的浏览器插件为UserAgent Switcher,网络上可以搜一下。另外我会同步上传到本博客,大家有需要的可以去下载。

(二)前端加密算法分析

通过刚才的操作,已经成功用电脑的浏览器访问公众号了:
在这里插入图片描述
随便输入了一下账号密码,发现需要保证账号是系统中已注册的才可以(看到这里小伙伴们是不是已经有了一下挖低危漏洞的想法了?没错,尝试进行用户名爆破!看看都有谁注册了账号!),所以去注册一个账号,然后尝试登陆并抓取数据包查看内容:
发现数据包的实体内容疑似泄露了服务器的加密算法:
在这里插入图片描述字段内容显示,加密类型为AES,同时末尾的字段是加密后的数据。因此只要尝试对其进行解密就可以获取明文的账号密码。
从网址中可以看出,此页面没有使用SSL协议对数据进行加密,因此该加密的过程必然是在前端进行。按F12查看前端代码:
看到login文件中,input标签将获取到的内容传给了name参数:
在这里插入图片描述JS文件中一定有变量去获取这个参数,因此全局搜索password:
在这里插入图片描述打开login.js文件,看到与账号密码加密相关的关键代码:
在这里插入图片描述根据代码的内容,判断前端肯定是使用了crypto-js库进行AES加密,ECB、Pkcs7。


二、本地环境AES算法加密、解密测试

下载crypto-js.min.js文件,查看内容,发现代码写的非常复杂,没有任何注释:
在这里插入图片描述考虑直接在本地使用该文件,了解加密逻辑和各参数的值。使用HBuilder工具,将crypto-js.min.js文件加载到JS目录下。经过测试,发现还缺少一个aes.js文件,于是继续在网站中寻找信息。后来发现,有时访问是没有aes.js文件的,但是只要登陆失败一次或者刷新一下页面,plugins/cryptoJs文件夹下就会多出一个aes.js文件:
在这里插入图片描述
于是下载aes.js文件,加载到js目录:
在这里插入图片描述
注意文件名要跟目标网站上的文件名一致,以免函数调用的时候出错。
接下来复制前端代码中的加密代码,输入一些参数并进行适当简化:
在这里插入图片描述运行结果如下:
在这里插入图片描述

实际测试我使用注册的账号来测试的,这里我就简单用随便一些数字来代替了,嘿嘿,个人信息还是要保密的。
然后根据加密算法在脚本上加上解密算法,完整代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>AES加解密测试</title>
		<!--引入目标网站crypto-js框架的aes和crypto-js文件-->
		<script src="js/aes.js"></script>
		<script src="js/crypto-js.min.js"></script>
		<script>
			var phone ="12300006789";
			var pass ="123456";
            //对账号密码进行加密
			var tmpParams = '{"phone":"'+phone+'","password":"'+pass+'"}';
			console.log("加密前的数据:"+tmpParams);
			var key = CryptoJS.enc.Utf8.parse("1B4I7NI8B0016E0A0A0A0000A3EEAF2C");
			console.log("key的值为:"+key);
			var enc = CryptoJS.AES.encrypt(tmpParams ,key,{mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
			var encryptData = enc.ciphertext.toString();
			console.log("加密后的结果为:"+encryptData);	
			
			//对加密后的数据进行解密
			var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptData);
			var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);
			var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
			var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);
			console.log("解密后的数据为:"+decryptedStr);	
		</script>
	</head>
	<body>
	</body>
</html>

运行结果如下:
在这里插入图片描述看到解密后的结果和加密前的结果一模一样,解密成功!


三、小结

本文分享了一个在电脑端访问公众号的方法,一般而言,简单修改UA请求头即可“骗过”前端代码,实现页面的访问,但如果目标增加了其他参数来判断,则需要找出具体是哪些参数在起作用,最好的办法就是查看前端源码,往往会有收获。
其次,本文介绍了crypto-js框架中,AES加密算法的解密方法,虽然网上也有一些文章介绍相关内容,但是读者如果仔细看,会发现,他们往往需要在本地搭建环境,建立相应的目录。这样的话,搭建环境本身就已经很费力了,还需要理解代码。因此本文推荐,简单的事情简单做,直接利用浏览器当运行环境,在本地使用HBuilder工具编写代码进行测试,然后通过浏览器去访问,简单方便。

### 微信小程序与公众号的安全测试方法 #### 一、微信小程序安全测试流程 对于微信小程序而言,其安全性评估主要围绕以下几个方面展开: 1. **环境搭建** 需要先设置好能够捕获并分析HTTP/HTTPS流量的开发调试环境。这通常涉及到安装诸如Fiddler或Charles这样的代理工具来拦截和查看应用发出的数据请求[^2]。 2. **静态代码审查** 利用专门设计的小程序反编译工具(如`wuWxapkg.js`),可以将`.wxapkg`文件解压成原始资源文件夹结构,进而深入研究JavaScript逻辑以及HTML模板中的潜在缺陷[^3]。 3. **动态行为监测** 结合上述提到的代理手段,在真实设备上运行目标应用程序的同时监控所有进出网络连接,特别关注API调用模式及其响应内容是否存在异常情况;另外还需注意本地存储机制是否妥善处理敏感信息。 4. **自动化脚本编写** 基于识别出来的风险点构建针对性强的压力测试场景或是利用现有的开源框架(Burp Suite等)辅助执行更复杂的攻击模拟实验,比如SQL注入尝试、XSS跨站脚本攻击验证等等。 5. **权限管理审核** 对比官方文档说明仔细核查各项功能所必需获取的操作授权级别设定得当与否,并确保遵循最小化原则仅授予必要的访问权利给第三方服务提供商或其他合作方[^1]。 ```python import requests def test_sql_injection(url, param_name): payload_true = f"' OR '1'='1" response_true = requests.get(f"{url}?{param_name}={payload_true}") payload_false = "' AND '1'='2" response_false = requests.get(f"{url}?{param_name}={payload_false}") if "success" in str(response_true.text).lower() and not ("success" in str(response_false.text).lower()): print("[+] Potential SQL Injection vulnerability detected.") else: print("[-] No obvious signs of SQL injection.") test_sql_injection('http://example.com/api/check_phone', 'phone_number') ``` --- #### 二、微信公众平台安全检测要点 针对微信公众号本身,则应重点关注如下几个维度来进行全面的安全状况评测: - **身份认证强度**:检查登录过程是否有足够的防护措施防止暴力破解企图发生,例如采用图形验证码、滑动拼图等形式增加额外验证环节。 - **会话保持策略**:确认Session ID生成算法随机性强弱程度,传输过程中采取加密方式保护隐私不被窃取篡改,同时合理控制有效期避免长期有效带来的安全隐患。 - **输入校验严谨度**:无论是表单提交还是URL参数传递都应当严格执行白名单过滤规则,杜绝非法字符混入造成意外后果的可能性。 - **业务逻辑漏洞排查**:依据具体应用场景定制化的审计标准去发现可能存在的绕过支付限制、批量创建虚假订单等问题的发生几率。 - **第三方插件兼容性检验**:如果集成了其他厂商提供的SDK组件务必提前做好充分调研工作,确保对方已经按照最佳实践完成了相应的加固优化操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值