android利用provider查询同一个数据库中没有对外暴露出来的表

【原创】转载请加本篇博客地址http://www.cnblogs.com/scarecrow-blog/p/6266042.html

个人感觉这是android provider 的一个漏洞, 废话少说直接上代码

 1     public String getCanonicalAddresses(String recipient_ids){
 2         String[] ids=recipient_ids.split(" ");
 3         System.out.println("recipient_ids:"+recipient_ids);
 4         String addressResult="";
 5         for (int i = 0; i < ids.length; i++) {
 6             Cursor cur=ReadSmsActivity.this.getContentResolver().query(Uri.parse("content://mms/"),
 7                     new String[]{" * from canonical_addresses where _id="+ids[i].toString()+" --"}, null,null,null);
 8             if(cur.getCount()>0){
 9                 while (cur.moveToNext()){
10                     String _id=cur.getString(cur.getColumnIndex("_id"));
11                     String address=cur.getString(cur.getColumnIndex("address"));
12                     addressResult+="{"+_id+","+address+"}";
13                 }
14             }
15         }
16         return addressResult;
17     }

看第6和第7行,mms provider 实际上查询彩信相关的内容,并没有提供canonical-address的查询功能。 但是上面这种写法,通过在query方法入参的projection中直接写上几乎整条查询语句,并在后面加上“--” 实现了通过mms provider直接查询db中canonical_addresses表的功能。

原理:

大家都知道 projection中通常都是要查的表中的各个列名, 所以最后拼出来放到数据库中执行的sql语句类似于 SELECT projection FROM table where ....

但是这里讲projection完全替换成另一个完整的语句, 所以最后拼出来的样子大致是 SELECT * from canonical_addresses where _id="2" -- FROM table where ....

Sql 中“--” 是注释的意思。 这个方法正是利用了这一点, 把原来provider通过URI限定的查询语句偷换成了另外一个查询语句,从而得到了一个私有表的查询结果。

时间: 2024-11-06 17:25:32

android利用provider查询同一个数据库中没有对外暴露出来的表的相关文章

查询整个数据库中某个特定值所在的表和字段的方法

CREATE PROCEDURE [dbo].[SP_FindValueInDB] ( @value VARCHAR(1024) ) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; DECLARE @sql VARCHAR(1024) DECLARE @table VARCHAR(64) DECLARE

SQL SERVER 查询整个数据库中某个特定值所在的表和字段的方法

SET NOCOUNT ON;DECLARE @sql VARCHAR(1024) DECLARE @table VARCHAR(64) DECLARE @column VARCHAR(64) DECLARE @value VARCHAR(64)  set @value='14799059407'CREATE TABLE #t (     tablename VARCHAR(64),     columnname VARCHAR(64) )  DECLARE TABLES CURSOR FOR

android 如何从服务器端的数据库中拿数据,在客户端显示类?

============问题描述============ android 如何从服务器端的数据库中拿数据,在客户端显示类? ============解决方案1============ 写一个网络访问的api,Android通过API取到数据, ============解决方案2============ 有種WebService的方法可以將資料用xml格式傳送取得 ============解决方案3============ 为神马要直接访问数据库呢 叫服务端给你开放几个接口不就行了么- - ===

查询mysql数据库中所有的表和对应表中所有的字段

查询smp_db数据库中所有的数据表INFORMATION_SCHEMA.TABLES select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='smp_db' 查询smp_db数据库中smp_import_db表所有的字段information_schema.`COLUMNS` select COLUMN_NAME from information_schema.`COLUMNS` where TABLE_SCHE

查询Oracle 数据库中带有lob字段的某一个表的大小

注意:由于lob字段有独立的lob segment来存储,故对于带有lob字段的表,不能仅仅查询dba_segments. 以下脚本来自: How to Compute the Size of a Table containing Outline CLOBs and BLOBs[Article ID 118531.1] 经过修改:改为了NVL(SUM(S.BYTES),0) SQL> col "TOTAL TABLE SIZE" format 99999999999999 ---

SqlServer查询出数据库中所有的表及其字段属性

代码如下所示: /********************************* SqlServer查询出数据库中所有的表及其字段属性 *********************************/ SELECT ( CASE WHEN a.colorder = 1 THEN d.name ELSE '' END ) AS 表名 ,--如果表名相同就返回空 a.colorder AS 字段序号 , a.name AS 字段名 , ( CASE WHEN COLUMNPROPERTY(a

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

腾讯优测是专业的app自动化测试平台,除了提供兼容性测试,远程真机租用等多维度的测试服务,还有优分享-腾讯内部的移动研发测试干货精选~ 许多APP都希望获取用户通讯录联系人,利用通讯录关系链信息来丰富产品功能.在读取系统联系人数据库的ContentProvider时,对于双卡双待手机,电话和短信数据都需要标识来自哪张卡. Android 5.0开始加入Dual Sim支持,Android 官方方案和mtk的方案十分类似,感兴趣的小伙伴可以直接移步mtk方案实现方式. 双卡数据库适配流程 根据系统

sql server 怎样用SQL语句查询一个数据库中的所有表?

搜了一大堆做个总结,以下是Sql Server中的方法,备忘下 1,利用sysobjects系统表 在这个表中,在数据库中创建的每个对象(例如约束.默认值.日志.规则以及存储过程)都有对应一行,我们在该表中筛选出xtype等于U的所有记录,就为数据库中的表了. 示例语句如下:: select * from sysobjects where xtype='U' 注意:在SQL SERVER2005中,出现了sys.objects目录视图来代替sysobjects系统表,我们在SQL SERVER2

Android 代码实现查看SQLite数据库中的表

前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的函数,对于数据库的查看很不方便,于是就写了一下查看数据库表的方法代码. 代码实现 import java.util.Arrays; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteData