XSS
xss.haozi.me 也不记得是从哪里知道了这个用于做xss的简单网站。整体上各种绕过方法还是值得去总结一下的。正好自己javascript也就学了点浅显的,以此为契机深入一下
目标是alert(1)
0x00
先看源码
0x00源码里并没有什么特殊过滤的措施,所以知道xss的原理就可以直接上payload
0x00payload0x01
0x01这里的不同之处就在于<textarea>标签,其实也没有什么特别之处。就是如果按照上面的思路来构造payload,出来的内容就在textarea表示的文本框中。因此先闭合textarea即可。
0x01payload0x02
0x02这种形式的xss构造实话说在做完题后又在各种web安全书籍中关于xss的例子中见到:直接给value一个空值,闭合input。后面就一样了。
0x02payload0x03
0x03从这道题开始,有了一些绕过的限制。比如这里是把括号()换成空字符。(正好了解了js里的字符串替换用到的正则格式/[ ]/g , /[ ]/是标准格式,其中g表示全局匹配)
因此alert(1)就用不上了,,,但是还有这样的一个方法:利用模板字符串,也就是可以嵌入表达式的字符串。用反引号``替代普通字符串的单引号与双引号。模版字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串,这被称为“标签模板”功能。
所以:
0x03payload0x04
0x04于是做完0x03,0x04马上就把``给过滤了。。。
后来去看writeup时,发现<svg>标签可以表示实体字符,所以查了下括号的实体字符,分别为(;,);payload如下
0x04payload0x05
0x05这个的限制也很有意思,把注释的-->闭合符号换成笑脸。
但其实,html注释的闭合还有一种(这真的是考基本功啊), 就是采用<!-- --!>的对称式注释方法。因此payload就显而易见了。
0x05payload0x06
0x06这里是过滤掉以auto开头或者on开头,=等号结尾的标签属性并替换成_,且忽略大小写,所以常规的标签闭合都不能用了。
乍一看感觉已经无解了啊。但是其实,on.*这个正则表达式中的小数点限定只匹配除换行符以外的其他字符。那么这里就可以用换行来绕过了。这样一来,正则不会匹配,即使它是on开头且有等号。
具体使用input里哪个属性,好像有多种方法,网上大部分wp都用的是onmousemove=alert(1),不过我自己试的时候并没有成功。所以用的是onerror属性
0x06payload0x07
0x07这里的正则匹配了<开头>结尾的标签字符串,且忽略了大小写。
其实可以用浏览器的容错性,少一个>并不影响。
0x07payload0x08
0x08此处能将</style>标签给换成稀奇古怪的一堆字符,也是为了防止我们闭合。
但是换行依旧有效!此处也只用换个行就可以解决正则匹配的问题。
0x08payload0x09
0x09这里的第一个要求是input内容必须以上面的网址开头,所以先写出网址后,考虑在script标签中注入。这里先闭合掉前面含有网址的sciprt后,加上alert(1)内容,后面还有</script>未匹配,因此考虑直接注释掉。
0x09payload0x0B
0x0B转大写的解决方法其实很简单,就是利用实体编码绕过
0x0Bpayload0x0D
0x0D正则匹配<,/,",'这四个符号,并且替换为空,但是输入点是在//注释后。
所以用换行来躲单行注释,同时为了处理单引号,用html注释闭合。
0x0Dpayload0x0F
0x0F这里将一些特殊字符编码处理了,但是这里的xss点在img标签中,看起好像没办法闭合了,但是这里的位置是在onerror属性中,所以我们可以闭合前面部分的代码,引出我们要的xsspayload,并且注释掉后面部分的代码。
0x0Fpayload0x10
0x10这道很简单,直接alert(1)都可以,就不贴payload了
0x11
0x11转换了一些字符,但是可以注意到双引号"转换成\"正好将\引入在内。因此面对/变为\/\/就可以直接构造payload
0x12
0x12由于输入点在script标签外,则不能考虑html实体编码
与上题颇为相似,双引号变成\\",在实际输出中可以在添一个\来转义掉第一个\绕过
0x12payload由于一些原因,其中几道题因为用到外部js不知为何不能通过,就不写题解了。