定义:
把SQL命令插入到Web表单提交或者输入域名或者构造页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令来盗取信息或者攻击数据库服务器。
检查SQL注入漏洞
检查所有的输入;包括域名输入(GET)表单提交(POST)以及PUT请求,如果在这些地方注入SQL命令能够成功进入系统或者抛出SQL异常则可能存在SQL注入漏洞。
页面请求域数字注入
如原域名为:
localhost:8080/Test/article?id=1
注入为localhost:8080/Test/article?id=-1 OR 1=1(如果后端没有类型校验输入SQL命令也非预编译那么将查询出所有的数据因为1=1永远为真)
字符串注入
如表单提交后的查询信息为
SELECT * FROM t_user WHERE username='username' AND password ='password'
注入攻击为:
在username输入处加入SQL的注释“#”或者“--”
效果为SELECT * FROM t_user username='username'
# ' AND password ='password'
那么红色字体部分将会被SQL服务器认为是注释语句而不执行。“--”效果等同于“#”
预防SQL注入
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
6.sql注入的检测方法一般采取辅助
软件
或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思
网站安全
平台检测工具。MDCSOFT SCAN等。采用
MDCSOFT-IPS
可以有效的防御SQL注入,XSS攻击等。
预编译机制预防SQL注入
首先看一下非执行预编译的效果
1、构造永远为真的查询
2、构造注释字符串攻击
可以看到在“#"后面所有的条件都被注释掉了,如果此处前面的条件是用户名那么则可以通过此注入拿到用户密码等信息。
再看预编译后的结果
1、构造永远为真的查询
可以看到对于永远为真的查询虽然不会返回所有记录但是仍然会返回第一条记录,所以在对于预编译的参数检验的时候仍然需要做格式和类型校验。
2、构造注释字符的查询
可以看到对于使用注释符的参数将抛出异常。
MYSQL服务器的预编译命令
- 预编译:PREPARE statementName FROM 'SQL 语句'
- 注入参数:SET @a=a,@b=b;
- 执行:EXECUTE statementName USING @a,@b