4.2. XSS

4.2. XSS

内容索引:

  • 4.2. XSS
  • 4.2.1. 分类
      • 4.2.1.1. 反射型XSS
      • 4.2.1.2. 储存型XSS
      • 4.2.1.3. DOM XSS
      • 4.2.1.4. Blind XSS
  • 4.2.2. 危害
  • 4.2.3. 同源策略
      • 4.2.3.1. 简介
        • 4.2.3.1.1. file域的同源策略
        • 4.2.3.1.2. cookie的同源策略
        • 4.2.3.1.3. Flash/SilverLight跨域
      • 4.2.3.2. 源的更改
      • 4.2.3.3. 跨源访问
        • 4.2.3.3.1. JSONP跨域
        • 4.2.3.3.2. 跨源脚本API访问
        • 4.2.3.3.3. 跨源数据存储访问
      • 4.2.3.4. CORS
        • 4.2.3.4.1. 常见请求头
        • 4.2.3.4.2. 常见返回头
        • 4.2.3.4.3. 防御建议
      • 4.2.3.5. 阻止跨源访问
  • 4.2.4. CSP
      • 4.2.4.1. CSP是什么?
      • 4.2.4.2. 配置
        • 4.2.4.2.1. 指令说明
        • 4.2.4.2.2. 关键字
        • 4.2.4.2.3. 配置范例
      • 4.2.4.3. Bypass
        • 4.2.4.3.1. 预加载
        • 4.2.4.3.2. MIME Sniff
        • 4.2.4.3.3. 302跳转
        • 4.2.4.3.4. iframe
        • 4.2.4.3.5. base-uri
        • 4.2.4.3.6. 其他
  • 4.2.5. XSS数据源
      • 4.2.5.1. URL
      • 4.2.5.2. Navigation
      • 4.2.5.3. Communication
      • 4.2.5.4. Storage
  • 4.2.6. Sink
      • 4.2.6.1. 执行JavaScript
      • 4.2.6.2. 加载URL
      • 4.2.6.3. 执行HTML
  • 4.2.7. XSS保护
      • 4.2.7.1. HTML过滤
      • 4.2.7.2. X-Frame
      • 4.2.7.3. XSS保护头
  • 4.2.8. WAF Bypass
  • 4.2.9. 技巧
      • 4.2.9.1. httponly
      • 4.2.9.2. CSS 注入
        • 4.2.9.2.1. 基本介绍
        • 4.2.9.2.2. CSS selectors
        • 4.2.9.2.3. Abusing Unicode Range
      • 4.2.9.3. Bypass Via Script Gadgets
        • 4.2.9.3.1. 简介
        • 4.2.9.3.2. 例子
      • 4.2.9.4. RPO(Relative Path Overwrite)
  • 4.2.10. Payload
      • 4.2.10.1. 常用
      • 4.2.10.2. 大小写绕过
      • 4.2.10.3. 各种alert
      • 4.2.10.4. 伪协议
      • 4.2.10.5. Chrome XSS auditor bypass
      • 4.2.10.6. 长度限制
      • 4.2.10.7. jquery sourceMappingURL
      • 4.2.10.8. 图片名
      • 4.2.10.9. 过期的payload
      • 4.2.10.10. css
      • 4.2.10.11. markdown
      • 4.2.10.12. iframe
      • 4.2.10.13. form
      • 4.2.10.14. meta
  • 4.2.11. 持久化
      • 4.2.11.1. 基于存储
      • 4.2.11.2. Service Worker
      • 4.2.11.3. AppCache
  • 4.2.12. 参考链接
      • 4.2.12.1. wiki
      • 4.2.12.2. Challenges
      • 4.2.12.3. CSS
      • 4.2.12.4. 同源策略
      • 4.2.12.5. bypass
      • 4.2.12.6. 持久化
      • 4.2.12.7. Tricks

4.2.1. 分类

XSS全称为Cross Site Scripting,为了和CSS分开简写为XSS,中文名为跨站脚本。该漏洞发生在用户端,是指在渲染过程中发生了不在预期过程中的JavaScript代码执行。XSS通常被用于获取Cookie、以受攻击者的身份进行操作等行为。

4.2.1.1. 反射型XSS

反射型XSS是比较常见和广泛的一类,举例来说,当一个网站的代码中包含类似下面的语句:hello, $_GET['user']

";?>,那么在访问时设置 /?user=

,则可执行预设好的JavaScript代码。

反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor、NoScript等防御手段的影响较大。

4.2.1.2. 储存型XSS

