代码扫描,漏洞检测

1)

SQL注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原SQL语句的含义,进而执行任意SQL命令,达到入侵数据库乃至操作系统的目的。在Mybatis Mapper Xml中,#变量名称创建参数化查询SQL语句,不会导致SQL注入。而$变量名称直接使用SQL指令,而$变量名称直接使用SQL指令,将会存在一定风险,当SQL指令所需的数据来源于不可信赖的数据源时,可能会导致SQL注入。

例如:以下代码片段采用$变量名称动态地构造并执行了SQL查询。



如果攻击者能够替代username中的任意字符串,它们可以使用下面的关于username的字符串进行SQL注入。
validuser' OR '1'='1
当其注入到命令时,命令就会变成:
select * from db_user where user_name ='validuser' OR '1'='1'。即使所输入字符串不是来源于不可信赖的数据源,程序仍然存在着一定风险。


 

2)

程序间接引用了可能为null的变量,从而引发空指针异常。

例如:下面代码片段中,在使用变量data之前没有判断它是否为null。

...
Data data = null
...
data.setId(id);
...

3)

AccessibleObject类是Field、Method和Constructor对象的基类,能够允许反射对象修改访问权限修饰符,绕过由Java访问修饰符提供的访问控制检查。它让程序员能够更改私有字段或调用私有方法,这在通常情况下是不允许的。

例如:以下代码片段中,将Field将accessible标记设置为true。

Class clazz = User.class;
Field field = clazz.getField("name");
field.setAccessible(true);
...

4) 

在序列化类中,调用一些危险方法,例如反射相关的方法,同时如果应用对用户输入,即不可信数据,没有进行校验就进行反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。
例如引起2015年java反序列漏洞的组件Apache Commons Collections中的org.apache.commons.collections.functors.InvokerTransformer类。

5)

程序中采用DNS名称进行安全认证,但DNS名称是容易被攻击者进行欺骗的。

例如:下面代码片段中,如果发生DNS欺骗,程序执行将会绕过安全验证。

String ip = request.getRemoteAddr();
InetAddress inetAddress = InetAddress.getByName(ip);
if (inetAddress.getCanonicalHostName().endsWith("demo.com")) {
    //Verification passed
}

 6)

Java API中提供了java.util.Random类实现PRNG(),该PRNG是可移植和可重复的,如果两个java.util.Random类的实例使用相同的种子,会在所有Java实现中生成相同的数值序列。

例如:下面代码片段中,使用了java.util.Random类,该类对每一个指定的种子值生成同一个序列。

import java.util.Random;
// ...
public static void main (String args[]) {
    // ...
    for (int i = 0; i < 10; i++) {
        Random random = new Random(123456);
        int number = random.nextInt(21);
        ...
    }
}

 

你可能感兴趣的:(mybatis)