这是我参与「第五届青训营 」伴学笔记创作活动的第11天
SQL注入攻击
SQL(Structured Query Language),即结构化查询语言,用于操作关系型数据库管理系统,操作SQL的接口,以方便与数据库进行交互。攻击者可以构造巧妙的SQL语句从而获取到敏感数据
在B/S模式中,用户可以通过Get或Post等方式,对服务器发出HTTP请求。在服务器端,对数据库执行查询操作,将查询的结果返回浏览器端。黑客利用上述过程,将精心构造的请求放到传入的变量参数中,让服务器端执行恶意代码,从而达到了读取数据库中敏感信息的效果,甚至将数据库删除。这一攻击过程就是SQL注入,它的原理如图所示。
触发SQL注入的方式 攻击者通常可以使用以下几种方式来触发SQL注入漏洞: (1)用户的输入。通常使用HTTP的GET或POST请求传输用户数据,通过修改POST包中的数据或者GET请求中URL参数值来实现恶意代码注入。 (2)通过HTTP请求头。服务器端可能会保存用户的IP及User-Agent等信息,此时,攻击者可以在X-Forwarded-For 或UA等请求头字段中构造语句进行SQL注入。 (3)二阶注入。攻击者在HTTP请求中提交恶意输入,服务端将恶意输入保存在数据库中,攻击者紧接着提交第二次HTTP请求。为处理第二次请求,服务端需要查找数据库,触发了之前存储的恶意输入,并将结果返回给攻击者。攻击者需要通过两次独立请求才可以实现SOL注入的目的,这种攻击方式因此得名二阶注入。
自动检测sql注入
利用爬虫爬取网站的所有链接,对所有的链接自动进行注入测试
使用 PreparedStatement
采用sql语句预编译和绑定变量,是防御sql注入的最佳方法 采用了PreparedStatement,就会将sql语句:"select id, no from user where id=?" 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的 语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行, 必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入。
使用存储过程
它的原理和使用 PreparedStatement 类似,都是通过将 SQL 语句的解析和执行过程分开,来实现防护。区别在于,存储过程防注入是将解析 SQL 的过程,由数据库驱动转移到了数据库本身
验证输入
防护的核心原则是,一切用户输入皆不可信。因此,SQL 注入的防护手段和 XSS 其实也是相通的,主要的不同在于:SQL 注入的攻击发生在输入的时候,因此,我们只能在输入的时候去进行防护和验证; 大部分数据库不提供针对 SQL 的编码,因为那会改变原有的语意,所以 SQL 注入没有编码的保护方案。