以下来自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的话,先选择调试程序,然后在右上方搜索框搜索即可。
(暂时知道那么多,还有什么补充的以后再更)
Stage #1
这一道题发现我们写入的内容直接没有任何过滤,嵌套在一个<b>标签里面,我们常规闭合标签新建标签即可。
(发现好像不用闭合<b>标签,直接让<script>标签嵌套在<b>标签里面也可以。)
Stage #2
这一题的注入点是在一个input标签的value属性那里,我们前后闭合input标签然后在中间加上script就好了。
Stage #3
这一道题我们的注入点也是在<b>标签里面,唯一的不同是用于标签构造的<>被转义了,用于匹配掉双引号的双引号也被转义了,所以我们要另外想方法。
我们注意到提交的参数并不只有输入框中的内容,还有country,也就是数据包中的p2
所以抓包,改包,发包,成功。
查找,我们可以看到我们注入的标签无任何过滤插入到了<b>标签上。
Stage #?(和XSS challengs无关)
做着做着突然想到一个奇怪的点,XSS漏洞可以分为三类:存储型,反射型,DOM型;我们在弹窗这类网站上面做的题可以看做是:通过提交一系列字符串,使页面弹窗。那么我们不由得想到,这些题目属于什么类型的XSS呢?
存储型相当于留言板,hacker在留言板写入代码,提交的字符串上传到了服务器,当别人访问这个留言板时就会触发代码;
反射型是在无害url的基础上构造特殊的url,在url上给注入点get特殊的字符串,当别人点击构造的链接时触发恶意代码;
DOM型和反射型几乎一样,只不过url上不是get参数,而是取#即锚后面的内容当做代码。
总的来说,想要利用XSS主要是找到两个方面1.找到可以被控制的参数 2.绕过过滤构造语句,使得注入参数的值被当做代码执行3.使得被害者(这里是我们自己)与服务器交互,执行恶意代码。
我们练习的题目刚好训练了前两点。想弹窗其实很简单,在firebug里可以把任何标签内的内容或标签的属性改成你想要的内容,如:<script>alert(document.domain)</script>,onclick=alert(document.domain)
但这样做的话只是让自己中了XSS,没有办法让被害人与服务器交互(能不能给服务器上传代码?不行!能不能构造get参数的url?也不行!)。XSS challengs的设计者应该考虑到了这点,若是这样造成的弹窗将不能过关。
Stage #4
这里依然是先抓包,发现有个hackme....
然后我们在网页上搜下hackme,发现在这里
我们构造响应的参数,直接提交,发现直接就过了。
Stage #5
与Stage#2几乎一样,也是value参数,唯一的不同点是在前端限制了输入的长度,我们直接用bp抓包提交就好了。
Stage #6
与Stage#2几乎一样,也是value参数,唯一不同的是过滤了<>,但没有过滤"(可以闭合前面的属性),这样我们就不可以用新的标签了,但我们可以在<input>标签里面加新的属性,如 " onmouseover=alert(document.domain) name="1类似这样的,onmouseover是把鼠标放在上面就执行的on时间,onclick之类的也是可以的。
Stage #7
这道题也是value出问题,但除了<>,这道题把"也过滤了,本来以为这样就不能把独立的属性分隔出来,但我无意中打的一段竟然成功触发了alert
后来看了别人的WP才学习到了~~并不是转以后的双引号起了分隔作用,而是双引号后面的空格,空格也可以分隔属性(记住要在空格前面随便加点什么,否则bp提包的时候会自动将空格省略)
Stage #8
题目是输入一条url,然后后台把它包在一个<a>标签里,我们需要点击超链接然后弹窗。
我们百度怎么在url中执行js,学到可以构造javascript:alert(document.domain),然后点击超链接,点击过关。
Stage #9
这道题卡住了,弄的我脑壳疼。。最后还是没明白
先在网页输入,发现尽管什么都没有被过滤,但<script>标签仍然没有逃出来??
抓包试试,发现一个参数charset=euc-jp,百度发现euc-jp是日文编码,我想到把它改回utf-8国际编码试试。仍然不行。。。
大佬WP:
1.用可以识别UTF-7的IE浏览器
2.把抓包内容改成p1=1%2bACI- onmouseover=%2bACI-alert(document.domain)%2bADsAIg- x=%2bACI-&charset=UTF-7
意思是我们提交UTF-7编码的py上去,然后浏览器UTF-7解码出利用py~~(我觉得出题者简直闲的蛋疼,不说现在没有利用utf-7的ie了,哪有什么网页的后台是只能解码utf-7的)
这道题我们只能用firebug的编辑功能过。(每一道题都可以)
Stage #10
这个也是value注入点,直接在网页提交发现,题目丧心病狂把domain过滤掉了。
上网找了下document.domain的等效DOM发现没有,突然想到是不是只匹配了一次,故嵌套
"><script>alert(document.domdomainain)</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进行分割,让正则匹配不到)
后来想到href后面是url,也试了下url编码%72,发现在f12上查看没有被渲染(因为没有被当做url使用所以不奇怪),点击之后发现%72发生作用时变成了r,但却没有触发弹窗??这里不是很明白,先埋个坑,理解了回来再更。
做这道题又把unicode,utf-8,url编码,html实体等看了一遍,发现它们英文部分有很多相同之处,比如都可以表示为ascii的十、十六进制,只要加不同前缀就好了。
Stage #12
照常尝试,还是value值,过滤了<>和",想用编码能不能绕过(因为过滤了<>",HTML实体是不行的,html实体不能让内容逃出来),试了各种编码实在没办法了,看了大佬WP发现这是一个ie浏览器识别特性,ie浏览器会把 ` `(笔记本1左边那颗键两次)识别为双引号,从而让我们的内容逃出来(<>没法逃就设置属性),构造payload。
Stage #13
照常转义了<>和",F12发现相比以往的题这道题多了一个style属性,那肯定就是从这里入手了。
百度style XSS,搜到一个知识点叫“行内样式的动态特性”(就是在ie下能在css中执行js代码)
我在ie下试了很久都不能复现,又百度,发现还有一种利用方法 background:url(javascript:alert('xss'));
还是不能复现,只能归结为ie版本太高的问题了。
Stage #14
和Stage #13几乎一样,不同的是转移了了script和expression,想用&#num;的形式实体一下其中的字母,但发现&号也被转移了mmp,然后试了下/**/应该也是可以的,可惜不能复现。从大佬的WP上有学来集中绕过方法。
(1)能绕WAF的不止html实体,unicode编码也行如e -> \0065 ,\u0065 ;\0065xpression(这道题过滤了反斜杠,反斜杠零)
(2)在expression中加反斜杠分隔 ;ex\pression(不行,理由同上)
(3)在expression中加注释符/**/分隔;ex/**/pression 通过
(4)在expression中加反斜杠零分隔; ex\0pression 通过
Stage #15
随便试了下,照常转义<>,",也转义了&,过滤了\让我们不能构造html实体,和unicode编码。~~等等!
\是过滤了,不是转义了阿!我们试试输入两个\,发现只过滤了一个!
那就直接unicode就行了(就是\\003c和\\003e代替<>换成十六进制编码也就是\\x3c,\\x3e也是可以的)
Stage #16
看到又有document.write,试了试上题的利用代码,直接过了......看了下hint,发现是替换了\x,那与上题唯一的区别就是十六进制编码不能用了。ps:还有一种编码格式是八进制编码?payload如下:\\74img src=x onerror=alert(document.domain)\\76
学到一个知识点叫 HTML和javascript的自解码机制
Stage #17
题目说了只能在老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
最高位变1?不明所以不写。
Stage #19
没有任何输入点,抓包没发现任何东西....hint 2014年九月24在推特上的DOMXSS?百度没发现任何东西,大佬WP也到这里没了。。。还是太菜,XSS challengs就先做到这里吧,以后涨知识了再继续做。