本文最后更新于 2026年2月24日 晚上
https://github.com/B3nac/InjuredAndroid/releases
通过apk安装

XSSTEXT
存在xss漏洞
1
| <script>alert('XSS');</script>
|

反编译apk,定位到b3nac.injuredandroid.XSSTextActivity

没有对用户输入进行处理。
跟进到com.b3nac.injuredandroid.DisplayPostXSS

webview配置允许执行JavaScript,
并且webView.loadData(stringExtra, "text/html", "UTF-8");将用户输入直接渲染为html页面,数据流如下
1
| 用户输入 → XSSTextActivity → Intent Extra → DisplayPostXSS → loadData()
|
FLAG ONE - LOGIN
定位到b3nac.injuredandroid.FlagOneLoginActivity

flag硬编码为F1ag_0n3

点击submit会跳转

此题旨在展示登录密码硬编码的漏洞。
FLAG TWO - EXPORTED ACTIVITY
提示There is a way to bypass the main activity and invoke other activities that are exported.绕过main activity调用其他可导出的activity
使用dorzer

直接在AndroidManifest.xml找

调用这个activity
1
| run app.activity.start --component b3nac.injuredandroid b3nac.injuredandroid.b25lActivity
|

或者
1
| adb shell am start -W -n b3nac.injuredandroid/.b25lActivity
|

exported="true" |
该Activity可以被其他应用程序(其他app或者activity)的组件启动 |
exported="false" |
该Activity只能被同一应用内的组件启动 |
FLAG THREE - RESOURCES

加载了一个字符串资源

F1ag_thr33
本题旨在演示信息泄露类漏洞,加载的资源可能包含敏感信息如加密密钥,apikey等
FLAG FOUR - LOGIN2
b3nac.injuredandroid.FlagFourActivity

字符串比较
定位这个数组值是g类的a方法b3nac.injuredandroid.g

解码得4_overdone_omelets
本题相对于login1字符串比较做了base64编码,旨在演示登录时比较硬编码用户名或密码的问题,但硬编码内容非明文。
FLAG FIVE- EXPORTED BROADCAST RECEIVER

第一次点击

第二次

第三次

查看b3nac.injuredandroid.FlagFiveActivity

注册了一个FlagFiveReceiver并用F()方法发送广播
监听器b3nac.injuredandroid.FlagFiveReceiver

就是上面点击题目后的逻辑
第一次点击i2=0执行这段代码

第二次点击i2=1,进入第一个if返回Keep trying!
第三次点击i2=2,返回String str = "You are a winner " + k.a("Zkdlt0WwtLQ=");,经过k.a des解密

得到{f1v3!}
数据流向
1
| 用户点击按钮 → H() → F() → sendBroadcast() → FlagFiveReceiver接收 → 处理逻辑
|
查看AndroidManifest.xml,这个广播接收器是可导出的
1 2 3 4
| <receiver android:name="b3nac.injuredandroid.FlagFiveReceiver" android:exported="true"/>
|
这意味着该 BroadcastReceiver 可以被任何其他应用访问和触发。可以构造特定Intent触发Receiver执行内部逻辑。
FLAG SIX - LOGIN3

字符串比较经过了des加密

找到keyf1472a = h.b();

解密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import base64
from Crypto.Cipher import DES
ENCODED_KEY = "Q2FwdHVyM1RoMXM=" ENCODED_STRING = "k3FElEG9lnoWbOateGhj5pX6QsXRNJKh///8Jxi8KXW7iDpk2xRxhQ=="
def decrypt(): key_byte_array = base64.b64decode(ENCODED_KEY)[:8] string_byte_array = base64.b64decode(ENCODED_STRING) des_handler = DES.new(key_byte_array, DES.MODE_ECB)
print(des_handler.decrypt(string_byte_array))
if __name__ == '__main__': decrypt() ###b"{This_Isn't_Where_I_Parked_My_Car}\x06\x06\x06\x06\x06\x06"
|
虽然登录验证的硬编码经过加密,但是依旧不安全,因为加密方法和密钥硬编码导致能解密原文。
像这种情况还可以直接用frida来hook这个解密方法调用来解密。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| // hook.js // 目标类: b3nac.injuredandroid.k // 目标方法: a (String) -> String
Java.perform(function () { console.log("[*] Java VM initialized, starting hook...");
try { // 定义目标类 var KClass = Java.use("b3nac.injuredandroid.k");
// Hook k.a(String str) 方法 // 注意:在 Smali 中方法名是 a,在 Java 中也是 a KClass.a.overload('java.lang.String').implementation = function (str) { console.log("[+] Intercepted call to k.a()"); console.log("[+] Input (Base64): " + str);
// 调用原始方法执行解密 var result = this.a(str);
console.log("[+] Output (Decrypted): " + result);
return result; };
console.log("[*] Hook successful for b3nac.injuredandroid.k.a");
setTimeout(function() { var targetString = "k3FElEG9lnoWbOateGhj5pX6QsXRNJKh///8Jxi8KXW7iDpk2xRxhQ=="; console.log("\n[*] Attempting to decrypt hardcoded string: " + targetString); try { var decrypted = KClass.a(targetString); console.log("[***] DECRYPTED RESULT: " + decrypted); } catch (e) { console.log("[-] Error during manual decryption: " + e); } }, 2000);
} catch (err) { console.error("[-] Error setting up hook: " + err); console.error(err.stack); } });
|
执行脚本 frida -U -f b3nac.injuredandroid -l hook.js
