DVWA —— Content Security Policy (CSP 内容安全策略) Bypass

目录

漏洞原理

Low

渗透思路

X-Content-Type-Options header 介绍

修改 Content-Type 绕过 X-Content-Type-Options

Medium

渗透思路

CSP 内联资源

构造内联属性绕过

源码对比

Low & Medium 源码

对比小结

High

渗透思路

JSONP 参数绕过

源码对比

Medium & High 源码

对比小结

Impossible

源码对比

High & Impossible

对比小结

绕过

防御

参考文章


漏洞原理

CSP全称是: Content-Security-Policy, 内容安全策略。

是指HTTP返回报文头中的标签,浏览器会根据标签中的内容,判断哪些资源可以加载或执行。主要是为了缓解潜在的跨站脚本问题(XSS),浏览器的扩展程序系统引入了内容安全策略这个概念。原来应对XSS攻时,主要采用函数过滤转义输入中的特殊字符、标签、文本来规避攻击。CSP的实质就是白名单制度,开发人员明确告诉客户端,哪些外部资源可以加载和执行。开发者只需要提供配置,实现和执行全部由浏览器完成。

Low

渗透思路

CSP 对我来说是个新知识点,需要详细分析下,假设需要远程包含恶意 JS 文件实现 XSS 攻击,以下是恶意 JS 地址

https://www.segmentfault.com.haozi.me/j.js

控制台给出错误提示,CSP 策略阻止读取

仔细分析 http://www.dvwa.com/vulnerabilities/csp/ 页面发现 CSR 策略白名单

script-src 'self' Pastebin.com - #1 paste tool since 2002! hastebin.com example.com code.jquery.com https://ssl.google-analytics.com

其中 pastebin 是个快速分享文本内容的网站,假如文本的内容是一段 JavaScript 代码,网页就会把该代码包含进来。

点击创建后来到如下页面,可以根据实际需要获得各种格式的内容链接,这里我只需要 raw,纯文本格式的

raw 格式链接和内容如下

https://pastebin.com/raw/1rPXdfjz

但在实际测试中还是没有成功,出现了新问题

X-Content-Type-Options header 介绍

互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:"text/html"代表html文档,"image/png"是PNG图片,"text/css"是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行

例如,我们即使给一个html文档指定Content-Type为"text/plain",在IE8-中这个文档依然会被当做html来解析。利用浏览器的这个特性,攻击者甚至可以让原本应该解析为图片的请求被解析为JavaScript。

这个header主要用来防止在IE9、chrome和safari中的MIME类型混淆攻击。firefox目前对此还存在争议。通常浏览器可以通过嗅探内容本身的方法来决定它是什么类型,而不是看响应中的content-type值。通过设置 X-Content-Type-Options:如果content-type和期望的类型匹配,则不需要嗅探,只能从外部加载确定类型的资源。举个例子,如果加载了一个样式表,那么资源的MIME类型只能是text/css。

所以,如果浏览器在响应中接收到 "nosniff" 指令,则 Internet Explorer 不会猜测或解析那些未定义,错误的 MIME 文件,除非 MIME 类型匹配以下值之一:

  • "application/ecmascript"
  • "application/javascript"
  • "application/x-javascript"
  • "text/ecmascript"
  • "text/javascript"
  • "text/jscript"
  • "text/x-javascript"
  • "text/vbs"
  • "text/vbscript"

参考文章

https://www.cnblogs.com/goloving/p/14891370.html

web安全:x-content-type-options头设置_juruiyuan111的博客-CSDN博客

修改 Content-Type 绕过 X-Content-Type-Options

burp 拦截 JS 内容响应报文

修改响应报文中的 Content-Type: text/plain; charset=utf-8 为 Content-Type: text/javascript; charset=utf-8

成功弹框

Medium

渗透思路

攻击失败后控制台给了提示

本次响应头返回的 CSP 策略

CSP 内联资源

http头信息中的script-src的合法来源发生了变化,他没有使用信任网站而是两个内联

unsafe-inline,允许使用内联资源,如内联< script>元素,javascript:URL,内联事件处理程序(如onclick)和内联< style>元素。必须包括单引号。

