什么是SQL?
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统
什么是SQL注入?
SQL注入一种代码注入技术,用于攻击基于数据库的应用,基本原理是将SQL语句插入到参数位置,后台将该参数与SQL语句拼接后对数据库进行操作而导致的漏洞
SQL注入流程
- web服务器将表格发送给用户
- 攻击者将带有SQL注入特征的参数发送给web服务器(user=" " ;pass=" ' or 1=1 -- ")
- web服务器利用用户输入的数据构建SQL串(select * from user where user=' ' and pass='' or 1=1-- ')
- web服务器将SQL发送给数据库服务器
- 数据库服务器执行被注入的SQL,返回结果给服务器
- web服务器将数据返回给用户
SQL注入类型
-
按数据库执行结果是否显示在页面上分类
- SQL回显注入(数据库的执行结果直接显示在页面上)
SQL回显注入可再分为:
a. union联合查询注入:通过union联合查询数据,回显数据在正常页面
b. 报错注入:通过报错页面回显数据库的敏感信息 - SQL盲注(不显示在页面上)
SQL盲注有可以分为:
a. 布尔盲注:通过页面的变化判断注入语句的正确性,猜解数据
b. 时间注入:通过页面的返回时间猜解数据
- SQL回显注入(数据库的执行结果直接显示在页面上)
-
按注入点类型来分类
- 数学型注入点
在web端大概是http://www.xxx.com/news.php?id=1 这种形式,其注入点id类型为数字,因此为数字型注入。其SQL语句原型大致为 :select * form 表名 where id=1 - 字符型注入点
在web端大概是http://www.xxx.com/news.php?name=admin,其注入点name为字符类型,因此为字符型注入。其SQL语句原型大致为: select * form 表名 where name='admin'。有时候为双引号:where name="admin" - 搜索型注入点
这是一类特殊的注入点,主要是因为在数据搜索时没过滤搜索参数,一般在链接地址中存在"keyword=关键字",有的不显示在链接地址里面,而是通过搜索框表单提交。其SQL语句原型大致为:select * from 表名 where 字段 like '%关键字%'
- 数学型注入点
-
按提交数据的方式和位置来分类
- GET注入
提交数据的方式是GET,注入点的位置在GET参数部分,如http://www.xxx.com/news.php?id=1,id为注入点 - POST注入
使用POST方式提交数据,注入点位置在POST的BODY部分,常发生在表单处 - Cookie注入
HTTP请求的时候header部分的Cookie信息存在注入点 - HTTP注入
注入点在header的其他字段,如User-Agent字段,Cookie注入其实也是HTTP注入的一部分
- GET注入
SQL注入的主流防御方法
- 代码层防御方法
1.1 严格检查用户输入的数据类型
1.2 限制用户输入长度
1.3 对敏感字符进行转义,如单引号,双引号
1.4 对特殊字符进行过滤,如(select;union;and;or)
1.5 参数化语句,使用占位符或绑定变量向SQL查询提供参数
1.6 数据库控制,如使用权限有限用户连接数据库;机密数据加密后存入数据库
1.7 错误返回统一化:应用报错时,使用统一页面返回,并尽可能给出少的提升 -
平台层防御方法
2.1 web应用防火墙(WAF)
2.2 数据库防火墙
方案比较
网友评论