SQL注入系统学习——(1)预科
文章目录
什么是SQL注入:
SQL注入就是把构造好的SQL语句放入WEB数据中提交给服务器,并返回数据时返回的是构造好的SQL语句的执行内容
注入分类:
基于服务器接收到的响应:
- 基于错误的SQL注入
- 联合查询的类型
- 堆查询注射
- SQL盲注
- 基于布尔SQL盲注
- 基于时间的SQL盲注
- 基于报错的SQL盲注
基于如何处理输入的SQL查询(数据类型)
- 基于字符串
- 数字或整数为基础的
基于程度和顺序的注入(哪里发生了影响)
- 一阶注入
- 二阶注入
一阶注入指输入的注射语句对WEB直接产生了影响,出现了结果;
二阶注入类似存储性XSS,是指输入提交的语句,无法直接对WEB应用程序产生影响,通过其他的辅助间接的对WEB产生危害,这样的就被称为是二阶注入。
基于注入点的位置上的
- 通过用户输入的表单域的注入
- 通过cookie注入
- 通过服务器变量注入
系统函数
常用函数
1. version()——MySQL版本
2. user()——数据库用户名
3. database()——数据库名
4. @@datadir——数据库路径
5. @@version_compile_os——操作系统版本
字符串连接函数
1. concat(str1,str2,…)——没有分隔符地连接字符串
2. concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串
3. group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据
一般用于尝试的语句
PS:–+可以用 # 代替,url提交过程中 url 编码后的 # 为 %23
or 1=1 --+
’ or 1=1 --+
) or 1=1 --+
') or 1=1 --+
") or 1=1 --+
")) or 1=1 --+
一般代码为:
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id ='$id' LIMIT 0,1"
union 操作符
union 操作符用于合并两个或多个 SELECT 语句的结果集。注意, UNION 内部的 SELECT 语句必须拥有相数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
select column_name(s) from table_name1
union
select column_name(s) from table_name2;
如果允许不同的值,就要使用 union all
SQL UNION ALL 语法
select column_name(s) from table_name1
union all
select column_name(s) from table_name2;
SQL 中的逻辑运算
在使用万能密码时会用到:
select * from admin where username='admin' and password='admin';
在这个语句中其实在密码部分可以用 ‘ or 1=1 # 作为密码输入
原因如下:
当使用 ‘ or 1=1 # 后,sql语句为:
select * from admin where username='admin' and password='' or 1=1 #';
使用这个语句就可以在不知道密码的情况下登录 admin 账户。原因是因为在使用 where 语句后面的 username=‘admin’ and password=‘’ or 1=1 #
这三个条件用 and 和 or 连接起来。
因为 and 运算符比 or 运算符优先级高
所以
username='admin' --------> Turn
password=''--------------> Flase
所以
username='admin' and password='' -------------->Flase
1=1 ------------------->Turn
所以
Flase or Turn ----------------> Turn
终上所述:
username='admin' and password='' or 1=1 ------------>Turn
注入流程
结语:
最后,我们一起来学习探讨 SQL注入 的问题,一起加油一起学习,欢迎评论留言。有不足的地方多多指正,在下抱拳了