javaweb代码审计之注入审计

引用文献

sql注入

  • 直接去sql语句调用的地方,测试,一般写在mapping文件夹下

    观察执行sql语句,和数据交互的这块代码,是否存在sql注入

    1、例如没有使用预编译接口PreparedStatement,并且采用字符拼接的方式执行sql语句

    String checkUserQuery =
                "select userid from sql_challenge_users where userid = '" + username_reg + "'";
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(checkUserQuery);        
    

    2、用了PreparedStatment ,但是没有使用占位符,依旧采用字符串拼接的方式,

Class.forName("com.mysql.cj;jdbe.Driver");
conn = DriverManager.getConnection("jdbc:mysql://192.168.88.20:3306/iwebsec?&useSSL=false&serverTimezone=UTC","root","root");
String usemame="user%' or '1'='1'#";
String id ="2";
String sql="SELECT*FROM user where id =?";
if (!CommonUtils.isEmptyStr(usemame))
sql+="and usemame like "%" + userame + "%";
System.out.println(sql);
PreparedStatement preparedStatement = conn.preparesStatement(sql);preparedStatement.setString(l,id);
rs = preparedStatement.executeQuery(0)

3、order by注入,当需要使用order by语句进行查询,不能采用PreParedStatement

因为order by后面的传入的数据不能加上引号,否则会被当成字符串,导致无法使用,而

PreparedStatment就是采用占位符的方式,插入参数,这种方式会给参数带上引号,导致order by语句失效,同时order by语句需要字符拼接的方式进行语句调用

4、模糊查询,like %keyword%这样的语句需要注意

命令注入

  • Runtime.getRuntime().exec(),ProcessBuilder.start()两种函数可能导致命令执行

    可以利用|,||,&,&&做命令连接

  • 局限性,在于java字符串会把传过来的数据当成一个整体字符串,而不是两条命令

    所以难以向php那样进行命令注入

代码注入

  • 利用java的反射机制,将用户输入的数据作为代码执行,java中反射可以动态编译运行

    代码

  • 敏感函数Class.forName,Constructor.newInstance(),Method,Process

    URLloader远程类加载

表达式注入

  • Javaweb中jsp文件常用el表达式,用于用户访问页面的上下文以及不同作用域的对象,取得对象属性值或者执行简单的操作,调用Java方法,获取 web对象等

  • el表达式基础语法${name}表示获取name变量,当el表达式未指定作用域范围时,默认

    在page作用域范围内查找,而后依次在request、session,application范围内查找,

    也可以使用作用域范围作为前缀指定查找如${requestScope.name},表示在request中

    寻找name变量

  • el表达式获取对象,两种方法,第一种格式为${对象.属性},例如${param.name}表示获取pararm对象中的name属性,或者${对象[属性]}例如${param[name]}

  • 禁用el表达式的方法,在el表达式前面加上,\${内容}

    <%@ page isELIgnored="true" %>

    <jsp-property-group>
        <url-pattern>*jsp</url-pattern>
        <el-ignored>true</el-ignored>
    </jsp-property-group>
    
  • 危险关键字StandardEvaluationContext

模板注入

  • FreeMarker模板注入

    由4部分组成
    
    文本:文本会原样输出
    
    插值:这部分的输出会被模板引擎计算得到的值执行替换
    
    FTL标签:FTL标签与HTML标签相似,但是FTL是给FreeMarker的指示,而且不会打                            印在输出内容中
    
    注释:注释与HTML类似。但是会被FreeMarker直接忽视,更不会在输出内容中显示
    
  • 内建函数的使用,FreeMarker模板中预制了大量内建函数,如果没有利用好,可能会造成漏洞

  • new函数的利用,new函数可以创建一个项目freemaker.template.TemplateModel类的实例,查阅源码时发现freemarker,template.utility.Excute#exec可以执行任意代码注入

  • payload:<#assign value="freemarker.template.utility.Execute"?new()>${value("calc.exe")}>

  • 此外还有ObjectConstructor,JythonRuntime,Execute这些类也可以被利用执行恶意代码

  • payload :

    <#assign value="freemarker.template.utility.JythonRuntime"?new()>import 
    os;os.system("calc.exe")>
    <#assign value="freemarker.template.utility.Execute"?new()>
    ${value("calc.exe")}>
    <#assign value="freemarker.template.utility.ObjectConstructor"?new()>
    ${value("Java.lang.ProcessBuilder","calc.exe").start()}>        
    
  • api函数利用,可以用来访问Java API,使用方法为value?api.someJavaMethod(),相当于value.someJavaMethod(),因此可以通过getClassLoader来获取一个类加载器,用来加载恶意类,也可以通过getResource来读取服务器上的资源文件

  • payload<#assign classLoader=object?api.class.getClassLoader()>${classLoader.loadClass("Evil.class")}>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值