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
和第十七关一样
文章详细描述了一次XSS攻击的过程,从get请求中的payload注入,到利用不同标签和事件绕过服务器过滤,再到AngularJS的ng-include特性利用,展示了攻击者如何逐步突破安全防护并成功注入脚本。

1473

被折叠的 条评论
为什么被折叠?



