我做XSS challenges就是为了熟悉加深一下XSS漏洞类型的印象,自己做一点总结,新手上路,有问题还望师傅们斧正

Stage #1(没有过滤的XSS)

随便在文本框输入一点内容,发现它会直接将输入的文本输出到网页上显示,查看网页元素,发现是b标签

两种思路:

1.闭合b标签,如图

2.它会直接将输入的字符串输出在网页上显示,可以考虑直接输入JS代码,如图

Stage #2(属性标签中的XSS)

还是随便输点东西上去,查看网页元素,发现文本在属性标签value里面

两种思路

1.闭合input标签

2.闭合value标签,利用on事件触发XSS

javascript on事件大全参考链接https://www.w3school.com.cn/jsref/jsref_events.asp

这里采用onmouseover事件,意思就是当鼠标指针移动到那上面的时候执行事件

Stage #3(选择列表中的XSS)

发现是一个b标签闭合的情况,采用Stage #1的两种方法都不行,所以可以输入的文本框不存在XSS,考虑旁边那个选择国家的列表,因为选择菜单里面无法自己更改,所以试试burp抓包

因为查看元素国家是b标签闭合,所以可以考虑直接将Japan改成一段JS代码

Fowward成功

Stage #4(参数中的XSS)

补充知识:

HTML表单隐藏参数:隐藏域是用来收集或发送信息的不可见元素,对于网页上的访问者来说,隐藏域是看不见的。当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上

和Stage #3一样先直接burp抓包,发现多了个参数叫hackme……..

验证前面两个参数发现不存在XSS,考虑这个隐藏的参数,查看网页元素,发现hackme参数是value标签闭合

两种方法:

1.采用闭合input标签方法,成功

2.这种隐藏的可以使用svg来执行XSS,svg后面加事件(直接使用事件不行)

这里最合适的on事件是onload事件,即当加载的时候执行JS代码,这样能成功

Stage #5(限制长度的XSS)

一样先随便输入点东西,发现是value标签闭合,采用闭合input标签的方法,但是发现输入长度被限制

将maxlength改大点就行

Stage #6(html事件中的XSS)

查看元素发现是value标签闭合,先采用闭合input标签,发现<和>被转义

再试试用on事件,成功

Stage #7(空格分隔属性中的XSS)

这道题发现是value闭合的情况,文本框里面输入的全部存放在value标签里面,先采用闭合input标签的方法

发现>是多余的,于是删除改为空格,发现<>都被转义

试一试on事件,使用代码1111" onmouseover="document.domain"

简单修改,删掉1111后面的"alert(document.domain)被两对双引号包围,于是删掉一对,成功触发XSS

Stage #8(javascript伪协议触发XSS)

这道题利用javascript伪协议在a标签中的利用

Stage #9(利用utf-7编码)

这道题没啥用,现在都几乎删除了utf-7编码

直接给答案

Stage #10(绕过过滤domain为空的XSS)

查看元素发现是value闭合内容,试试闭合input标签,查看元素

发现domain被吃掉了,这里有两种方法绕过

1.双写domain绕过

domain写成dodomainmain

2.base64编码绕过

alert(document.domain)进行base64编码为YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ==

然后用

Stage #11(绕过替换script和on事件的XSS)

发现是value闭合内容,先试试闭合input标签,script全被替换成了xscript导致JS代码无法执行

再试试on事件,发现所有on事件都被替换成了onxxx

考虑使用javascript伪协议,发现javascript被替换成了javaxscript

绕过方法:

1.在javascript中的script中插入不可见字符&#09;(因为是替换script为xscript)

2.将javascript中的script中的任一字符进行unicode编码

Stage #12(利用IE浏览器绕过XSS过滤)

IE浏览器特性:两个`(反引号)能够闭合一个”(双引号)

这道题是value闭合输入的内容,先考虑使用闭合input标签,发现<>被过滤,前面的双引号也被过滤无法闭合

试一下用IE浏览器使用on事件

Stage #13(利用CSS特性绕过)

需在ie浏览器下,构造payload:cssbackground-color:#f00;background:url(“javascript:alert(document.domain);”);

但是我ie浏览器版本高了,所以不行,换用低版本ie浏览器就行

Stage #14(CSS绕过)

绕过对expression的过滤:使用注释绕过ex/**/pression

我IE版本高了,构造payload:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})

Stage #15(16进制绕过)

先随便输入字符串,发现上面是value标签闭合,尝试闭合input标签,文本框里面都被双引号包含,下面黑框里面JS代码中的<>都被转义

尝试用了unicode编码绕过发现还是不是,尝试使用16进制绕过,这里存在一个知识点,怎样使用JS代码能够识别的16进制

其实比较简单,网上有在线字符串转16进制,比如<的16进制是3c,前面加上\x就是,也就是\x3c是JS能够识别的,我们来试一试,在文本框里面输入\x3c发现小黑框出现x3c,\不见了,再试试\x3c,发现小黑框出现<

按照这种方法就可以使用16进制替换<>,还是使用闭合input标签

附上用cmd中python转换字符串为JS可识别的16进制方法

Stage #16(unicode绕过)

和15差不多,用到15进制绕过发现不行,尝试使用unicode绕过

附上用cmd中python转换字符串为JS可识别的unicode方法

还是和15一样的操作