此处介绍一些 mysql 注入的一些基础知识。
注入的分类 —— 仁者见仁,智者见智
个人认为分类已经是够全面了。理解不了跳过,当你完全看完整个学习过程后再回头看这段。
基于从服务器接收到的响应
- 基于错误的SQL注入
- 联合查询的类型
- 堆查询注射
- SQL盲注
- 基于布尔SQL盲注
- 基于时间的SQL盲注
- 基于报错的SQL盲注
基于如何处理输入的SQL查询(数据类型)
- 基于字符串
- 数字或整数为基础的
基于程度和顺序的注入(哪里发生了影响)
- 一阶注射
- 二阶注射
一阶注射是指输入的注射语句对WEB直接产生了影响,出现了结果;
二阶注入类似存储型XSS,是指输入提交的语句,无法直接对WEB应用程序产生影响,通过其它的辅助间接的对WEB产生危害,这样的就被称为是二阶注入
基于注入点的位置上的
- 通过用户输入的表单域的注射
- 通过 cookie 注射
- 通过服务器变量注射(基于头部信息的注射)
常用函数
系统函数(介绍几个常用的)
- MySQL 版本
version()
- 数据库用户名
user()
- 数据库名
database()
- 数据库路径
@@datadir
- 操作系统版本
@@version_compile_os
字符串连接函数
详细介绍:SQL注入中连接字符串常用函数
- 没有分隔符地连接字符串
concat(str1,str2,...)
- 含有分隔符地连接字符串
concat_ws(separator,str1,str2,...)
- 连接一个组的所有字符串,并以分隔符分隔每一条数据
group_concat(str1,str2,...) SEPARATOR str_val
一般用于尝试的语句
–+可以用#替换。#的url编码为%23
or 1=1--+
'or 1=1--+
"or 1=1--+
) or 1=1--+
') or 1=1--+
") or 1=1--+
")) or 1=1--+
一般的代码为:
1 | $id=$_GET['id']; |
此处考虑两个点,一个是闭合前面你的
'
或者"
。另一个是处理后面的'
或者"
,这一般采用两种思路,闭合后面的引号或者采用--+
或者#
(%23) 注释掉
union操作符的介绍
UNION操作符用于合并两个或多个SELECT语句的结果集。请注意,UNION内部的SELECT
语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。
UNION语法
UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名。
1
2
3SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2UNION ALL语法
默认地,UNION操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
1
2
3SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
SQL中的逻辑运算
e.g. 下面三者有什么区别?
select * from users where id=1 and 1=1
select * from users where id=1 && 1=1
select * from users where id=1 & 1=1
explain: 1和2是一样的,表达的意思是id=1
条件和1=1
条件进行与运算。而3的意思是id=1
条件与1
进行&
位操作,id=1
被当作 true,与1
进行&
运算结果还是1,
再进行=
操作,1=1
,还是1
&
的优先级大于=
。
注入流程
我们的数据库存储的数据按照上图的形式,一个数据库当中有很多的数据表,数据表当中有很多的列,每一列当中存储着数据。我们注入的过程就是先拿到数据库名,在获取到当前数据库名下的数据表,再获取当前数据表下的列,最后获取数据。
Mysql有一个系统数据库information_schema
,存储着所有的数据库的相关信息,一般情况下,我们利用该表可以进行一次完整的注入。以下为一般的操作语句:
猜数据库
1 | select schema_name from information_schema.schemata |
猜某库的数据表
1 | select table_name from information_schema.tables where table_schema='xxxx' |
猜某表的所有列
1 | Select column_name from information_schema.columns where table_name='xxx' |
获取某列的内容
1 | Select xxxxx from xxxxx |
refer: mysql注入天书,百度一下就能找到