nonce-source,仅允许特定的内联脚本块,nonce=“TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA”

意思是只能使用script元素且脚本块值nonce值为TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA

参考文章

「网络」CSP和Nonce - 掘金

DVWA-CSP Bypass详解_Mr H的博客-CSDN博客

构造内联属性绕过

<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert('1')</script>

源码对比

Low & Medium 源码

对比小结

Medium 和 Low 相比,http头信息中的script-src的合法来源发生了变化,没有在使用白名单列表,而是采用了具有 nonce 属性的内联 JS 限制

High

渗透思路

这次是通过 JSONP 实现资源请求,CSP 策略为 Content-Security-Policy script-src 'self';

JSONP 接口为 http://www.dvwa.com/vulnerabilities/csp/source/jsonp.php?callback=solveSum

源码分析可知 jsonp.php 在接收到 callback 参数后会直接返回响应内容,其中也包含了 callback 参数

high.php 源码分析发现 POST 请求接受 include 参数,并将其作为页面内容

JSONP 参数绕过

所以我们可以尝试利用 include 参数修改请求 JSONP 的 callback 参数内容,然后写入到页面里

<script src=source/jsonp.php?callback=alert(document.cookie)></script>

成功触发 XSS

源码对比

Medium & High 源码

对比小结

与 Medium 相比,High 在页面上限制了用户输入,只留一个按钮,但是仍可以通过 burp 修改 JSONP 请求参数实现 XSS 漏洞攻击

Impossible

源码对比

High & Impossible

对比小结

High 和 Impossible 在页面源码上没有太大区别,防护措施主要在 jsonp 接口,Impossible 直接将 callback 参数写死为 solveSum,所以也就无法像之前那样修改利用了

绕过

  1. location.href绕过
  2. link标签预加载导致的绕过
  3. meta网页跳转绕过
  4. iframe绕过
  5. CDN绕过
  6. 站点可控静态资源绕过
  7. 不完整script标签绕过
  8. 不完整的资源标签获取资源
  9. 302(重定向)绕过

防御

CSP 对前端攻击的防御主要有两个

  1. 限制 js 的执行。
  2. 限制对不可信域的请求。

参考文章

绕过内容安全策略总结 - 信安之路

CSP浅析与绕过 - FreeBuf网络安全行业门户

CSP内容安全策略及绕过思路 | Sing1e-D0g的笔记

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DVWA(Damn Vulnerable Web Application)进行SQL注入和盲注攻击是为了演示和学习安全性问题,需要在合法授权和合规的环境下进行。以下是一个简单的POC(Proof of Concept)来对DVWA进行SQL注入和盲注攻击: 1. SQL注入攻击: ```python import requests # 设置目标URL和payload target_url = "http://dvwa.com/vulnerabilities/sqli/?id=" payload = "' OR '1'='1'-- " # 发送注入请求 response = requests.get(target_url + payload) # 判断注入是否成功 if "User ID exists in the database." in response.text: print("SQL注入成功!") else: print("SQL注入失败!") ``` 在上述代码中,我们构造了一个payload,其中使用了SQL注入的技巧,目的是绕过原始查询条件,使查询结果始终为真。然后,我们使用requests库发送带有payload的GET请求到目标URL。最后,根据返回的响应内容来判断注入是否成功。 2. 盲注攻击: ```python import requests # 设置目标URL和payload target_url = "http://dvwa.com/vulnerabilities/sqli_blind/" payload = "' OR substring((SELECT database()), 1, 1)='d'-- " # 发送盲注请求 response = requests.get(target_url + "?id=" + payload) # 判断盲注是否成功 if "User ID exists in the database." in response.text: print("盲注成功!") else: print("盲注失败!") ``` 在上述代码中,我们构造了一个payload,其中使用了盲注的技巧,通过逐个查询数据库名称的字符,并通过判断响应内容来确定字符是否正确。然后,我们使用requests库发送带有payload的GET请求到目标URL。最后,根据返回的响应内容来判断盲注是否成功。 请注意,以上代码仅用于演示和学习目的,不得用于非法用途。在实际环境中进行安全测试时,请遵循合法和合规的规定,并获得合适的授权。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值