枢密院安全知识丨SQL注入原理及防御 - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

枢密院安全知识丨SQL注入原理及防御

华清信安 行业 2022-03-21 13:44:33
141297
收藏

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

如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务