储存型XSS相比反射型来说危害较大,在这种漏洞中,攻击者能够把攻击载荷存入服务器的数据库中,造成持久化的攻击。

4.2.1.3. DOM XSS

DOM型XSS不同之处在于DOM型XSS一般和服务器的解析响应没有直接关系,而是在JavaScript脚本动态执行的过程中产生的。

例如



DOM Based XSS Demo



输入 x' onerror='javascript:alert(/xss/)即可触发。

4.2.1.4. Blind XSS

Blind XSS是储存型XSS的一种,它保存在某些存储中,当一个“受害者”访问这个页面时执行,并且在文档对象模型(DOM)中呈现payload。 它被归类为盲目的原因是因为它通常发生在通常不暴露给用户的功能上。

4.2.2. 危害

存在XSS漏洞时,可能会导致以下几种情况:

1.用户的Cookie被获取,其中可能存在Session ID等敏感信息。若服务器端没有做相应防护,攻击者可用对应Cookie登陆服务器。
2. 攻击者能够在一定限度内记录用户的键盘输入。
3. 攻击者通过CSRF等方式以用户身份执行危险操作。
4.XSS蠕虫。
5.获取用户浏览器信息。
6.利用XSS漏洞扫描用户内网。

4.2.3. 同源策略

4.2.3.1. 简介

同源策略限制了不同源之间如何进行资源交互,是用于隔离潜在恶意文件的重要安全机制。 是否同源由URL决定,URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。

4.2.3.1.1. file域的同源策略

在之前的浏览器中,任意两个file域的URI被认为是同源的。本地磁盘上的任何HTML文件都可以读取本地磁盘上的任何其他文件。

从Gecko 1.9开始,文件使用了更细致的同源策略,只有当源文件的父目录是目标文件的祖先目录时,文件才能读取另一个文件。

4.2.3.1.2. cookie的同源策略

cookie使用不同的源定义方式,一个页面可以为本域和任何父域设置cookie,只要是父域不是公共后缀(public suffix)即可。

不管使用哪个协议(HTTP/HTTPS)或端口号,浏览器都允许给定的域以及其任何子域名访问cookie。设置 cookie时,可以使用 domain/path/ securehttp-only标记来限定其访问性。

所以 https://localhost:8080/http://localhost:8081/ 的Cookie是共享的。

4.2.3.1.3. Flash/SilverLight跨域

浏览器的各种插件也存在跨域需求。通常是通过在服务器配置crossdomain.xml,设置本服务允许哪些域名的跨域访问。

客户端会请求此文件,如果发现自己的域名在访问列表里,就发起真正的请求,否则不发送请求。

4.2.3.2. 源的更改

同源策略认为域和子域属于不同的域,例如 child1.a.coma.com/ child1.a.comchild2.a.com / xxx.child1.a.comchild1.a.com两两不同源。

对于这种情况,可以在两个方面各自设置 document.domain='a.com'来改变其源来实现以上任意两个页面之间的通信。

另外因为浏览器单独保存端口号,这种赋值会导致端口号被重写为 null

4.2.3.3. 跨源访问

同源策略控制了不同源之间的交互,这些交互通常分为三类:

  • 通常允许跨域写操作(Cross-origin writes)

    • 链接(links)
    • 重定向
    • 表单提交
  • 通常允许跨域资源嵌入(Cross-origin embedding)

  • 通常不允许跨域读操作(Cross-origin reads)

可能嵌入跨源的资源的一些示例有:

-标签嵌入跨域脚本。语法错误信息只能在同源脚本中捕捉到。

  • 标签嵌入CSS。由于CSS的松散的语法规则,CSS的跨域需要一个设置正确的Content-Type 消息头。
  • / / 嵌入多媒体资源。
  • 的插件。
  • @font-face引入的字体。一些浏览器允许跨域字体( cross-origin fonts),一些需要同源字体(same-origin fonts)。
  • 4.2.10.6. 长度限制

    
    \...
    
    

    4.2.10.7. jquery sourceMappingURL

    4.2.10.8. 图片名

    ">.gif

    4.2.10.9. 过期的payload

    • src=javascript:alert基本不可以用
    • css expression特性只在旧版本ie可用

    4.2.10.10. css

    4.2.10.11. markdown

    [a](javascript:prompt(document.cookie))
    [a](j    a   v   a   s   c   r   i   p   t:prompt(document.cookie))
    <javascript:alert('XSS')>
    ![a'"`onerror=prompt(document.cookie)](x)
    [notmalicious](javascript:window.onerror=alert;throw%20document.cookie)
    [a](data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=)
    ![a](data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=)
    

    4.2.10.12. iframe