当前位置:   article > 正文

DOM-based XSS 与 存储性XSS、反射型XSS有什么区别?_dom型xss是反射性还搜存储型

dom型xss是反射性还搜存储型

http://www.zhihu.com/question/26628342


单单解释三者的区别,似乎有点单调。说到xss,就必须要提一提js,脱离了js去谈xss都是耍流氓!

1,)先来分析一下LZ说的DOM-based XSS。
一句话概括:DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。
如果楼主没有搞懂dom树的关系,那对dom xss的了解是非常有限的。
先以一张w3c的图来说明,到底什么是dom:


哦..原来是这样(似乎你有点了解?),没错,dom就是一个树状的模型,你可以编写Javascript代码根据dom一层一层的节点,去遍历/获取/修改对应的节点,对象,值。
了解了这么一个知识点,你就会发现,其实dom xss并不复杂,他也属于反射型xss的一种,简单去理解就是因为他输出点在DOM,所以在道哥的《白帽子讲Web安全里》也有详细介绍。dom - xss是通过url传入参数去控制触发的。
2,)分析完dom-xss之后,再说说存储型xss,其实也很好理解,存储型xss,自然就是存入了数据库,再取出来,导致的xss。
3,)反射型xss实际上是包括了dom - xss了,关键点仍然是在通过url控制了页面的输出(dom-xss也类似,只因为输出地点不同而导致结果不一致)。
说了这3种区别,不能仅仅停留在理论上,下面我贴出这三种xss代码的demo【均以php为例】:
dom-xss:
  1. <?php
  2. error_reporting(0);
  3. $name = $_GET["name"];
  4. ?>
  5. <input id="text" type="text" value="<?php echo $name;?>" />
  6. <div id="print"></div>
  7. <script type="text/javascript">
  8. var text = document.getElementById("text");
  9. var print = document.getElementById("print");
  10. print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
  11. </script>
前面有一个热心的回答者说到一点:domxss需要关闭ie xss过滤器才会触发。实际上是不需要的,domxss是可以在各个浏览器触发,截图说明(基于上面那段代码):
chrome:
ie(开启了xss防护模式):
存储型xss:
  1. <?php
  2. error_reporting(0);
  3. $name = $_GET["name"];
  4. //连接服务器
  5. $conn = mysql_connect("127.0.0.1","root","");
  6. //打开数据库
  7. mysql_select_db("test",$conn);
  8. //执行SQL
  9. mysql_query("set names 'utf8'");
  10. $sql_insert = "insert into liuyan(id,content) values('$id','$name')";
  11. $result = mysql_query($sql_insert,$conn);
  12. $sql_select = "select * from liuyan";
  13. $results = mysql_fetch_array(mysql_query($sql_select));
  14. echo $results[content];
  15. ?>
上面这段代码写的比较简洁,可以看到用户可控的$_GET name直接被带入到数据库中,随后被查询并且输出出来了,直接导致了xss。感兴趣的同学可以做下测试,先通过
http://localhost/2.php?name=%3Cscript%3Ealert(1)%3C/script%3E
然后再访问 localhost/2.php 。即可触发存储型xss:
步骤一,是为了让xss代码写入数据库,步骤二是为了把恶意代码从数据库取出来并且输出在页面上。
反射型xss:
  1. <?php
  2. $name = $_GET["name"];
  3. ?>
  4. <input type="text" value="<?php echo $name?>">
结果:
好了,花了这么长的时间去说明,其实想告诉题主:
在易用上,存储型XSS > DOM - XSS > 反射型 XSS。
为什么这么说?因为存储型xss最持久,而且更为隐蔽,因为是存在数据库当中的,触发的url当中没有带js或者其他的html代码。dom-xss,排在其次。为何?上面的图最直观: 因为它能绕过大部分浏览器的过滤(新版Chrome针对script context类型的domxss做了检测拦截)。  反射型的xss还要深思熟虑的考虑根据浏览器去bypass各种过滤,易用性稍微差一些。注:反射型xss和dom-xss都需要在url加入js代码才能够触发。
在检测上,目前我还没有看到比较好的针对存储型xss的检测手段,而domxss和反射型xss均有比较好的检测手段了。
其实这个问题早已有人问过了: 存储型XSS与反射型XSS有什么区别? 黑哥的总结是交互,这点我也是赞同的,这个是相同点。
希望我这个答案是升级版,能帮助到新手学习xss,这样我码字这么多也是值得的:)
资料参考:
HTML DOM 教程
学习教程:
白帽子信息_心伤的瘦子
2014-11-17修改:
在新版本的Chrome已经能够拦截scrip context类型的dom-xss,感谢  @ice png 指正错误,我在Chrome的老版本亲测是可行的:)版本号10.0.648.6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/150235
推荐阅读
相关标签
  

闽ICP备14008679号