new blog:http://showmeshell.top/2018/08/31/Android-DIVA%E5%88%86%E6%9E%90/
主要是由于app代码中将敏感信息输出到app的logcat中,查看app记录的logcat
adb shell ps| grep -i diva
adb shell logcat | grep 1012
在diva中输入数字1111222233334444 测试:输出纯文本显示应用程序的信息
不安全的数据存储也是App常见的安全问题之一,主要有三种方式:
1,将敏感数据保存到配置文件中;
2,将敏感数据保存在本地的sqlite3数据库中;
3,将敏感数据保存在临时文件或者sd卡中。
源码:InsecureDataStorage1Activity
去/data/data/jakhar.aseem.diva
(包的名称) shared_prefs 文件夹中找到:-检查内容:-打开.xml文件,找到用户先前引入的凭据:SharedPreferences类存储的数据会以.xml的形式存储在/data/data/apppackagename/shared_prefs
用户的敏感信息存储到本地的数据库中,一般app对应的数据库目录:/data/data/apppackagename/databases
打开文件夹,有许多不同的数据库。
我们可以尝试其中任何一个,直到找到有趣的信息 但是,为了简单起见,我们直接转到ids2:- Android使用 sqlite 数据库管理系统:- ids2数据库中有2个表:- 从表myuser中选择所有内容,我们找到用户引入的凭据
/data/data/jakhar.aseen.diva/零时数据 uinfotemp
原目录查看,InsecureDataStorage4Activity
发现函数getExternalStorageDirectory()
及uinfo.txt
//SQLInjectionActivity
package jakhar.aseem.diva;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class SQLInjectionActivity extends AppCompatActivity {
private SQLiteDatabase mDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
mDB = openOrCreateDatabase("sqli", MODE_PRIVATE, null);
mDB.execSQL("DROP TABLE IF EXISTS sqliuser;");
mDB.execSQL("CREATE TABLE IF NOT EXISTS sqliuser(user VARCHAR, password VARCHAR, credit_card VARCHAR);");
mDB.execSQL("INSERT INTO sqliuser VALUES ('admin', 'passwd123', '1234567812345678');");
mDB.execSQL("INSERT INTO sqliuser VALUES ('diva', 'p@ssword', '1111222233334444');");
mDB.execSQL("INSERT INTO sqliuser VALUES ('john', 'password123', '5555666677778888');");
}
catch(Exception e) {
Log.d("Diva-sqli", "Error occurred while creating database for SQLI: " + e.getMessage());
}
setContentView(R.layout.activity_sqlinjection);
}
public void search(View view) {
EditText srchtxt = (EditText) findViewById(R.id.ivi1search);
Cursor cr = null;
try {
cr = mDB.rawQuery("SELECT * FROM sqliuser WHERE user = '" + srchtxt.getText().toString() + "'", null);
StringBuilder strb = new StringBuilder("");
if ((cr != null) && (cr.getCount() > 0)) {
cr.moveToFirst();
do {
strb.append("User: (" + cr.getString(0) + ") pass: (" + cr.getString(1) + ") Credit card: (" + cr.getString(2) + ")\n");
} while (cr.moveToNext());
}
else {
strb.append("User: (" + srchtxt.getText().toString() +") not found");
}
Toast.makeText(this, strb.toString(), Toast.LENGTH_SHORT).show();
}
catch(Exception e) {
Log.d("Diva-sqli", "Error occurred while searching in database: " + e.getMessage());
}
}
}
//Java源代码通知有关存储用户凭据的SQLite数据库:
/*检查前一句,最后一个字符串由两部分组成。第一部分对应于无效用户,但它使用OR二进制操作链接到第二部分。第二部分始终为“true”('2'='2'),因此整个字符串也是“true”(0 OR 1 = 1)。剩下的两个连字符 - 意味着连字符后的所有内容都被视为注释。*/
应用程序要求提供URL,例如http://showmeshell.top浏览器按预期打开此博客的网站:- 但是,这种情况可用于使用不同的协议来利用浏览器HTTP,例如File协议,用于读取内部文件系统的内容,甚至是外部存储器中的数据。- 从上一个练习中,我们在此路径中存储了一些凭据:- 使用File protocole,可以实现对uinfo文件的访问:- 将File文件路径作为输入,显示uinfo文件的内容:- 在同样,此输入验证漏洞可用于访问外部存储上的数据。例如,假设SD卡上有一个密钥文件:Key.txt
可在AndroidManifest.xml中查看文件中暴露的activity组件
divajni.c 保存原始C语言程序,其中供应商密钥存储为常量(#define VENDORKEY“olsdfgad; lh”),后来与函数 strncmp进行比较:最重要的结论是要记住开发人员经常将密钥硬编码到 .so 文件中
要了解应用程序内部发生的情况,检查logcat命令生成的日志非常方便。找到signal(SIGSEGV=segmentation fault ,or segmentation violation),出现内存保护的现象。
adb shell ps | grep -i diva
adb shell logcat | grep (pid)
找到Java source =InputValidation3Activity.java
找到 divajni.c 找到关于CODESIZEMATX的定义, app/src/main/jni
问题函数:strcpy没有检查目标缓冲区的大小足以容纳源参数,输入超过20个数后,灰造成内存损坏或者缓冲区溢出。