XXE从入门到放弃

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
        course>Chinesecourse>       
        school>&school;school>   
     student>
students>
DTD数据类型
PCDATA的意思是被解析的字符数据/
PCDATA的意思是被解析的字符数据,PCDATA是会被解析器解析的文本
CDATA的意思是字符数据
CDATA是不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
DTD实体介绍
(实体定义)
实体是用于定义引用普通文本或者特殊字符的快捷方式的变量
在DTD中的实体类型,一般分为:内部实体和外部实体,细分又分为一般实体和参数实体。除外部参数实体引用以字符(%)开始外,其它实体都以字符(&)开始,以字符(;)结束。
内部实体:

 外部实体:

外部参数实体:


XML注入产生的原理
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
xxe漏洞触发的点往往是可以上传XML文件约位置,没有对上传的XML文件进行过滤,导致可以上传恶意的XML文件。
怎么判断网站是否存在XXE漏洞
最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞,接下来,来看一个小小的展示:
这个是测试xxe的测试点:http://169.254.4.52/bWAPP/xxe-1.php
我们点击下面的Any bugs然后用burp抓包


我们随便输入下

从上面我们可以看到,web应用正在解析xml的内容,接受用户特定或者自定义的输入,然后呈现给用户。为了验证,我们可以构造如下的输入:
xml version="1.0" encoding="utf-8"?>
]>
reset>login>bee33333;&test;login>secret>Any bugs?secret>reset>
可以看到应用程序确实是直接解析了xml,那么如果xml文档中有一个参数是用来调用远程服务器的内容?这个参数是可控的,我们可以做什么?
XXE漏洞-文件读取
PHP中测试POC
File:///path/to/file.ext
http://url/file.ext
PHP://filter/read=convert.base64-encode/resource=/home/bee/test.php
读取文档
有回显的xxe利用
Payload:
xml version="1.0" encoding="utf-8" ?>
]>
〈xxe>&xxe;xxe>

读取php文件
直接读取php文件会报错,因为php文件里面有//等特殊字符,xml解析时候会当成xml语法来解析。这时候就分不清处哪个是真正的xml语句了,
直接利用file协议读取PHP文件,就会产生报错。那么需要base64编码来读取,
Payload:
xml version="1.0" encoding="utf-8" ?>
]>

进行解密后得到对应内容

本地测试无回显注入读取文件
但是,在实际情况中,大多数情况下服务器上的 XML 并不是输出用的,所以就少了输出这一环节,这样的话,即使漏洞存在,我们的payload的也被解析了,但是由于没有输出,我们也不知道解析得到的内容是什么,因此我们想要现实中利用这个漏洞就必须找到一个不依靠其回显的方法——外带数据
先看一下漏洞示例:

相较于前面有回显的漏洞代码,我们去掉了内容输出的一部分。这样,用之前的payload就没有作用了:

上一页  [1] [2] [3] [4]  下一页