xss-labs靶场分析及绕过

  1. level1

源码:

图中框示的为注入点,下同

payload

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

注入结果:

原理:

由于第一关没有做任何的过滤所以直接注入就行

  1. level2

源码:

payload:

keyword=a"><script>alert(1)</script>//

原理:

注入点为form表单,首先先用a">将<input>标签闭合,逃逸出引号,然后执行<script>弹窗语句。//用来注释掉其余的部分。

注入结果:

  1. level3

源码:

分析:

由源码可知这里的注入点依然为form表单,但是这里接收输入语句的$str被.htmlspecialchars函数进行了过滤,

如果要绕过过滤就需要先了解.htmlspecialchars函数的作用。

htmlspecialchars — 将特殊字符转换为 HTML 实体,具体转换情况如下图

则如果依然使用<script>弹窗语句进行弹窗的话“<>”将会被转换,html无法识别语句,导致弹窗失败,所以这里我们需要使用一些没有“<>”的弹窗语句。

payload:

keyword='onclick=alert(1)//

原理:

这里的注入点依旧为form表单 ,首先 ' 是用来和input中的单引号相互闭合,逃逸出单引号,之后执行无”<>“的弹窗语句,//用来注释掉其余的部分。

扩展:

如果在过滤时.htmlspecialchars加上ENT_QUOTES选项的话则无法进行xss注入,因为这里的 ' 也被转换,导致引号无法闭合,无法执行注入语句。

注入结果:

  1. evel4

源码:

分析:

$str2=str_replace(">","",$str);

$str3=str_replace("<","",$str2):

这两句是将输入语句中的”<>“进行了替换,替换为空,从而过滤输入的语句。所以这里我们依旧使用无”<>“的弹窗语句。

payload:

keyword="onclick=alert(1)//

原理:

注入点为from表单,"用来进行引号逃逸,,之后执行无”<>“的弹窗语句,//用来注释掉其余的部分。

执行结果:

  1. level5

源码:

分析:

$str2=str_replace("<script","<scr_ipt",$str);

$str3=str_replace("on","o_n",$str2);

这两句将含有“<script”及“on”的字段进行了替换,替换为“<scr_ipt”及“o_n”,这样就导致了含有<script”及“on”的字段的弹窗语句全部失效,所以我们就要想办法使用不含上述两个字段的弹窗语句。

payload:

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

原理:

这一关的注入点依旧为form表单,首先"用来逃逸出引号,”>“用来闭合前面的”<“方便弹窗语句的执行。之后执行不含<script”及“on”字段的弹窗语句,//用来注释掉其余的部分。

注入结果:

  1. level6

源码:

分析:

这一关依旧做了如蓝框内所示的过滤,使得含有蓝框内字段的过滤语句全部失效,这样基本上就过滤了大部分的弹窗语句。然而本关却未对字母大小写进行过滤,而html是忽略大小写的,故我们可以通过使用大小写的方法来绕过过滤。

payload:

keyword="><Script>alert(1)</Script>//
#这里的S为大写

原理:

这一关的注入点依旧为form表单,首先"用来逃逸出引号,”>“用来闭合前面的”<“方便弹窗语句的执行。然后通过将Script中的S大写进行过滤的绕过,然后执行<Script>的弹窗语句,//用来注释掉其余的部分。

执行结果:

  1. level7

源码:

分析:

这一关依旧做了如蓝框内所示的过滤,但不同的是这次将想要替换的函数都替换成了空,而且还通过strtolower函数将所有输入的语句中的大写转化为小写(大小写也被过滤),然后在进行过滤,但是在替换时他将所有的函数都替换成了空,这是我们就可以通过双写字母来进行注入。

payload:

keyword="oonnclick="alert(1)"//

原理:

由于on被替换为空,则使用双写oonn经过替换后就会变成on,之后组成函数onclick,然后触发弹窗。

注入结果:

  1. level8

源码:

分析:

本关进行的过滤有

  1. 字母大小写过滤

  1. 常见的弹窗函数进行了非空替换。

  1. 还将需要逃逸的双引号进行了替换。

将之前的注入点使用.htmlspecialchars函数进行了过滤,而且由于双引号的替换导致之前的注入点无法形成引号逃逸,故之前的注入点无法再使用。所以我们需要更改注入点。

更改注入点到添加友情链接的位置即下面语句的'.$str7.'处。

 echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';

由于这里的注入点使用了<a>标签那么我们可以直接通过<a href="javascript:alert(1)">aaaa</a>语句进行弹窗注入,而且本关将大部分弹窗语句的函数都进行了过滤,所以这里我们需要进行编码注入。

payload:

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1)

原理:

这里的&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;是将javascript经过html实体编码产生的,这样即绕过了过滤还能通过html解码与前面的语句合并成完整的弹窗语句。

注入结果:

  1. level9

源码:

分析:

