第二部分 尝试操作文件
所谓的危险性操作,在applet的执行环境下可能发生的有:
读文件
写文件
执行
跨域取东西
跨域通知
跨域建立socket链接
调用外部引擎(JDBC等)
调用APPLET外的JAVA代码
控制浏览器做一些不合理动作
等等。
发用户机器上的文件给某人,不错的想法,但是这里涉及两个基本权限:读文件,上传文件。上一篇里,因为权限问题,写文件的时候断电了。试想毕竟是JAVA,一门庞大的语言,真的无懈可击么?这次我们读个东西试试。
Start代码:
File f = new File("c:/a.txt");
if (f.exists())System.out.println("可以读撒");
if (f.exists())System.out.println("可以读撒");
控制台打印出:
java.security.AccessControlException: access denied (java.io.FilePermission c:\a.txt read)
不能读文件,连最基本的“判断文件是否存在”都过不去。
读都不行,更别说执行了?
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("format d:");
Process process = runtime.exec("format d:");
控制台打印出:
java.security.AccessControlException: access denied (java.io.FilePermission C:\windows\system32\Client.exe execute)
不能执行,文件相关操作都控制的死死的。好吧,我不奢求直接用java控制文件了。记得在玩注入时,可以调用ACCESS等数据库的引擎去写文件。如果可以在applet中访问数据库,那有意思了,一样可以做些什么。间接访问文件,只要没有控制applet访问JDBC驱动的权限,就能执行sql。
Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
conn=DriverManager.getConnection("jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=C:/WINDOWS/system32/ias/dnary.mdb", strUserName, strPassword);
stmt=conn.createStatement();
conn=DriverManager.getConnection("jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=C:/WINDOWS/system32/ias/dnary.mdb", strUserName, strPassword);
stmt=conn.createStatement();
再看看结果:
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc)
又是失败,也就是说,applet控制了访问其他packet中的内容,只准访问自己内定的包,外部驱动不能用。我所知道的方法基本上都测试了,或许还有,但是这个层面上,最具代表性的都试了,其他的(跨域发送socket包等等)就不拿出来一一说明了。