内容安全策略(Content Security Policy,CSP)
这篇讲CSP讲得很好:
Content Security Policy 入门教程 - 阮一峰的网络日志
是一种Web安全标准,旨在减轻跨站脚本(XSS)等Web应用程序安全漏洞的风险。以下是有关CSP的概念、攻击原理以及其他相关知识点:
概念:
-
CSP是什么:CSP是一种安全政策,它是一组规则,指定哪些资源可以加载到Web页面中。这些规则以HTTP标头的形式发送到浏览器,浏览器根据这些规则来限制哪些内容可以被执行或加载。
-
资源控制:CSP允许网站管理员明确定义哪些域名上的资源可以被加载和执行,包括JavaScript、样式表、图片、字体等。
-
减轻XSS风险:CSP的主要目标是减轻XSS攻击风险。它通过限制执行恶意脚本的能力,帮助防止XSS攻击的成功。
攻击原理:
-
XSS攻击:XSS攻击者通常试图在网站上注入恶意脚本,这些脚本在用户的浏览器上执行。攻击者可能将恶意脚本嵌入到网站的输入字段、评论、博客文章等地方。
-
CSP的作用:当网站实施了CSP,浏览器将根据CSP规则来决定是否执行或加载特定的脚本。如果恶意脚本的来源不在CSP规则允许的范围内,浏览器将拒绝执行该脚本,从而减轻了XSS攻击的威胁。
-
违反CSP:如果攻击者的恶意脚本违反了CSP规则,浏览器通常会在控制台中记录错误,或者在页面上显示有关CSP违规的报告。
其他相关知识点:
-
CSP规则:CSP规则是通过HTTP标头(通常是
Content-Security-Policy
)传递到浏览器的。规则可以包括允许的资源域名、允许的脚本来源、不允许的脚本执行等。 -
CSP报告:CSP可以配置为生成报告,以便网站管理员了解哪些CSP违规发生了。这些报告可用于识别潜在的安全问题。
-
CSP指令:CSP规则可以包括多个指令,每个指令用于定义相应类型资源的加载规则。
-
default-src 指令:指定默认情况下允许加载的资源来源。
script-src 指令:用于限制可执行脚本的来源。
style-src 指令:用于限制可应用的样式表的来源。
img-src 指令:用于限制可加载的图像的来源。
connect-src 指令:用于限制可建立网络连接的来源。
font-src 指令:用于限制可加载的字体文件的来源。
frame-src 指令:用于限制可以嵌入页面的框架的来源。
report-uri 指令:指定将安全违规报告发送到的 URL。
DVWA
LOW
script-src 指令:用于限制可执行脚本的来源。
在CSP的规则中,'self'
表示当前网站的源。当使用'self'
作为脚本来源时,只有同源的脚本才会被加载和执行。
相当于设置白名单,只有圈出来的这些才可以执行js代码
我们可以先用白名单里的这个网站尝试 https://pastebin.com
直接点create new paste创建新帖,然后点raw,复制网址
在DVWA输入URL,但是我输入后没有弹窗,据说是因为这个网站是米国的,也不知道对不对
MEDIUM
源码分析
-
内联(Inline):
-
概念:内联是指直接在HTML文档中嵌入脚本、样式或事件处理程序的代码。内联脚本可以在HTML标记中使用
<script>
标签或事件处理程序属性中定义,而内联样式可以通过<style>
标签或style
属性定义。 -
CSP策略:CSP允许网站管理员控制内联脚本和样式的执行
-
-
unsafe-inline:
-
概念:
unsafe-inline
是CSP指令之一,它允许内联脚本和内联样式的执行。如果CSP策略包括unsafe-inline
,浏览器将允许网页中的内联脚本和样式执行。
-
-
nonce-source:
-
概念:
nonce-source
是CSP指令之一,它允许网站管理员为每个内联脚本和样式生成一个随机值(称为 nonce)。这个 nonce 值需要与script-src
和style-src
指令中的值匹配,以允许特定 nonce 值的内联脚本和样式执行。 -
原理:
nonce
是一个仅一次有效的随机值,与内联脚本或样式的nonce
属性一起使用。如果内联资源的nonce
值与CSP策略中的nonce-source
匹配,那么浏览器将允许执行这些内联资源。 -
安全性:
nonce
提供了一层额外的安全性,因为即使内联资源的来源受到攻击,攻击者仍无法注入自己的脚本或样式,因为它们的nonce
值不匹配。 -
nonce
的生成:nonce
是随机生成的字符串,通常在每个页面加载时都会生成一个新的nonce
值。这个值可以是包含字母、数字和特殊字符的随机字符串,类似于密钥。
-
总之,nonce
是 CSP 中的一种安全机制,用于确保只有在内联脚本和样式的 nonce
值与 CSP 策略中指定的 nonce-source
匹配时才能执行。
意思是只能使用script元素且脚本块值nonce值为...
步骤
构造一个标签<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert('ccc')</script>
HIGH
源码包含一个PHP文件和一个JS文件
看不懂,,,,
首先,在文件 high.php 中设置了一个 CSP 头部,规定只允许从同一源的脚本加载,即 script-src 'self'。这样可以防止恶意代码的注入。然后,通过 PHP 的 header 函数将 CSP 头部发送给浏览器。
接下来,在表单提交时,如果存在名为 include 的 POST 参数,将其作为代码包含在页面主体中。
点击按钮时,会执行 JavaScript 函数 clickButton,该函数动态创建一个 script 元素,并设置其 src 属性为 source/jsonp.php?callback=solveSum。这里使用了 JSONP(JSON with Padding)技术,通过指定回调函数名称的方式来获取跨域的数据。当脚本加载完成后,会调用函数 solveSum,将返回的数据展示在页面上。
在文件 high.js 中定义了 clickButton 函数用于创建 script 元素并加载跨域脚本,以及 solveSum 函数用于处理返回的数据。最后,通过事件监听,当按钮被点击时,调用 clickButton 函数。
简单来说
当点击按钮后,以下步骤会依次发生:首先,浏览器会执行 JavaScript 函数 clickButton。
在 clickButton 函数中,会动态创建一个 <script> 元素。
<script> 元素的 src 属性被设置为 source/jsonp.php?callback=solveSum,其中 source/jsonp.php 是一个远程脚本的 URL,callback=solveSum 指定了回调函数的名称为 solveSum。
浏览器会开始加载指定的远程脚本文件 source/jsonp.php。
当远程脚本文件加载完成后,返回的数据会通过回调函数 solveSum 进行处理。
在 solveSum 函数中,返回的数据会被展示在页面上。
————————————————
版权声明:本文为CSDN博主「秋说」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2301_77485708/article/details/131225715
所以我们可以尝试利用 include 参数修改请求 JSONP 的 callback 参数内容,然后写入到页面里
<script src=source/jsonp.php?callback=alert(document.cookie)></script>
还有一种方法,用brup抓包修改callback参数