SQL注入——MySQL学习
SQL注入
产生场景
主要是由于数据未与代码进行严格的隔离导致的。
场景1
原始的更新需求
update table set memo = 'id'
由于用户的误触,输出了特殊符号,导致如下:
update table set memo = ''#jjjkjkjjjjkjk'
这样就导致了SQL语句提前闭合,数据表中的memo字段被清空。
场景2
原始的查询需求
select * from user where uername='$name' and password='$pass';
输入万能注入语句就变成’or 1=1#
select * from user where uername=' ' or1=1#' and password=balabala
实际上等于
select * from user
直接就把SQL语句给废掉了。
分类
按数据类型可以分为数字型、字符型和搜索型,按提交方式可分为GET型,POST型,Cookie型和HTTP请求头注入,按执行效果有可以分为报错注入、联合查询注入、盲注和堆查询注入,其中盲注又可分为基于bool的和基于时间的注入。
本文这里对常见的几种SQL注入手段进行分析,进一步的注入方式还需要深入学习。
联合查询注入(查询类网站)
查询MySQL的root用户和密码hash值:
'union select user,authentication_string from mysql.user#‘
首先使用’将前面的SQL语句闭合,然后使用union查询自己想要查询的内容
基于bool的盲注(报错型网站)
然后判断当前数据库中第一个数据表的长度是否大于5:
1'and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5#,结果如图:
其实就是前面闭合SQL语句,后面用bool来尝试
基于时间的盲注
然后猜解当前数据库中数据表的个数:
1'and if((select count(*) from information_schema.tables where table_schema=database())>3,sleep(3),0)#;
跟bool类型很相似,只不过这里换了时间变量。
防止SQL注入
(1)过滤用户输入参数中的特殊字符,从而降低SQL注入的风险。
(2)严格使用参数绑定传入的SQL参数。
参考资料:

浙公网安备 33010602011771号