3.2 XSS 类型
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论