导语:所谓SQL注入,就是通过把SQL命令插入到接受来自客户端用户输入的变量或URL传递的参数中,并且这个变量或参数是组成SQL语句的一部分,最终达到欺骗服务器执行恶意的SQL命令,使得黑客达到获取用户数据、篡改数据、删除数据库等目的,会对数据库的安全产生重大威胁。
1. 什么是SQL注入
所谓SQL注入,就是通过把SQL命令插入到接受来自客户端用户输入的变量或URL传递的参数中,并且这个变量或参数是组成SQL语句的一部分,最终达到欺骗服务器执行恶意的SQL命令,使得黑客达到获取用户数据、篡改数据、删除数据库等目的,会对数据库的安全产生重大威胁。
2. SQL注入原理
根据数据类型来看,常见的注入方式有两种:数字类型和字符串类型注入。
下面以MYSQL为例,简单介绍一下SQL注入攻击的构造技巧。
(1) 数字注入
假设一个正常url为:http://127.0.0.1:8009/showinfo/?id=1
相当于查询语句:select * from 表名 where id = 1;
正常情况下会返回id=1的数据信息
若在原地址后加上另一个条件:
http://127.0.0.1:8009/showinfo/?id=-2 or 1=1'
这时查询语句会变为:select * from 表名 where id =-2 or 1=1;
此时,就是SQL注入,返回的可能就是所有数据信息,因为id=-2为false,而1=1是true,所以where条件永远为true,查询的结果就相当于是整个表的数据;
(2) 字符串注入
a. 登录认证
假设正确的用户名和密码分别为:admin,admin123,正常的登录url为:
http://127.0.0.1:8009/login/?name=admin&pwd=admin123
相当于查询语句:
SELECT * FROM user WHERE username = ‘admin’ and password = 'admin123';
用户名和密码均为字符串,SQL注入会利用字符串的含义篡改语句:
符号‘-- ’:‘--’后的内容会被注释掉,用户输入”admin’-- ”的用户名和随意密码,提交的url为:
http://127.0.0.1:8009/login/?name=admin'-- &pwd=admin1234
相当于查询语句:
SELECT * FROM user WHERE username = 'admin'-- 'AND password = 'admin1234';
去掉注释的部分,实际上查询语句相当于:
SELECT * FROM user WHERE username = 'admin';
用户不用输入密码就可以使用账号“admin”登录。
符号“#”:#后的内容同样也会被注释掉,与“-- ”有同样的潜在风险。
b. 猜表名
http://127.0.0.1:8009/login/?name=admin&pwd=admin123’and(select count(*) from 表名)>0 and '1'='1’;
相当于查询语句:
SELECT * FROM user WHERE username = ‘admin’ and password = 'admin123' and(select count(*) from 表名)>0 and '1'='1’;
若登录成功,则说明表名正确;
c. 猜列名;
SELECT * FROM user WHERE username = ‘admin’ and password = 'admin123' and(select count(列名) from 表名)>0 and '1'='1’;
若登录成功,则列名正确;
d. 猜密码长度
http://127.0.0.1:8009/login/?name=admin&pwd=admin123’and(Select count(*) from 表名where username =admin and len(password)>8)>0 and '1'='1’
相当于查询语句:
SELECT * FROM user WHERE username = ‘admin’ and password = 'admin123'and(Select count(*) from 表名where username =admin and len(password)>8)>0 and '1'='1’;
可采用二分法快速试出密码长度。
SQL注入中常用的语法还包括:
select version():查询MySQL版本;
select @version_compile_os:查询操作系统版本;
Order by: 查找列的数量;
Union select:联合查询;
limit:限制显示个数;
3. SQL注入预防
(1)对用户的输入内容进行校验,限制长度和对单双引号、”--”、”#”等敏感符号进行转换;
(2)不使用动态拼接SQL,可以使用参数化的sql或者直接使用存储过程进行数据查询存取;
(3)设置数据库权限,普通用户不给数据库新建、删除等权限;
(4)提高数据库表和字段的命名方式,要设置成不易被猜到的名称;
(5)不在页面上显示错误信息;
(6)使用漏扫工具查找存在的注入点,提醒管理员采取措施预防SQL注入攻击;
如若转载,请注明原文地址