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")}>