一、SQL注入的概念
SQL注入其实是恶意攻击者,将SQL或者字符作为参数输入,服务器在验证这个字段的时候,读取攻击者输入的数据,将其作为正常的值参与SQL语句的查询,从而达到删表或者获取数据库信息等目的。
二、SQL注入的条件
参数中含有SQL语句,并可以带入数据库正常执行;
WEB应用和数据库交互时,必须携带参数传递至数据库;
例如:
POST请求体中的参数
GET请求头URL中的参数
Cookie
三、SQL注入的几种场景
1、字符串型注入
场景1:假设登陆后台的校验逻辑为:从数据库查询对应用户名和密码,存在返回值验证通过。这种情况在用户名输入框输入OR 1 = 1 OR '1' = '1'
,密码为空,则猜测可构造如下SQL语句绕过后台校验登录系统:
SELECT * FROM usertable WHERE username = '' OR 1 = 1 OR '1' = '1' AND password = ''
场景2:也可以用户名为空,在密码输入框输入’ OR ‘1’ = '1,则猜测可构造如下SQL语句绕过后台校验登录系统:
SELECT * FROM usertable WHERE username = '' AND password = '' OR '1' = '1'
场景3:假设登录页面后台校验机制为:从数据库查询对应用户名和密码,存在一条返回值验证通过。这种情况在用户名输入框输入username’ AND 1 = 1 OR ‘1’ = '1,密码为空,则猜测可构造如下SQL语句绕过后台校验登录系统:
SELECT * FROM usertable WHERE username = 'username' AND 1 = 1 OR '1' = '1' AND password = ''
username如果未知,可以尝试使用admin、Admin、administrator、Administrator等进行猜测
2、数字型注入
数字型注入与字符串型注入很像,只不过不需要带引号’’,用上面的场景3举其中一个例子:
SELECT * FROM usertable WHERE username = 'username' AND 1 = 1 OR 1 = 1 AND password = ''
3、终止式注入
注: ;代表结束上一条语句,-- 代表注释后面的语句
场景1:假设登录页面后台校验机制为:从数据库查询对应用户名和密码,存在返回值验证通过。这种情况在用户名输入框输入’ OR 1 = 1;-- ,密码为空,则猜测可构造如下SQL语句绕过后台校验登录系统:
SELECT * FROM usertable WHERE username = '' OR 1 = 1;-- ' AND password = ''
场景2:假设登录页面后台校验机制为:从数据库查询对应用户名和密码,存在一条返回值验证通过。这种情况在用户名输入框输入username’;-- ,密码为空,则猜测可构造如下SQL语句绕过后台校验登录系统:
SELECT * FROM usertable WHERE username = 'username';-- ' AND password = ''
SELECT * FROM usertable WHERE username = '' OR 1 = 1 LIMIT 1;-- ' AND password = ''
如果应用过滤掉了单行注释字符:- -,可以用多行注释字符来代替:
SELECT * FROM usertable WHERE username = 'username'/*' AND password ='' '*/
四、SQL注入的几种测试工具
sqlmap是一款Python编写的免费SQL注入测试工具。全面支持6种SQL注入技术:基于布尔盲注、基于时间盲注、错误注入、基于查询的UNION注入、堆叠查询和带外。(以后具体详细介绍)
五、SQL注入的防范
测试角度:
例如对一个表单需求进行检查时,我们一般检验以下几项安全性问题:需求中应说明表单中某一field的类型,长度,以及取值范围(主要作用就是禁止输入敏感字符);需求中应说明如果超出表单规定的类型,长度,以及取值范围的,应用程序应给出不包含任何代码或数据库信息的错误提示等。
开发角度:
(1) 转义敏感字符及字符串
SQL的敏感字符包括:
“exec”, “xp_”, “sp_”, “declare”, “cmd”, “Union”, “+”, “//”, ”…”, “;”, “’”, “–”, “%”, “0x”, “><=!-*/()|” ,和空格。
(2) 屏蔽出错信息:阻止攻击者知道攻击的结果