• XSS练习---一次循环和两次循环问题


    一次循环--demo6.html

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. head>
    9. <body>
    10. <form id=x>
    11. <input id=attributes>
    12. <input id=attributes>
    13. form>
    14. body>
    15. <script>
    16. console.info(x.attributes);
    17. const data = decodeURIComponent(location.hash.substr(1));
    18. const root = document.createElement('div');
    19. root.innerHTML = data;
    20. //这里模拟了XSS过滤的过程,方法是移除所有属性
    21. for (let el of root.querySelectorAll('*')) {
    22. for (let attr of el.attributes) {
    23. el.removeAttribute(attr.name);
    24. }
    25. }
    26. document.body.appendChild(root);
    27. script>

    代码分析

        const data = decodeURIComponent(location.hash.substr(1));       #截取#号后面的值
        const root = document.createElement('div');       #创建一个div
        root.innerHTML = data;        #然后将#号后面的值赋值给div
        for (let el of root.querySelectorAll('*')) {  #选中div下面的所有子元素
            for (let attr of el.attributes) {           #获取子元素的所有属性
                el.removeAttribute(attr.name);   #删除获取到的所有属性

    测试结果

    我们传递了

     但是却发现src=1的属性被删除了,οnerrοr=alert(1)属性却还保留着,这是为什么呢?我们先了解一下这里的删除顺序。我们使用断点调试测试它的顺序

    我们先一步步调试查看值的情况,通过断点调试,我们发现src作为第一个属性进入后被删除了,剩下的属性onerror仅一位,但是循环次数大于字符串个数时就不能删除了属性了。

    我们使用一个python代码测试删除元素的顺序:

    我们发现在a数组下,我们仅取出来了3个值,在预期中我们应该取出6个值,这就是应该边循环边删除的原因造成的。 

     这就有很大的问题,因为删除元素时因为索引问题我们不清楚到底删除了哪些元素,所以我们仅需要进行多次尝试就可以绕过一次循环:

     

    两次循环--demo4.html

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Documenttitle>
    8. head>
    9. <body>
    10. body>
    11. <script>
    12. const data = decodeURIComponent(location.hash.substr(1));;
    13. const root = document.createElement('div');
    14. root.innerHTML = data;
    15. // 这里模拟了XSS过滤的过程,方法是移除所有属性,sanitizer
    16. for (let el of root.querySelectorAll('*')) {
    17. let attrs = [];
    18. for (let attr of el.attributes) {
    19. attrs.push(attr.name);
    20. }
    21. for (let name of attrs) {
    22. el.removeAttribute(name);
    23. }
    24. }
    25. document.body.appendChild(root);
    26. script>
    27. html>

    两次循环的题是将属性先放入一个数组里面再进行删除,这个时候就不存在一次循环的问题。

    所以我们使用两种方法进行绕过。

    绕过方法1:DOM cobbing

    将进入循环的东西不放入我们需要的代码,这样即使删除了也没有关系

    那我们如果让没有用到的属性进入循环,需要的又没有进入循环呢?

    tabindex:全局属性,指示其元素是否可以聚焦,以及它是否在何处参与顺序键盘导航。使用Tab键获取焦点。

     这样就是将进行了触发,删除的是后面的里面的属性。

    绕过方法2:不进循环

     为什么一个没有成功,两个就成功了?它可以在过滤代码执行以前,提前执行恶意代码。

            svg标签会阻塞DOM的构造。JS环境里对DOM操作又会导致回流,为DOM树构造造成额外影响。在script标签内的JS执行完毕以后,DOM树才会构建完成,接着才会加载后面的内容,然后发现加载内容出错才会触发error事件。

    就是恶意代码还没有进入循环就已经执行了,所以后面无论进不进循环都没有什么意义了。

  • 相关阅读:
    phpstudy设置允许远程访问mysql数据库(linux,pc都适用)
    ly-tab插件报错
    低噪声 256 细分微步进电机驱动MS35774/MS35774A(汽车应用级别)
    听书项目开发过程及重难点总结
    【DLoopDetector(C++)】DBow2词袋模型&&loop close学习
    大型医院HIS系统源码 优质源码 医院管理系统源码
    Rust 模块系统
    【背包问题】基于禁忌搜索算法求解背包问题附Matlab代码
    SystemVerilog学习(4)——自定义结构
    探讨代理IP与Socks5代理在跨界电商中的网络安全应用
  • 原文地址:https://blog.csdn.net/qq_52016943/article/details/126105120