SQL注入

Posted fireporsche

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入相关的知识,希望对你有一定的参考价值。

什么是SQL注入?

SQL注入是黑客攻击数据库的一种常用方法,其实就是通过把SQL命令插入到web表单或页面请求的查询字符串中提交,最终达到欺骗服务器执行恶意的SQL命令,来达到攻击的目的。

SQL注入是怎么产生的?

  1. WEB开发人员无法保证所有的输入都已经过滤

  2. 攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码(可加入到get请求、post请求、http头信息、cookie中)

  3. 数据库未做相应的安全配置

SQL注入可以分为平台层注入和代码注入。前者是由不安全的数据库配置或平台漏洞所致。或者是程序员对输入未进行细致过滤产生

如何进行SQL注入?

  • 数字注入

在url上添加参数请求查询:http://index.com/?id=1

以上是通过url查询id为1的数据,但如果我们在后面传参这样写:http://index.com/?id=1‘ or 1=1

那么执行的查询语句就是where xx=‘1‘ or 1=1,这样查询的就是全部的数据,所以这就存在SQL注入的问题

  • 字符串注入

第一种:‘#‘:‘#‘后所有的字符串都会被当成注释来处理

登录时的免密登录在传参的时候将注释符号#传入,注释后面密码的查询和验证,这样就可以只通过用户名免密登录

用户名:‘ or 1=1# 密码:111111

这样查询语句执行的就是:where username=‘‘ or 1=1# and password=‘111111‘,直接注释掉密码的验证

第二种:‘-- ‘ (--后面有个空格):‘-- ‘后面的字符串都会被当成注释来处理

用户名输入:user‘-- (注意--后面有个空格,单引号闭合user左边的单引号),密码随意输入,如:111,然后点击提交按钮。

等价于SQL语句SELECT * FROM user WHERE username = ‘user‘-- ‘AND password = ‘111‘,‘-- ‘后面都被注释掉了,相当于SELECT * FROM user WHERE username = ‘user‘

  • 对数据表的恶意操作

传入的参数为 or 1=(drop xx from xx)等,可以对数据表进行删除操作,所以sql注入的安全性问题很重要,sql注入是在保证查询where语句恒真的情况下可以对数据表做任意操作

  • 资源枚举,其实就是通过枚举法也就是穷举法对数据库名,备份数据库名,数据表名,列名等进行猜测,然后通过服务器返回的错误提示中得到信息,便可以进行sql注入操作。

而为何一些表单提交和输入文本框中的请求可以sql注入呢,就是后端没有对用户输入的数据进行过滤验证。所以判断是否可以进行sql注入是我们即将进行sql注入攻击的第二步。

第一步是确定我们要进行sql注入的地方。

第二步尝试性地输入一个使wehre查询语句恒真的语句,通过返回的错误的提示可以知道该输入域是否对输入的字符串进行过滤

第三步可以通过猜测表名,列名等方法可以测试

如何预防SQL注入?

  • 严格检查输入变量的类型和格式

对于整数参数,加判断条件:不能为空、参数类型必须为数字

对于字符串参数,可以使用正则表达式进行过滤:如:必须为[0-9a-zA-Z]范围内的字符串

  • 过滤和转义特殊字符

在username这个变量前进行转义,对‘、"、等特殊字符进行转义,如:php中的addslashes()函数对username参数进行转义

  • 利用mysql的预编译机制

把sql语句的模板(变量采用占位符进行占位)发送给mysql服务器,mysql服务器对sql语句的模板进行编译,编译之后根据语句的优化分析对相应的索引进行优化,在最终绑定参数时把相应的参数传送给mysql服务器,直接进行执行,节省了sql查询时间,以及mysql服务器的资源,达到一次编译、多次执行的目的,除此之外,还可以防止SQL注入。具体是怎样防止SQL注入的呢?实际上当将绑定的参数传到mysql服务器,mysql服务器对参数进行编译,即填充到相应的占位符的过程中,做了转义操作。

以上是关于SQL注入的主要内容,如果未能解决你的问题,请参考以下文章

sql 注入是啥?

什么叫sql注入,如何防止sql注入

关于SQL注入

Java安全-注入漏洞(SQL注入命令注入表达式注入模板注入)

sql注入一

什么是sql注入如何防止sql注入