freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

代码审计入门之java-sec-code(二)
2021-09-27 14:10:12

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,成功返回表内全部数据。

1632722298_61515d7ac9eeb74918e1e.png!small?1632722300346

1632722309_61515d8549f7f33b3d3d6.png!small?1632722310769

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语句中还是会必然使用到拼接的方式。

1632722322_61515d9201be6e0b2feb2.png!small?1632722323493

1632722331_61515d9bb124e37c7ce4a.png!small?1632722333189

1.3 mybatisVuln01方法(漏洞方法)

在MyBatis框架中使用#{}取值时会使用参数化查询的方式访问数据库,在使用${}取值时会使用拼接字符串的方式,从而导致漏洞产生,在MyBatis log的日志中我们看到拼接后的查询语句。

1632722345_61515da92c4a58ef074ed.png!small?1632722346661

1632722349_61515dad4729b15f16238.png!small?1632722350740

1632722359_61515db748fae16549e12.png!small?1632722360793

1.4 mybatisVuln02方法(漏洞方法)

在方法的源码中追溯到SQL语句实现的Mapper中,看到like关键字后对参数使用了拼接的方式,安全的方式是虽然这部分语句不能直接预编译,但是推荐使用concat('%',#{_parameter},'%')的方式进行查询,可以有效避免漏洞的产生。

1632722365_61515dbdc4d10ab8abd04.png!small?1632722367260

1632722373_61515dc5323796677be53.png!small?1632722374708

1.5 mybatisVuln03方法(漏洞方法)

在源码中看到order by后的语句使用的是拼接的方式,虽然order by后面直接使用参数化查询会报错,但是也可以使用过滤参数等方式杜绝漏洞,例如下面介绍的方法防止漏洞产生。

1632722381_61515dcd9437f88a3fce8.png!small?1632722383091

1632722386_61515dd2565afb7e86a78.png!small?1632722387849

1.6 mybatisOrderBySec04方法(安全方法)

在mybatisOrderBySec04的源码中看到,参数sort在正式查询数据库之前,已经被正则表达式过滤,任何特殊字符都会被匹配掉,从而避免了SQL注入漏洞的产生。

1632722405_61515de56080c8756dbbd.png!small?1632722406948

1632722417_61515df1b99e88141a06d.png!small?1632722419272

1632722428_61515dfc1163d0d36d90e.png!small?1632722429515

2.SSTI服务器模板注入

在分析漏洞前需要简单介绍Velocity组件,Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。以下代码简单演示下模板的使用:

模板文件

1632722467_61515e23e3954a6d92db0.png!small?1632722469420

演示代码

1632722475_61515e2b65978872244a3.png!small?1632722476915

执行结果

1632722485_61515e359b3f8f8b416e7.png!small?1632722487119

在Velocity引擎解析时,定义的变量都是继承自Object,Object含有一个Class属性,可以调用forName方法反射加载任意类,当发射加载Runtime类时就可以执行系统命令。

1632722496_61515e4000960dffff451.png!small?1632722497752

回到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),可以观察到计算器程序被执行。

1632722506_61515e4ad50b083381f5d.png!small?1632722508326

1632722515_61515e5328b26e480e817.png!small?1632722516790


# web安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录