介绍
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。(来自百度百科)
分类
按照提交方式分类
GET型注入、POST型注入、cookie注入、http头注入
按照注入类型分类
数字型注入、字符型注入、搜索型注入
按照执行效果分类
布尔盲注、时间盲注、报错注入、联合查询注入、堆叠注入、宽字节注入、base64注入
SQL注入常用函数
database():数据库名
desc():结构
@@datadir:路径
table():表名
columns():列名
limit():返回结果中的前几条数据或者中间的数据
group_concat():分组拼接函数
rand():返回0~1的随机数
floor():向下取整
substr():截取字符串
ascii():返回字符串的ascii码
寻找SQL注入
SQL注入可以出现在任何从系统或用户接收数据输入的前端应用程序中,这些应用程序之后被用于访问数据库服务器。
如果对一个网站进行SQL注入攻击,首先就需要找到存在SQL注入漏洞的地方,也就是寻找所谓的注入点。可能的SQL注入点一般存在于登陆页面、查找页面或添加页面等用户可以查找或修改数据的地方,简单来说,页面与数据库交互的地方可能会存在SQL注入。
最常用的寻找SQL注入点的方法,是在网站中寻找如下形式的页面链接
http://www.123.com/xxx.php?id=xx
其中‘xx’可能是数字,也可能是字符串,分别被称为整数型数据或者字符型数据
SQL注入流程
1、判断是否存在注入、注入类型
2、猜解字段数
3、确定显示位
4、获取库名
5、获取库中的表名
6、获取表中的字段名
7、下载数据
SQL注入绕过方式
1、绕过空格
寻找可以代替空格执行的特殊字符,比如:+,%20,/**/,%a0等
2、十六进制绕过
查询条件为用户名等于admin的信息,admin需要使用引号引起来,如果过滤到引号,where语句就会执行失败。
可以将amdin替换成十六进制来执行
3、大小写/复写
复写就是写两个,过滤掉一个后,确保还会留下来一个可以使用。
4、内联注释
把一些特有的仅在MYSQL上的语句放在 /*!...*/
中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行。
5、过滤or and xor not 绕过
and = &&
or = ||
xor = | # 异或
not = !
6、过滤等号
%like% 通配符
<> 等价于 !=
在前面在加一个!表示等于
未完待续~~~
SQL注入防御方式
预编译防止SQL注入(参数化查询)
也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的 语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行, 必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入。