跨站脚本攻击,Cross Site Script。攻击者通过“HTML注入”,篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
存储型,出现在让用户输入数据,供用户查看的地方。应用程序从数据库中查询数据,在页面中显示出来,攻击者在相关页面输入恶意的脚本数据后,用户浏览此类页面就可能受到攻击。反射型,将数据输入应用程序后直接输出脚本内容,用户点击恶意链接就可能受到攻击。
构造数据:'onclick = alert(document.domain) // 。"> <script>alert(document.domain);</script>。'><img src=......../><'。
如何防范:
“Secure By Default”,不要在页面中插入任何不可信数据。之所以有这样一条原则存在,是因为HTML里有太多的地方容易形成XSS漏洞,而且形成漏洞的原因又有差别,比如有些漏洞发生在HTML标签里,有些发生在HTML标签的属性里,还有的发生在页面的<Script>里,甚至有些还出现在CSS里,再加上不同的浏览器对页面的解析或多或少有些不同,使得有些漏洞只在特定浏览器里才会产生。如果想要通过XSS过滤器(XSS Filter)对不可信数据进行转义或替换,那么XSS过滤器的过滤规则将会变得异常复杂,难以维护而且会有被绕过的风险。
输入检查和安全编码
对于HTML标签之间时,对这些数据进行HTML Entity编码
<body>HTML Entity编码</body>/<div>/<p>/<a>。HTML Entity编码是对&,<,>,",',/,6个特殊字符进行编码。
String encodedContent =
ESAPI.encoder().encodeForHTML(request.getParameter(“input”));
对于HTML属性时,对这些数据进行HTML属性编码
String encodedContent =
ESAPI.encoder().encodeForHTMLAttribute(request.getParameter(“input”));
HTML里有太多的地方容易形成XSS漏洞,而且形成漏洞的原因又有差别,比如有些漏洞发生在HTML标签里,有些发生在HTML标签的属性里,还有的发生在页面的<Script>里,甚至有些还出现在CSS里,再加上不同的浏览器对页面的解析或多或少有些不同,使得有些漏洞只在特定浏览器里才会产生。如果想要通过XSS过滤器(XSS Filter)对不可信数据进行转义或替换,那么XSS过滤器的过滤规则将会变得异常复杂,难以维护而且会有被绕过的风险。里,甚至有些还出现在CSS里,再加上不同的浏览器对页面的解析或多或少有些不同,使得有些漏洞只在特定浏览器里才会产生。如果想要通过XSS过滤器(XSS Filter)对不可信数据进行转义或替换,那么XSS过滤器的过滤规则将会变得异常复杂,难以维护而且会有被绕过的风险。
在将不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码
String encodedContent =
ESAPI.encoder().encodeForJavaScript(request.getParameter(“input”));
CSS:
String encodedContent =
ESAPI.encoder().encodeForCSS(request.getParameter(“input”));
URL:
String encodedContent =
ESAPI.encoder().encodeForURL(request.getParameter(“input”));
使用富文本时,使用XSS规则引擎进行编码过滤
网友评论