不一样的HTTP Headers (一)

原文链接:https://peteris.rocks/blog/exotic-http-headers/

目录

  • X-XSS-Protection
    • No header
    • X-XSS-Protection: 0
    • X-XSS-Protection: 1
    • X-XSS-Protection: 1; mode=block
    • X-XSS-Protection: 1; report=http://localhost:1234/report
  • X-Frame-Options
    • No header
    • X-Frame-Options: deny
    • X-Frame-Options: sameorigin
    • X-Frame-Options: allow-from http://localhost:4321
  • X-Content-Type-Options
    • No header
    • X-Content-Type-Options: nosniff
  • Content-Security-Policy
    • No header
    • Content-Security-Policy: default-src 'none'
    • Content-Security-Policy: default-src 'self'
    • Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'
    • Other
  • Strict-Transport-Security
  • Public-Key-Pins
  • Content-Encoding: br
  • Timing-Allow-Origin
  • Alt-Svc
  • P3P

正文

跨站脚本(XSS)是一种可以页面注入攻击的恶意脚本。

例如:

<h1>Hello, <script>alert('hacked')</script></h1>

代码的攻击意图非常明显,某些浏览器可能会阻止这段代码运行:如果在源代码中发现这些代码片段,它很可能发生攻击行为。

X-XSS-Protection可以阻止这些攻击发生。

值:

  • 0 禁用过滤器。
  • 1 启用过滤器。 如果检测到跨站点脚本攻击,为了停止攻击,浏览器将清理页面。
  • 1;  mode = block启用过滤器。 当检测到XSS攻击时,浏览器将阻止页面的呈现,而不是清理页面。
  • 1;  report=http://domain/url 过滤器已启用。 浏览器将清理页面并报告违例。 这是一个使用CSP违规报告的Chromium功能,可将详细信息发送到您选择的URI。

创建一个简单的js文件运行在node.js服务器上:

var express = require('express')
var app = express()

app.use((req, res) => {
  if (req.query.xss) res.setHeader('X-XSS-Protection', req.query.xss)
  res.send(`<h1>Hello, ${req.query.user || 'anonymous'}</h1>`)
})

app.listen(1234)

当前使用浏览器是Google Chrome 55。

No header

http://localhost:1234/?user=%3Cscript%3Ealert(%27hacked%27)%3C/script%3E

什么也没有发生,浏览器成功防御了本次攻击。

如果发现未设置标头,无需担忧,Chrome中的默认启用X-XSS-Protection,您可以在控制台中的看到错误消息。

xss-noheader

攻击代码高亮显示。

xss-noheader-source

X-XSS-Protection: 0

http://localhost:1234/?user=%3Cscript%3Ealert(%27hacked%27)%3C/script%3E&xss=0

Oh no!

xss-0

X-XSS-Protection: 1

http://localhost:1234/?user=%3Cscript%3Ealert(%27hacked%27)%3C/script%3E&xss=1

X-XSS-Protection设置为1,攻击被成功地阻止了。

xss-1

X-XSS-Protection: 1; mode=block

http://localhost:1234/user=%3Cscript%3Ealert(%27hacked%27)%3C/script%3E&xss=1;%20mode=block

攻击被阻止,只是不呈现页面。

xss-1-block

X-Frame-Options

此header允许您防止点击劫持攻击。

想象一下,攻击者有一个YouTube频道,但他需要订阅者。

他可以创建一个带有“不要点击”按钮的网站,这意味着每个人都会点击它。 但是在按钮的顶部有一个完全透明的iframe。 点击该按钮后,您实际上点击了YouTube上的订阅按钮。 如果您已登录YouTube,您现在将订阅攻击者。

让我们来说明这一点。

首先,安装Ignore X-Frame头文件扩展名。

创建此HTML文件。

