基本介绍
SQL注入是实现数据泄露比较常见的方法之一。攻击的核心是将 SQL 命令追加到 Web 或应用程序的后端(通常通过网站),目的是破坏原始 SQL 脚本,然后执行已注入到表单域中的 SQL 脚本。在客户端应用程序中动态生成 SQL 后,最常发生此 SQL 注入。SQL 注入攻击的核心原因在于客户端应用程序和数据库存储过程中存在的疏忽,并且开发人员在构建新应用程序时没有认真对待 SQL 注入这一问题。比较常见的有如下2种类型:
堆叠注入
堆叠注入是最简单方便的,只要一句sql语句有个结束标志,且网站对sql语句的执行条数没有限制,就可以执行注入的语句。
select * from user where userid=100;select version();
布尔注入
布尔为计算机中的一种数据类型,分为true、False两种类型,主要用到length()和substr()语句,用两种状态来猜解数据库、表名等的长度和正确字母。
先使用二分法,通过用 and length(version())>2 来猜数据库的长度;再用 and substr(version(),1,1)='h' 来确定第一个字母,可用burp或者sqlmap等工具跑26个字母,哪个字母返回t则代表第一个字母就是它;最后结合长度,成功的将数据库猜解出来。
如何预防
在通过java使用jdbc连接halo数据库时,采用预编译机制的PreparedStatement,在SQL上将参数通过占位符'?'来代替参数,另外通过setString形式将参数设置,PreparedStatement对象会分别将参数和SQL交给SQL服务器,执行之前会进行预编译,在预编译阶段会检测SQL是否正确,正确则将编译结果直接提交给SQL服务器执行,编译失败则直接返回,不再执行PreparedStatement。
基本原理
预编译语句java.sql.PreparedStatement,扩展自 Statement,不但具有 Statement的所有能力,而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql语句。这样,sql语句就会被系统进行预编译,执行的速度会有所增加,尤其是在执行大语句的时候,效果更加理想。
总结
本次介绍的漏洞基础知识和防注入方式,希望大家能够从本章节中了解到 SQL 注入的本质,在后续工作中提高安全规范意识,尽量避免对halo数据库的非法操作。
人物A 回复
这是回复
人物B 回复
我回复你了
人物A 回复
回复已收到