渗透测试XSS跨站攻击检测手法( 二 )

  • 链接(links)
  • 重定向
  • 表单提交
  • 通常允许跨域资源嵌入(Cross-origin embedding)
  • 通常不允许跨域读操作(Cross-origin reads)
  • 可能嵌入跨源的资源的一些示例有:
    • < src=https://www.isolves.com/it/aq/fwq/2019-10-08/"..."> 标签嵌入跨域脚本 。语法错误信息只能在同源脚本中捕捉到 。
    • <link rel="stylesheet" href=https://www.isolves.com/it/aq/fwq/2019-10-08/"..."> 标签嵌入CSS 。由于CSS的松散的语法规则,CSS的跨域需要一个设置正确的Content-Type 消息头 。
    • <img> / <video> / <audio> 嵌入多媒体资源 。
    • <object> <embed> 和 <Applet> 的插件 。
    • @font-face 引入的字体 。一些浏览器允许跨域字体( cross-origin fonts),一些需要同源字体(same-origin fonts) 。
    • <frame> 和 <iframe> 载入的任何资源 。站点可以使用X-Frame-Options消息头来阻止这种形式的跨域交互 。
    3.2.2.3.1. JSONP跨域
    JSONP就是利用 <> 标签的跨域能力实现跨域数据的访问,请求动态生成的Java脚本同时带一个callback函数名作为参数 。
    服务端收到请求后,动态生成脚本产生数据,并在代码中以产生的数据为参数调用callback函数 。
    3.2.2.3.2. 跨源脚本API访问
    Java的APIs中,如 iframe.contentWindow , window.parent, window.open 和 window.opener 允许文档间相互引用 。当两个文档的源不同时,这些引用方式将对 window 和 location 对象的访问添加限制 。
    window 允许跨源访问的方法有
    • window.blur
    • window.close
    • window.focus
    • window.postMessage
    window 允许跨源访问的属性有
    • window.closed
    • window.frames
    • window.length
    • window.location
    • window.opener
    • window.parent
    • window.self
    • window.top
    • window.window
    其中 window.location 允许读/写,其他的属性只允许读
    3.2.2.3.3. 跨源数据存储访问
    存储在浏览器中的数据,如 localStorage 和 IndexedDB,以源进行分割 。每个源都拥有自己单独的存储空间,一个源中的Java脚本不能对属于其它源的数据进行读写操作 。
    3.2.2.4. CORS
    CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing) 。通过这个标准,可以允许浏览器读取跨域的资源 。
    3.2.2.4.1. 常见返回头
    • Access-Control-Allow-Origin
    • 声明允许的源
    • Access-Control-Allow-Origin: <origin> | *
    • Access-Control-Expose-Headers
    • 声明允许暴露的头 e.g. Access-Control-Expose-Headers: X-My-Custom-Header,X-Another-Custom-Header
    • Access-Control-Max-Age
    • 声明Cache时间
    • Access-Control-Max-Age: <delta-seconds>
    • Access-Control-Allow-Credentials
    • 声明是否允许在请求中带入
    • Access-Control-Allow-Credentials: true
    • Access-Control-Allow-Methods
    • 声明允许的访问方式
    • Access-Control-Allow-Methods: <method>[, <method>]*
    • Access-Control-Allow-Headers
    • 声明允许的头
    • Access-Control-Allow-Headers: <field-name>[, <field-name>]*
    3.2.2.4.2. 常见请求头
    • Origin
    • 指定请求的源
    • Origin: <origin>
    • Access-Control-Request-Method
    • 声明请求使用的方法
    • Access-Control-Request-Method: <method>
    • Access-Control-Request-Headers
    • 声明请求使用的header
    • Access-Control-Request-Headers: <field-name>[, <field-name>]*
    3.2.2.4.3. 防御建议
     
    渗透测试XSS跨站攻击检测手法

    文章插图
     
     
    如非必要不开启CORS
    • 定义详细的白名单,不使用通配符,仅配置所需要的头
    • 配置 Vary: Origin 头部
    • 如非必要不使用 Access-Control-Allow-Credentials
    • 限制缓存的时间
    3.2.2.5. 阻止跨源访问
    阻止跨域写操作,可以检测请求中的 CSRF token,这个标记被称为Cross-Site Request Forgery (CSRF) 标记 。
    阻止资源的跨站读取,因为嵌入资源通常会暴露信息,需要保证资源是不可嵌入的 。但是多数情况下浏览器都不会遵守 Content-Type 消息头 。例如如果在HTML文档中指定 <> 标记,则浏览器会尝试将HTML解析为Java 。
    3.2.3. CSP
    3.2.3.1. CSP是什么?
    Content Security Policy,简称 CSP 。顾名思义,这个规范与内容安全有关,主要是用来定义页面可以加载哪些资源,减少 XSS 的发生 。
    3.2.3.2. 配置
    CSP策略可以通过 HTTP 头信息或者 meta 元素定义 。


    推荐阅读