logo 枢密院安全知识丨SQL注入原理及防御_北京华清信安科技有限公司

首页 > 枢密院社区 > 论坛区域 > 社区论坛
枢密院安全知识丨SQL注入原理及防御

01

什么是SQL注入

所谓SQL注入,就是通过把SQL命令插入到接受来自客户端用户输入的变量或URL传递的参数中,并且这个变量或参数是组成SQL语句的一部分,最终达到欺骗服务器执行恶意的SQL命令,使得黑客达到获取用户数据、篡改数据、删除数据库等目的,会对数据库的安全产生重大威胁。

02

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:限制显示个数;

03

SQL注入预防

(1)对用户的输入内容进行校验,限制长度和对单双引号、”--”、”#”等敏感符号进行转换;

(2)不使用动态拼接SQL,可以使用参数化的sql或者直接使用存储过程进行数据查询存取;

(3)设置数据库权限,普通用户不给数据库新建、删除等权限;

(4)提高数据库表和字段的命名方式,要设置成不易被猜到的名称;

(5)不在页面上显示错误信息;

(6)使用漏扫工具查找存在的注入点,提醒管理员采取措施预防SQL注入攻击;

0条评论    浏览量:4632
400-067-1560
  • 公司地址: 北京市朝阳区东大桥8号院SOHO尚都北塔B座10层、20层 (北京总部)
  • 联系电话:400-067-1560
  • Email:contact@hqsec.com
  • 离职员工背景调查(邮箱):hq-hr@hqsec.com
关注我们
Copyright © 北京华清信安科技有限公司 2023 京工信ICP备16018918号-1