漏洞原理:
攻击者通过将恶意脚本参数注入到被攻击站点的URL中,打开这个url,恶意脚本就会被攻击 假设一个网站有一个搜索功能,用户可以在搜索框中输入关键字来搜索相关内容。该搜索功能的URL为: www.example.com/search?keyword=xxx。其中,xxx是用户输入的关键字。 攻击者可以构造一段恶意代码,并将其嵌入到一个特定的URL中,比如:www.example.com/search?keyword=<script>alert(document.cookie)</script>。 当用户点击这个恶意URL,并提交搜索请求时,搜索结果页面会返回攻击代码:<script>alert(document.cookie)</script>,浏览器执行此代码,产生一个弹窗,显示当前页面的cookie内容。
这就是一种反射型XSS攻击的例子。 这种攻击方式需要欺骗用户去点击一个恶意的链接,如果用户没有点击这个恶意链接,就不会受到攻击。
简单验证:
打开一个目标网站的漏洞测试页面并找到输入参数,在输入参数中输入一段简单的 JavaScript 代码,比如<script>alert(1)</script> 查看返回的页面中是否有弹出的提示框,如果有弹出的提示框,就是存在反射型XSS攻击漏洞。
编码注意事项:
方法一:
输入验证。某个数据被接受为可被显示或存储之前,使用标准输入验证机制对用户输入的内容进行关键字过滤或者有效性验证。
以下为需过滤的常见字符:
| & ; $ % @ ' " \ ' \'(反斜杠转义单引号) \ "(反斜杠转义引号)<> () + CR LF |
除此之外,还可对输入进行白名单验证,比如,输入需为11位数字手机号、数字身份证号等,也能起到防止反射型XSS的效果。
方法二:
输出编码。数据输出前,确保用户提交的数据已被正确进行实体编码,建议对所有字符进行编码而不仅局限于某个子集。
方法三:
在设置Cookie时,设置HttpOnly参数,可禁止通过JavaScrip获取Cookie。此方法可以有效的防止Cookie信息被盗取,并不能完全防御XSS漏洞。