InjuredAndroid - CTF 0-6

本文最后更新于 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


InjuredAndroid - CTF 0-6
http://example.com/2026/02/24/InjuredAndroid - CTF 0-6/
作者
J_0k3r
发布于
2026年2月24日
许可协议
BY J_0K3R