返回介绍

3.2 XSS 类型

发布于 2024-01-20 15:41:04 字数 2683 浏览 0 评论 0 收藏 0

XSS有三类:反射型XSS(也叫非持久型XSS)、存储型XSS(也叫持久型XSS)和DOMXSS。

3.2.1 反射型XSS

发出请求时,XSS代码出现在URL中,作为输入提交到服务端,服务端解析后响应,在响应内容中出现这段XSS代码,最后浏览器解析执行。这个过程就像一次反射,故称为反射型XSS。

下面举两个简单的例子。

第一个:http://www.foo.com/xss/re-flect1.php的代码如下。

<?php
echo $_GET['x'];
?>

输入x的值未经任何过滤就直接输出,可以提交:

http://www.foo.com/xss/reflect1.php?x=<script>alert(1)</script>

服务端解析时,echo就会完整地输出<script>alert(1)</script>到响应体中,然后浏览器解析执行触发。

第二个:http://www.foo.com/xss/re-flect2.php的代码如下。

<?php
header('Location: '.$_GET['x']);
?>

输入x的值作为响应头部的Location字段值输出,意味着会发生跳转,触发XSS的其中一种方式如下。

http://www.foo.com/book/reflect2.php?x=data:text/html;base64,PHNjcmlwdD5hbGVyd-Chkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ%2b

跳转到data:协议上,text/html是MIME或Content-Type,表明文档类型,base64是指后面字符串的编码方式,后面这段base64解码后的值为:

<script>alert(document.domain)</script>

于是,当发生跳转时,就会执行这段JS。

3.2.2 存储型XSS

存储型XSS和反射型XSS的差别仅在于:提交的XSS代码会存储在服务端(不管是数据库、内存还是文件系统等),下次请求目标页面时不用再提交XSS代码。

最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与JS解析执行,于是就触发了XSS攻击。

存储型XSS的攻击是最隐蔽的。

3.2.3 DOM XSS

3.1.2节说的就是DOM XSS。它和反射型XSS、存储型XSS的差别在于,DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。

如3.1.2节里的代码:

<script>
eval(location.hash.substr(1));
</script>

触发XSS方式为:http://www.foo.com/xssme.html#alert(1)

这个URL#后的内容是不会发送到服务端的,仅仅是在客户端被接收并解析执行。这种类型的XSS最早是在Amit Klein的文章里出现的(2005年7月4日):

http://www.webappsec.org/projects/arti-cles/071105.shtml

本书摘录了其中的一些内容,常见的输入点有:

document.URL
document.URLUnencoded
document.location (以及location的多个属性)
document.referrer
window.location (以及location的多个属性)
window.name
xhr请求回来的数据
document.cookie
表单项的值

常见的输出点有:

直接输出HTML内容,如:
document.write(…)
document.writeln(…)
document.body.innerHtml=…

直接修改DOM树(包括DHTML事件),如:
document.forms[0].action=…(

以及其他集合,如:一些对象的src/href属性等)
document.attachEvent(…)
document.create…(…)
document.execCommand(…)
document.body. … (直接通过body对象访问DOM)
window.attachEvent(…)

替换document URL,如:
document.location=… (以及直接赋值给location
的href,host,hostname属性)
document.location.hostname=…
document.location.replace(…)
document.location.assign(…)
document.URL=…
window.navigate(…)

打开或修改新窗口,如:
document.open(…)
window.open(…)
window.location.href=… (以及直接赋值给
location的href,host,hostname属性)

直接执行脚本,如:
eval(…)
window.execScript(…)
window.setInterval(…)
window.setTimeout(…)

这些都是JavaScript的基本点,从这些输入/输出点我们可以看到,DOM XSS的处理逻辑就在客户端。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文