<style>
button { background: red; color: white; padding: 10px 20px; border: none; cursor: pointer; }
iframe { opacity: 0.8; z-index: 1; position: absolute; top: -570px; left: -80px; width: 500px; height: 650px; }
</style>

<button>Do not click his button!</button>
<iframe src="https://youtu.be/dQw4w9WgXcQ?t=3m33s"></iframe>

youtube-button

正如你所看到的,我巧妙的得将iframe的视口放置到Subscribe按钮。 iframe在按钮的顶部(z-index: 1),所以当你尝试点击按钮时实际是点击iframe。 在这个例子中,尽管iframe没有完全隐藏,但我可以将透明度设置为:0。

在本次实践中,实验没有成功主要是因为没有登录YouTube,不过这里给你提供了攻击的思路。

你可以防止网站被嵌入为X-Frame-Options标题的iframe。

  • deny 在框架内无渲染。
  • sameorigin 如果源不匹配,则不显示。
  • allow-from:DOMAIN允许渲染,如果从框架加载从DOMAIN帧。
  • 我们将使用这个网络服务器进行实验。
var express = require('express')

for (let port of [1234, 4321]) {
 var app = express()
 app.use('/iframe', (req, res) => res.send(`<h1>iframe</h1><iframe src="//localhost:1234?h=${req.query.h || ''}"></iframe>`))
 app.use((req, res) => {
 if (req.query.h) res.setHeader('X-Frame-Options', req.query.h)
 res.send('<h1>Website</h1>')
 })
 app.listen(port)
}

No header

本设置允许任何人都在网站(localhost:1234)中嵌入iframe。

xframe-noheader

http://localhost:1234/iframe
http://localhost:4321/iframe

X-Frame-Options: deny

本设置禁止任何人都在网站(localhost:1234)中嵌入iframe。

xframe-deny

http://localhost:1234/iframe?h=deny
http://localhost:4321/iframe?h=deny

X-Frame-Options: sameorigin

当前设置下,仅本人可以在网站(localhost:1234)中嵌入iframe。

URI 的原始定义包含主机名和端口号。

xframe-sameorigin

http://localhost:1234/iframe?h=sameorigin
http://localhost:4321/iframe?h=sameorigin

 X-Frame-Options: allow-from http://localhost:4321

Google Chrome忽略此配置参数,因为你可以使用内容安全策略(请参阅下文)。

Invalid ‘X-Frame-Options’ header encountered when loading ‘http://localhost:1234/?h=allow-from%20http://localhost:4321’: ‘allow-from http://localhost:4321’ is not a recognized directive. The header will be ignored.

在Microsoft Edge中同样无效。

下面是火狐浏览器下测试效果。

xframe-allowfrom

http://localhost:1234/iframe?h=allow-from%20http://localhost:4321
http://localhost:4321/iframe?h=allow-from%20http://localhost:4321

 X-Content-Type-Options

This header prevents MIME confusion attacks (<script src=”script.txt”>) and unauthorized hotlinking (<script src=”https://raw.githubusercontent.com/user/repo/branch/file.js”>).

var express = require('express')
var app = express()

app.use('/script.txt', (req, res) => {
  if (req.query.h) res.header('X-Content-Type-Options', req.query.h)
  res.header('content-type', 'text/plain')
  res.send('alert("hacked")')
})

app.use((req, res) => {
  res.send(`<h1>Website</h1><script src="/script.txt?h=${req.query.h || ''}"></script>`)
})

app.listen(1234)

No header

http://localhost:1234/

即使script.txt是一个内容类型为text / plain的文本文件,它仍然被以JavaScript代形式执行。

xcontent

X-Content-Type-Options: nosniff

http://localhost:1234/?h=nosniff

本次内容类型不匹配,文件未执行。

xcontent-nosniff

Content-Security-Policy

……..

[未完待续,MottoIN小编整理发布]

原创文章,作者:Tank,如若转载,请注明出处:http://www.mottoin.com/article/web/93711.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code