level9是在level8的基础上添加了一段链接的判断语句:

if(false===strpos($str7,'http://'))

用于判断链接地址的合法性(即存在http://协议即为合法),则在level8的payload的基础上加上http://协议即可。

payload:

&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1)//http://

原理:

  1. 绕过判断语句,做法:在输入语句中加上http://使链接地址合法

  1. 注释掉http://防止弹窗语句异常。

注入结果:

  1. level10

源码:

分析:

本关做的过滤 将”<>“替换成空,代表使用的弹窗语句不要带”<>“

本关与之前关的不同点,本关通过form表单的hidden属性将表单在网页上的用户输入框进行了隐藏,隐藏只是在网页页面上不显示输入框,但是虽然隐藏了,还是具有form传值功能。一般用来传值,而不必让用户看到。所以我们需要在网页上寻找注入点。

10.1寻找注入点

将t_link中的hidden属性删除后就可以看到网页上用户的输入框,我们在输入框中随便输入一些值,查看是否能注入到代码中。

测试注入结果:

注入失败

使用同样的方法分别对t_history和t_sort进行注入结果

t_sort的注入成功,其实直接看源码完全明白注入点在哪,不过对于一个陌生的场景寻找漏洞也是注入的一部分。现在我们知道了过滤的东西以及注入点,可以开始进行注入。

payload:

"onkeydown="alert(1)"type="text

原理:

首先 " 用于逃逸出引号限制,使用无“<>”的弹窗语句,用type="text将type="hidden"覆盖掉,使网页上出现输入框,方便于注入。

  1. level11

源码:

分析:

本关做的过滤: 将”<>“替换成空,代表使用的弹窗语句不要带”<>“

本关的注入点:从源码来看注入点有两个,一个为name="t_sort"的语句字段,另一个为name="t_ref"的语句字段,我们分别进行测试注入。

使用level10的方法进行一次测试,发现name="t_sort"的语句字段可以进行注入,只不过是使用了.htmlspecialchars函数进行了过滤而已,而且此函数所做的过滤与蓝框中的语句所做的过滤相似,都只是对”<>“产生的过滤,所以我们只需要使用无”<>“的弹窗语句就能注入成功。

测试注入:

"onkeydown="alert(1)"type="text

注入结果:

弹窗失败

失败分析:

由上图可知弹窗语句确实已经注入到html中,但是html却没有执行,这是为什么呢?

再次查看源码可知

<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">

注入点的函数形式为:value="'.htmlspecialchars($str00).'",由于.htmlspecialchars($str00).是以"''"

的形式进行标注的,由于 '' 的作用将引号内的字符转换成整型值(该字符的ASCII值),当弹窗语句被.htmlspecialchars($str00).函数以单引号的形式进行调用时,外表看还是一条语句,实际上到双引号层时已经成为一个整体了,无法再被执行。

更改注入点重新注入:

测试注入时name="t_ref"字段弹出了网页的Referer值

可见新的注入点中存放的为网页的Referer值,这里我们可以通过更改网页的Referer值为弹窗语句进行弹窗。

这里需要用到burp suite进行抓包,放包操作。

如图抓到了此关的包并修改其的Referer值改为弹窗语句,然后放包

payload:

Referer: "onkeydown="alert(1)"type="text

注入结果:

成功修改Referer值,弹窗成功

  1. level12

源码:

分析:

过滤方法与level11相同

注入点也基本相同通过测试注入及HTML解码得知第二注入点为user-agent的属性如下图:

继续通过burp suite来更改网页参数,并对user-agent的值增加弹窗语句的修改后放包

payload:

User-Agent:"onkeydown="alert(1)"type="text"

注入结果:

成功增加了user-agent弹窗语句值,弹窗成功

  1. level13

源码:

分析:

本关所做的过滤与level11相同

注入点也基本相同,通过测试注入及HTML解码得知第二注入点的属性如下图:

这里可以看到这里的注入信息为“call me maybe”,现在仅通过html网页信息我们并不知道这里的“call me maybe”是什么属性,不过通过查看发现这段信息与网站的cookie值相同,所以判断这一信息为网站的cookie值如下图:

所以我们的注入思路就是将网址的cookie更改为不含“<>”的弹窗语句

payload:

"onkeydown="alert(1)"type="text

进行cookie的修改

注入结果:

将cookie的值修改为弹窗语句,弹窗成功

分享弹窗语句

<script>alert(1)</script>
<a href="javascript:alert(1)">aaaa</a>
<img src=1 onerror="alert(1)">
<svg onload="alert(1)">  //onerror    当加载文档或图像时发生某个错误
<iframe src="javascript:alert(1)"></iframe>
<iframe onload="alert(1)"></iframe>

无<>的弹窗语句
onclick="alert(1)"     //鼠标单击事件
onmouseover="alert(1)" //鼠标悬浮事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值