漏洞 4:登录验证流程——Token 在验证之后才生成
漏洞 4:登录验证流程——Token 在验证之后才生成
代码证据
((Button) findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener() { |
出处:Login.java,第 49-60 行。
流程解读
用户输入用户名 + 密码 |
三元条件的证据意义
if (!zCheckCredentials) { |
这个三元条件意味着:
createSession()只会在凭证验证成功之后才被调用。
为什么这个顺序很重要
"先生成 token,再验证用户" 是错的:
随机生成 token → 声称这是用户 XXX 的 token → 无法验证 |
"先验证用户,再生成 token" 是对的:
验证用户身份 → 确认是用户 XXX → 为用户 XXX 生成 token |
这个 App 是第二种。
对安全的影响
当 token 生成有严格顺序时:
| 步骤 | 正常流程 | 如果 token 可预测 |
|---|---|---|
| 1 | 用户提供正确凭证 | 用户提供正确凭证 |
| 2 | 系统验证凭证 | 系统验证凭证 |
| 3 | ✅ 生成 session token | ⚠️ 攻击者提前预测出 token |
| 4 | 用户获得 token,进入账户 | 攻击者直接用预测的 token 进入账户 |
问题核心: 步骤 2 虽然正确,但步骤 3 的弱点使得整个认证链条被削弱。
这段代码还透露了什么
Log.d("result func:", "" + zCheckCredentials); |
登录验证的结果被写进了 Logcat——这是安卓系统的日志输出。
这意味着什么
如果攻击者有一台已 Root 的手机,或者通过 ADB 调试模式连接: - 可以用
adb logcat 实时查看登录验证结果 -
甚至可以看到验证是"成功"还是"失败"
这是一个额外的攻击面,但它是次要发现,主漏洞仍然是
java.util.Random 用于 session token。