本文为2016年google-ctf中little-bobby-application的writeup。
Find the vulnerability, develop an exploit, and when you’re ready, submit your APK to https://bottle-brush-tree.ctfcompetition.com. Can take up to 15 minutes to return the result.
Writeup
首先点我下载题目。直接使用jeb反编译,关键代码如下:
应用是一个注册/登陆程序,注册后账户密码存储到数据库,登陆时进行验证。在注册过程中看到与flag
相关的内容,程序提示通过注入来获取flag
。
继续分析应用找到可疑点:
《Android安全攻防实战》中写到:
确保攻击者不能把来路不明的SQL内容注入到你的查询语句中去,最好的办法就是:避免使用SQLiteDatabase.rawQuery(),而改用一个参数化的语句。
可以确定利用checkLogin()
进行SQL注入,编写App,通过给LoginReceiver
发送广播来获取flag
。
flag
和password
相同,根据生成过程可知password
组成为0-9,a-f。
题目的要求是获取flag
,可以使用SQLite的substr(X,Y[,Z])
在查询中对flag
进行逐位验证。
例如:username
设置" or substr(flag, 1, 1) = "c"
用来验证flag
的第一位是否是c
;若是,v0
不为空,msg
是Incorrect password
,说明结论成立。以此为依据,逐位验证。
完整的代码可以点我下载,也可在我的Repositories中找到。