DOM-based XSS 与 存储性XSS、反射型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:
<?php
error_reporting(0);
$name = $_GET["name"];
?>
<input id="text" type="text" value="<?php echo $name;?>" />
<div id="print"></div>
<script type="text/javascript">
var text = document.getElementById("text"); 
var print = document.getElementById("print");
print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
</script>
前面有一个热心的回答者说到一点:domxss需要关闭ie xss过滤器才会触发。实际上是不需要的,domxss是可以在各个浏览器触发,截图说明(基于上面那段代码):
chrome:
ie(开启了xss防护模式):
存储型xss:
<?php
error_reporting(0);
$name = $_GET["name"];
//连接服务器
$conn = mysql_connect("127.0.0.1","root","");
//打开数据库
mysql_select_db("test",$conn);
//执行SQL
mysql_query("set names 'utf8'");
$sql_insert = "insert into liuyan(id,content) values('$id','$name')";
$result = mysql_query($sql_insert,$conn);
$sql_select = "select * from liuyan";
$results = mysql_fetch_array(mysql_query($sql_select));
echo $results[content];
?>
上面这段代码写的比较简洁,可以看到用户可控的$_GET name直接被带入到数据库中,随后被查询并且输出出来了,直接导致了xss。感兴趣的同学可以做下测试,先通过
http://localhost/2.php?name=%3Cscript%3Ealert(1)%3C/script%3E
然后再访问 localhost/2.php 。即可触发存储型xss:
步骤一,是为了让xss代码写入数据库,步骤二是为了把恶意代码从数据库取出来并且输出在页面上。
反射型xss:
<?php
$name = $_GET["name"];
?>
<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
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值