该项目来自 Kyle B3nac ,是一名全职安全研究员、CTF出题人、漏洞赏金猎人。
该项目是一个Android application靶场,基于漏洞挖掘、漏洞利用,以CTF的形式呈现。
作者建议反编译apk来解题,那就jadx-gui吧。
前五题难度不大,适合初学者练手。
注:FLAG已作打码处理
Github:https://github.com/B3nac/InjuredAndroid
作者对这个项目的介绍:https://twitter.com/B3nac/status/1317185026677641218?s=20
XSSTEST is just for fun and to raise awareness on how WebViews can be made vulnerable to XSS.
当前Actvity为 XSSTextActivity
,反编译,看一下程序对输入值的处理过程:
public void submitText(View view) {
Intent intent = new Intent(this, DisplayPostXSS.class);
intent.putExtra("com.b3nac.injuredandroid.DisplayPostXSS", ((EditText) findViewById(R.id.editText)).getText().toString());
startActivity(intent);
}
输入的text作为参数直接传给 com.b3nac.injuredandroid.DisplayPostXSS
public final class DisplayPostXSS extends C0459c {
/* access modifiers changed from: protected */
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
WebView webView = new WebView(this);
setContentView((View) webView);
String stringExtra = getIntent().getStringExtra("com.b3nac.injuredandroid.DisplayPostXSS");
WebSettings settings = webView.getSettings();
C2646d.m10664b(settings, "vulnWebView.settings");
settings.setJavaScriptEnabled(true); // 开启WebView的js执行
webView.setWebChromeClient(new WebChromeClient());
webView.loadData(stringExtra, "text/html", "UTF-8");
}
}
在该段代码中,可以得到程序新建了一个WebView,并开启了其执行JS的能力。
在这使用最简单的xss payload: <script>alert('xss')</script>
,即可。
这个例子简单直观的展示了开发者如何导致WebView存在XSS漏洞。
输入字符串来验证是否为FLAG
反编译之后,可以看到点击Button后的处理过程,输入的字符串直接与明文FLAG进行对比:
输入flag:
绕过main activity 来调用其他可导出的activities
这里使用dorzer:
dz> run app.activity.info -a b3nac.injuredandroid
Package: b3nac.injuredandroid
b3nac.injuredandroid.CSPBypassActivity
Permission: null
b3nac.injuredandroid.RCEActivity
Permission: null
b3nac.injuredandroid.ExportedProtectedIntent
Permission: null
b3nac.injuredandroid.QXV0aA
Permission: null
b3nac.injuredandroid.DeepLinkActivity
Permission: null
b3nac.injuredandroid.MainActivity
Permission: null
b3nac.injuredandroid.b25lActivity
Permission: null
b3nac.injuredandroid.TestBroadcastReceiver
Permission: null
com.google.firebase.auth.internal.FederatedSignInActivity
Permission: com.google.firebase.auth.api.gms.permission.LAUNCH_FEDERATED_SIGN_IN
依次打开可被导出的组件:
dz> run app.activity.start --component b3nac.injuredandroid b3nac.injuredandroid.ExportedProtectedIntent
dz> run app.activity.start --component b3nac.injuredandroid b3nac.injuredandroid.CSPBypassActivity
dz> run app.activity.start --component b3nac.injuredandroid b3nac.injuredandroid.QXV0aA
dz> run app.activity.start --component b3nac.injuredandroid b3nac.injuredandroid.b25lActivity //this one
看一下Button被触发后的处理流程:
public final void submitFlag(View view) {
EditText editText = (EditText) findViewById(R.id.editText2);
C2646d.m10664b(editText, "editText2");
if (C2646d.m10663a(editText.getText().toString(), getString(R.string.cmVzb3VyY2VzX3lv))) { // 对比
Intent intent = new Intent(this, FlagOneSuccess.class);
new FlagsOverview().mo6178L(true);
new C1464j().mo6221b(this, "flagThreeButtonColor", true);
startActivity(intent);
}
}
在这,使用apktool来反编译apk
apktool d InjuredAndroid-1.0.10-release.apk -o injured
在values/strings可以看到cmVzb3VyY2VzX3lv的值:
输入flag:
依然是输入flag,进行验证:
分析触发Button时的处理逻辑:
public final void submitFlag(View view) {
EditText editText = (EditText) findViewById(R.id.editText2);
C2646d.m10664b(editText, "editText2");
String obj = editText.getText().toString(); //获取输入
byte[] a = new C1461g().mo6220a();
C2646d.m10664b(a, "decoder.getData()");
if (C2646d.m10663a(obj, new String(a, C2672c.f6838a))) { // compare
Intent intent = new Intent(this, FlagOneSuccess.class);
new FlagsOverview().mo6175I(true);
new C1464j().mo6221b(this, "flagFourButtonColor", true);
startActivity(intent);
}
}
依次分析
byte[] a = new C1461g().mo6220a();
package b3nac.injuredandroid;import android.util.Base64;
/* renamed from: b3nac.injuredandroid.g */
public class C1461g {
/* renamed from: a */
private byte[] f4478a = Base64.decode("NF9vdmVyZG9uZV9vbWVsZXRz", 0);
//Base64.decode("NF9vdmVyZG9uZV9vbWVsZXRz", DEFAULT); 自行decode 得到flag
/* renamed from: a */
public byte[] mo6220a() {
return this.f4478a;
}
}
可得:a = Base64.decode("NF9vdmVyZG9uZV9vbWVsZXRz", 0);
if函数的条件
C2646d.m10663a(obj, new String(a, C2672c.f6838a)) //比对obj(即输入)和a的值
分析 C2672c.f6838a
函数
Charset forName = Charset.forName("UTF-8");
C2646d.m10666d(forName, "Charset.forName(\"UTF-8\")");
f6838a = forName;
所以该函数可以简化为:
C2646d.m10663a(obj, new String(a, "UTF-8")) //compare
输入flag
三、Overview
整个靶场共18项,flag项共17个。
E
N
D
关
于
我
们
Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室,近三年来在网络安全技术方面开展研发项目60余项,获得各类自主知识产权30余项,省市级科技项目立项20余项,研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。对安全感兴趣的小伙伴可以加入或关注我们。
我知道你在看哟