xxe漏洞检测及代码执行过程

2019-05-21

1前言

对于xxe漏洞可能是自己挖洞时间太短,真是没用遇到过啊!都是靶机或者ctf遇到的。写下文章记录下来。

2XML知识

先把XML声明、DTD文档类型定义、文档元素这些基础知识自己看一下,把这些看懂后才能更好的理解,这里不再详细赘述相关知识请移步→XML 教程-菜鸟教程

3XXE漏洞

xxe全名“xml external entity injection”即“xml外部实体注入”。

有了XML实体,关键字’SYSTEM’会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。比如,下面的代码将获取系统上folder/file的内容并呈献给用户。

攻击者通过xml语句中写入指定的xml实体语句,从而让服务器执行,从而导致问题。服务端接收和解析了用户端传过来的xml数据,而没有做安全控制,从而导致xml外部实体注入。

4如何构建外部实体注入?

    1.直接通过DTD外部实体声明如下图

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[ <!ENTITY xxe SYSTEM "file:///php//aa.txt">]><login>&xxe;</login>

    2.通过DTD文档引入外部DTD文档

    3.通过DTD外部实体声明引入外部实体声明 (先写一个外部实体声明→引用攻击者服务器上面的外部实体声明)

5支持的协议

6产生的危害

1:读取任意文件

2:执行系统命令

3:执行系统命令

4:攻击内网其他网站    

   环境搭建

这里推荐两个系统 一个是pikaqiu一个是bwapp是两个高度集成的靶场,皮卡丘是国内人开发的。

我在测试两个靶场后,通读代码后自己写了一个简易的demo。ps:某大佬说如果你想搞懂一个漏洞,比较好的方法是:你可以自己先制造出这个漏洞,然后再利用它,最后再修复它

代码如下:

<head><meta charset=utf-8><title>xxe测试</title></head><body><form action='' method='post'>xml数据:<br><textarea type="text" name="data"></textarea><br><input type='submit' value='提交' name='sub'></form></body>

<?php

date_default_timezone_set("PRC");

if(!empty($_POST['sub'])){ $data= $_POST['data'];

$xml = simplexml_load_string($data);

print($xml); }

?>


simplexml_load_string()函数的作用是把XML字符串载入对象中,函数获取xml内容,并没有进行任何的过滤。

代码写完后测试:

1测试解析xml代码情况

<?xml version = "1.0"?>

<!DOCTYPE note [<!ENTITY hacker "hack test"> ]>

<name>&hacker;</name>

2测试读取任意文件


现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[<!ENTITY xxe SYSTEM "file:///php//aa.txt">]><login>&xxe;</login>

我测试的版本是php5.4,45。把PHP版本切换到5.6后就不在进行回显了。

3远程端口探测

局域网中某机器开启如下端口


<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE note[ <!ENTITY xxe SYSTEM "http://10.100.200.2:8080/slfe/"> ]> <login>&xxe;</login>

经过对比还是能看出开发的端口和没开放端口的区别。

如何防御xxe攻击

方案一:使用开发语言提供的禁用外部实体的方法

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

Python:

from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方案二:过滤用户提交的XML数据

过滤:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC

方案三:使用json格式传输数据

参考文献:XXE漏洞攻防学习(中)      xxe漏洞的学习与利用总结     XXE漏洞学习

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