枢密院安全知识丨SQL注入原理及防御
2022-3-21 13:44:33 Author: www.4hou.com(查看原文) 阅读量:41 收藏

导语:所谓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注入攻击;

如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/n61W
如有侵权请联系:admin#unsafe.sh