Web安全学习笔记 XSS漏洞分析中


Web安全学习笔记 XSS中

繁枝插云欣 ——ICML8


  1. CSP
  2. XSS数据源
  3. Sink
  4. XSS保护

一.CSP

1. CSP是什么?

Content Security Policy,简称 CSP,译作内容安全策略。顾名思义,这个规范与内容安全有关,主要是用来定义哪些资源可以被当前页面加载,减少 XSS 的发生。

2. 配置

CSP策略可以通过 HTTP 头信息或者 meta 元素定义。

CSP 有三类:

1.Content-Security-Policy (Google Chrome)

2.X-Content-Security-Policy (Firefox)

3.X-WebKit-CSP (WebKit-based browsers, e.g. Safari)

 HTTP header :
"Content-Security-Policy:"策略
"Content-Security-Policy-Report-Only:"策略

HTTP Content-Security-Policy 头可以指定一个或多个资源是安全的,而Content-Security-Policy-Report-Only则是允许服务器检查(非强制)一个策略。多个头的策略定义由优先采用最先定义的。

HTML Meta :

"content-security-policy" content="策略">
"content-security-policy-report-only" content="策略">

2.1. 指令说明

指令说明
default-src 定义资源默认加载策略
connect-src 定义 Ajax、WebSocket 等加载策略
font-src 定义 Font 加载策略
frame-src 定义 Frame 加载策略
img-src 定义图片加载策略
media-src 定义
object-src 定义 、、 等引用资源加载策略
script-src 定义 JS 加载策略
style-src 定义 CSS 加载策略
base-uri 定义 根URL策略,不使用default-src作为默认值
sandbox 值为 allow-forms,对资源启用 sandbox
report-uri 值为 /report-uri,提交日志

2.2. 关键字

-

允许从任意url加载,除了 
data: 
blob: 
filesystem:
schemes
e.g. img-src -

none

禁止从任何url加载资源
e.g. object-src 'none'

self

只可以加载同源资源
e.g. img-src 'self'

data:

可以通过data协议加载资源
e.g. img-src 'self' data:

domain.example.com

domain.example.com
e.g. img-src domain.example.com
只可以从特定的域加载资源

\*.example.com

e.g. img-src \*.example.com
可以从任意example.com的子域处加载资源

https://cdn.com

e.g. img-src https://cdn.com
只能从给定的域用https加载资源

https:

e.g. img-src https:
只能从任意域用https加载资源

unsafe-inline

允许内部资源执行代码例如
style attribute,onclick
或者是sicript标签
e.g. script-src 'unsafe-inline'

unsafe-eval

允许一些不安全的代码执行方式
例如js的eval()
e.g. script-src 'unsafe-eval'

nonce-'

使用随机的nonce
允许加载标签上nonce属性匹配的标签
e.g. script-src 'nonce-bm9uY2U='

-'

允许hash值匹配的代码块被执行
e.g. script-src 'sha256-'

3. 配置范例

允许执行内联 JS 代码,但不允许加载外部资源

Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline';

3. Bypass

3.1. 预加载

浏览器为了增强用户体验,让浏览器更有效率,就有一个预加载的功能,大体是利用浏览器空闲时间去加载指定的内容,然后缓存起来。这个技术又细分为DNS-prefetchsubresourceprefetchpreconnectprerender

HTML5页面预加载是用link标签rel属性来指定的。如果csp头有unsafe-inline,则用预加载的方式可以向外界发出请求,例如


'prefetch' href='http://xxxx'>
'prerender' href='http://xxxx'>

'prefetch' href='http://xxxx/x.jpg'>

"dns-prefetch" href="http://xxxx">

'preload' href='//xxxxx/xx.js'>

另外,不是所有的页面都能够被预加载 当资源类型如下时,将阻止预加载操作:

    1.URL中包含下载资源
    2.页面中包含音频、视频
    3.POST、PUT和DELET操作的ajax请求
    4.HTTP认证
    5.HTTPS页面
    6.含恶意软件的页面
    7.弹窗页面
    8.占用资源很多的页面
    9.打开了chrome developer tools开发工具

3.2. MIME Sniff

举例来说,csp禁止跨站读取脚本,但是可以跨站读img,那么传一个含有脚本的img,再

3.6. 其他

location 绕过

可上传SVG时,通过恶意SVG绕过同源站点

存在CRLF漏洞且可控点在CSP上方时,可以注入HTTP响应中影响CSP解析

CND Bypass,如果网站信任了某个CDN, 那么可利用相应CDN的静态资源bypass

Angular versions <1.5.9 >=1.5.0,存在漏洞 Git Pull Request

jQuery sourcemap

document.write(`

2. 加载URL

location=javascript:alert(/xss/)
location.href=javascript:alert(/xss/)
location.assign(javascript:alert(/xss/))
location.replace(javascript:alert(/xss/))

3. 执行HTML

xx.innerHTML=payload
xx.outerHTML=payload
document.write(payload)
document.writeln(payload)

四. XSS保护

1. HTML过滤

使用一些白名单或者黑名单来过滤用户输入的HTML,以实现过滤的效果。例如DOMPurify等工具都是用该方式实现了XSS的保护。

2. X-Frame

X-Frame-Options 响应头有三个可选的值:

DENY 页面不能被嵌入到任何iframe或frame中

SAMEORIGIN 页面只能被本站页面嵌入到iframe或者frame中

ALLOW-FROM 页面允许frame或frame加载

3. XSS保护头

基于 Webkit内核的浏览器(比如Chrome)在特定版本范围内有一个名为XSS auditor的防护机制,如果浏览器检测到了含有恶意代码的输入被呈现在HTML文档中,那么这段呈现的恶意代码要么被删除,要么被转义,恶意代码不会被正常的渲染出来。

而浏览器是否要拦截这段恶意代码取决于浏览器的XSS防护设置。

要设置浏览器的防护机制,则可使用X-XSS-Protection字段 该字段有三个可选的值

0 : 表示关闭浏览器的XSS防护机制
  
1 : 删除检测到的恶意代码
    如果响应报文中没有看到
    X-XSS-Protection字段
    那么浏览器就认为X-XSS-Protection配置为1
    这是浏览器的默认设置
  
1; mode=block: 
    如果检测到恶意代码,在不渲染恶意代码
    FireFox没有相关的保护机制
    如果需要保护
    可使用NoScript等相关插件

相关