aboood
- 关注

1.SQL注入漏洞
SQL注入漏洞常年作为WEB应用中的普遍存在的高危漏洞,它的危害不用过多叙述,让我们查看SQLI.java内的源代码,源码内分别为我们演示了基于jdbc(Java Data Base Connectivity,java语言提供的访问关系型数据库的接口)的漏洞代码及安全代码和基于MyBatis( 一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射)的漏洞代码及安全代码。
1.1 jdbc_sqli_vul方法(漏洞方法)
jdbc_sqli_vul方法是基于jdbc实现的数据库访问功能,当查看源代码时IDEA上的代码检测插件已经明确提示当前代码存在SQL注入漏洞,查询语句使用了拼接的方式,statement接口实例直接使用存在漏洞的语句进行数据库查询操作,使用payload:http://127.0.0.1:8080/sqli/jdbc/vuln?username=1%27%20or%20%271%27=%271,成功返回表内全部数据。
1.2 jdbc_sqli_sec方法(安全方法)
jdbc_sqli_sec方法使用了PreparedStatement接口来访问数据库,PreparedStatement继承自statement接口,功能比其更加强大,提供参数化查询功能,当我们再次使用payload注入时,日志中可以看到查询语句中的特殊字符被明显转义,注入攻击失败。
参数化查询无法从根本上杜绝SQL注入的攻击,例如需要取值的部分是列名、表名或者order by后的取值等,就无法使用参数化查询,查看网上【web安全】SQL注入中order by后无法参数化(https://segmentfault.com/a/1190000040023061)这篇文章中一句话写的很说明问题,“更本质的说法是:不只order by,凡是字符串但又不能加引号的位置都不能参数化;包括sql关键字、库名表名字段名函数名等等”,在有些SQL语句中还是会必然使用到拼接的方式。
1.3 mybatisVuln01方法(漏洞方法)
在MyBatis框架中使用#{}取值时会使用参数化查询的方式访问数据库,在使用${}取值时会使用拼接字符串的方式,从而导致漏洞产生,在MyBatis log的日志中我们看到拼接后的查询语句。
1.4 mybatisVuln02方法(漏洞方法)
在方法的源码中追溯到SQL语句实现的Mapper中,看到like关键字后对参数使用了拼接的方式,安全的方式是虽然这部分语句不能直接预编译,但是推荐使用concat('%',#{_parameter},'%')的方式进行查询,可以有效避免漏洞的产生。
1.5 mybatisVuln03方法(漏洞方法)
在源码中看到order by后的语句使用的是拼接的方式,虽然order by后面直接使用参数化查询会报错,但是也可以使用过滤参数等方式杜绝漏洞,例如下面介绍的方法防止漏洞产生。
1.6 mybatisOrderBySec04方法(安全方法)
在mybatisOrderBySec04的源码中看到,参数sort在正式查询数据库之前,已经被正则表达式过滤,任何特殊字符都会被匹配掉,从而避免了SQL注入漏洞的产生。
2.SSTI服务器模板注入
在分析漏洞前需要简单介绍Velocity组件,Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。以下代码简单演示下模板的使用:
模板文件
演示代码
执行结果
在Velocity引擎解析时,定义的变量都是继承自Object,Object含有一个Class属性,可以调用forName方法反射加载任意类,当发射加载Runtime类时就可以执行系统命令。
回到java-sec-code项目代码,查看模板注入漏洞演示代码velocity方法,模板参数template由前端传入未做任何过滤,当攻击者传入精心构造的代码时就会造成命令执行,使用payload:http://localhost:8080/ssti/velocity?template=%23set($e=%22e%22);$e.getClass().forName(%22java.lang.Runtime%22).getMethod(%22getRuntime%22,null).invoke(null,null).exec(%22calc%22),可以观察到计算器程序被执行。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
