网络安全 频道

Java applet 安全性探究

  第三部分 对浏览器的操作

  几天前看到一篇文章,提到“鬼域”,也就是“鬼页”。文中提到可以控制子窗口内部FRAME,IE6可以控制子窗口执行JS,但是IE7,FF不能做。那么用applet来执行的结果,和这篇文章的内容对比,可以多做些什么,而又不能实现什么呢?

  netscape.javascript.JSObject类可以在applet中调用JS,该类是个抽象类。这个类构造方法是protected的,也就是说,不能直接new出来,只能由子类new,调用其中的静态方法“getWindow(Applet applet)”返回它的一个实例。通常我们使用的时候,这样的设计,就限制了必须要有个applet执行时才可以实例化这个类,也就是当浏览器加载applet时才可以实例化JSObject。其中的eval方法顾名思义是执行js代码的,applet都能做,只是在页面上看不到JS代码而已,当然,在js中也可以调用applet的方法。这就有个安全隐患了,如果程序仅仅限制了<script>标签,那么使用applet,一样可以达到绕过限制调用JS。当然如果直接限制了“<”,那也没辙。

  下面是一般调用applet的html代码:

<applet code="AppletTest.class" width="300" height="200">
    不支持java虚拟机
</applet>

  只要贴在HTML页面,就能执行applet,CLASS文件是applet小程序的代码,如果用户浏览器不支持JVM虚拟机,会打出中间的信息。

  为了探究applet的安全性,本文拿那篇“浅析浏览器的跨域安全问题”一文的内容(没看过的自己去百度,如果不看该文,下面的内容会很生涩),来做个问题的模板,用applet来实现文中提到的一些技术,并对比一下和JS的安全性差异。

  首先是“伪协议”问题
  引用文章内容:

<script>
x
=window.open("about:blank");
x.location
="javascript:alert(document.domain)"
</script>
结果是:
IE6:执行了伪协议,认为弹出窗口的域是127.
0.0.1
IE7:执行了伪协议,认为弹出窗口的域是127.
0.0.1
Firefox:执行了伪协议,认为还没有域为NULL。

  这段代码取得子窗体的域,如果两个HTML文件在同一个域,就可以做很多事情,比如用“AJAX”技术把该页面的敏感信息提交到另一个页面,并且只有同域下的iframe才可以控制父页面。如下面这段JS,只能在同域下的iframe中执行。

parent.location.reload(true);             //让父窗口重新载入

  为了做对比,使用Applet来实现伪协议的效果:

this.getAppletContext().showDocument(new URL("http://192.168.0.3/"),"kxlzx");
this.getAppletContext().showDocument(
new URL("javascript:alert(document.domain)"),"kxlzx");

  这段代码第一行会弹出新的窗口,窗口名称为“kxlzx”(在程序中可以使用“kxlzx”访问弹出的窗口),第二行会在“kxlzx”这个窗口中继续显示"javascript:alert(document.domain)"。访问页面 http://192.168.0.3/test.htm,IE7和FF都弹出了“192.168.0.3”。请注意,这种情况发生在“当前页面和弹出页面都在同一个域”下。

0
相关文章