wsy1qaz2wsx

导航

AndroGoat Writeup

  • INSECURE DATA STORAGE
    InsecureStorageActivity为该界面对应activity.

    • SQLITE
      在jadx中打开APP,找到InsecureStorageSQLiteActivity,onCreate$lambda$1方法中可见:

      存在SQL注入风险.但由于SQLite默认禁用引号连接的多条语句(后面的语句会报错不执行),所以无法通过SQL注入获取数据.实际利用过程中可考虑通过该语句插入代码,再通过其他有回显的界面触发恶意代码.此处直接获取SQLite数据库查看数据.
      数据库:/data/data/owasp.sat.agoat/databases/aGoat,先cp到/data/local/tmp,再chmod,最后adb pull:

      查看数据库:
    • TEMP FILE
      在jadx中打开APP,找到InsecureStorageTempActivity,onCreate$lambda$1方法中可见:

      直接cat对应文件即可:
    • EXTERNAL STORAGE - SDCARD
      与temp file同理,只不过是文件的保存路径不同罢了:
  • INPUT VALIDATIONS
    InputValidationsActivity为该界面对应activity.

    • INPUT VALIDATIONS - XSS
      在jadx中打开APP,找到XSSActivity,onCreate方法中可见:

      方框中代码在webview中加载了一个页面,将用户输入的Name内容显示出来.
      故输入,即可观察到弹窗.
    • INPUT VALIDATIONS - SQLI
      在jeb中打开APP(jadx打开SQLinjectionActivity会反编译失败),找到SQLinjectionActivity,onCreate$lambda$1方法中可见:

      此为select语句,输入admin' or 1=1 --,获取数据:
    • INPUT VALIDATIONS - WebView
      在jadx中打开APP,找到InputValidationsWebViewURLActivity,onCreate$lambda$0方法中可见:

      使用file协议可读取任意文件:
    • INPUT VALIDATIONS - QR CODE
      在jadx中打开APP,找到QRCodeXSSActivity,在onCreate、onCreate$lambda$1、onCreate$lambda$1$lambda0$方法中可见:

      找个二维码生成器,把<script>alert(1)</script>转成二维码,扫描后可得:
  • SIDE CHANNEL DATA LEAKAGE
    SideChannelDataLeakageActivity为该界面对应activity.

    • KEYBOARD CACHE
      在jadx中打开APP,找到KeyboardCacheActivity,代码中虽未见明显漏洞,但可知有输入内容。查看相关layout文件,发现输入框是edittext,没有做输入法泄露管理:

      查看测试机输入法,找到对应的keyboard cache(主要关注cache和database,前者是缓存文件,后者里可能有sqlite数据库):

    • INSECURE LOGGING
      在jadx中打开APP,找到InsecureLoggingActivity,在onCreate$lambda$1方法中可见:

      打开AndroidStudio,使用loggcat搜索password,可见:

    • CLIPBOARD - COPY AND PASTE
      在jadx中打开APP,找到ClipboardActivity,在onCreate$lambda$1方法中可见:

      可知敏感数据被添加到了剪贴板中.写个恶意app,能够读取剪贴板(实际流程中肯定不是点击才读取剪贴板):

      点击查看代码
        class MainActivity : ComponentActivity() {
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.mainactivity)
                val button = findViewById<Button>(R.id.button1)
                val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
                button.setOnClickListener{
                    val clipdata:ClipData? = clipboard.primaryClip
                    if(clipdata!=null && clipdata.itemCount>0){
                        val clipText:String = clipdata.getItemAt(0).coerceToText(this).toString()
                        val text:TextView = findViewById<TextView>(R.id.text)
                        text.text = clipText
                    }
                }
            }
        }
      
      实际效果:
  • HARD CODE ISSUES
    HardcodeViewActivity为该界面对应activity.

    • SHOPPING CART
      在jadx中打开APP,找到HardCodeActivity,在onCreate$lambda$1方法中可见:

      找到promoCode,输入即可触发漏洞:
    • AI CHAT
      在jadx中打开APP,找到AIChatActivity,可见API key:

      实际过程中可以用frida hook onCrate$lambda$1,实时打印API key.
    • VIEW CLOUD SERVICES
      与上文同理,jadx分析CloudServicesActivity可以找到硬编码key:
  • ROOT DETECTION
    非常简单的检测函数,位于RootDetectionActivity,函数名isRooted,核心原理是检测是否存在特定的apk和su文件.直接frida hook返回false即可.isRooted1并未被调用,但也是非常简单的检测函数,检测su ls /data/data能否正常执行.

  • EMULATOR DETECTION
    与上文相似,EmulatorDetectionActivity中使用isEmulator函数,通过分析多种环境变量/Flag,检测当前环境是否为模拟器.

  • BINARY PATCHING
    在jadx中打开APP,找到BinaryPatchingActivity,分析onCreate方法,可知若private final boolean isAdmin为ture,则可触发按钮.既然是final,考虑改变量.

    使用MT管理器提取安装包,查看apk,编辑classes.dex和classes2.dex,找到BinaryPatchingActivity,.line18下的if-eqz改为if-nez,保存.

    打包apk,签名并安装即可.

  • BIOMETRIC AUTHENTICATION
    在jadx中打开APP,找到BioMetricAuthActivity,分析onCreate$lambda$0方法,可知该app同时将BIOMETRIC_STRONG、BIOMETRIC_WEAK、DEVICE_CREDENTIAL加入了认证方式.

    BIOMETRIC_STRONG为高强度生物认证(安全指纹、3D人脸),BIOMETRIC_WEAK为弱生物认证(普通2D人脸等),DEVICE_CREDENTIAL为锁屏PIN/图案/密码.
    很多测试机的面部识别都会被Android认定为BIOMETRIC_WEAK.测试机的面部识别能否被照片欺骗可能会受到厂商补丁、系统版本等的影响,但若为WEAK,则说明其不具备3D人脸识别能力,是存在被攻击的可能的(仅具备可能强化过的2D人脸识别能力).
    对于没有启用CryptoObject的bio Auth,一般考虑从onAuthenticationFailed()方法入手,该方法在BiometricPrompt.AuthenticationCallback类中实现.
    查看app源代码,可发现其自行实现了该类:

    跟着分析BioMetricAuthActivity$onCreate$1,可见:

    可确定此为面部识别回调函数.故hook Error方法,在其中调用Succeeded方法即可:

    点击查看代码
    function bioAuthBypass(){
      Java.perform(function () {
    
      var callback = Java.use(
        'owasp.sat.agoat.BioMetricAuthActivity$onCreate$1'
    );
    
      var resultclass = Java.use(
        "androidx.biometric.BiometricPrompt$AuthenticationResult"
    )
      var result = resultclass.$new(null,2)
    
      callback.onAuthenticationError.implementation = function () {
        this.onAuthenticationSucceeded(result);
        };
      });
    }
    
    setImmediate(bioAuthBypass)
    
    使用之后连续错误验证直到验证结束,即可看到通过结果:

posted on 2026-05-14 11:24  wsyyyyyyy  阅读(19)  评论(0)    收藏  举报