XSS-labs(1-10)闯关详解

XSS-labs(1-10)闯关详解

  • XSS漏洞简述
  • 第一关
  • 第二关
  • 第三关
  • 第四关
  • 第五关
  • 第六关
  • 第七关
  • 第八关
  • 第九关
  • 第十关

XSS漏洞简述

攻击原理
跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,
当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,
从而达到恶意攻击用户的目的。

一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;

XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。

漏洞原因
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。

如何防御
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

第一关

打开xss-labs,点击图片,进入第一关
XSS-labs(1-10)闯关详解_第1张图片
XSS-labs(1-10)闯关详解_第2张图片
进入第一关后我们发现更改name的参数会改变页面上显示的值,显示内容是在html标签之间,所以采用标签注入。
XSS-labs(1-10)闯关详解_第3张图片

所以这明显是get类型传参数,直接在name后尝试书写恶意代码

XSS-labs(1-10)闯关详解_第4张图片
成功弹窗

查看源码可以看出第一关没有任何防护措施,可以直接将恶意代码写入到标签中。
XSS-labs(1-10)闯关详解_第5张图片

第二关

进入第二关输入aaa依然有回显
XSS-labs(1-10)闯关详解_第6张图片
所以直接继续使用尝试弹窗
XSS-labs(1-10)闯关详解_第7张图片
输入后发现并没有弹窗,查看源码发现我们输入的代码被包裹在value中导致无法弹窗,所以我们需要先把前面的标签闭合。这里有两种方法可以实现弹窗
XSS-labs(1-10)闯关详解_第8张图片
第一种方法是通过闭合标签,然后使用脚本代码,另一种是闭合value属性,然后在input标签内加入事件属性:"onclick="alert(1)>

如图所示,闭合后成功弹窗
XSS-labs(1-10)闯关详解_第9张图片

XSS-labs(1-10)闯关详解_第10张图片
代码审计
XSS-labs(1-10)闯关详解_第11张图片

分析代码我们可以得知
在h2标签中有.htmlspecialchars($str),所以在该地方没有xss注入
但在input标签中,value属性没有过滤,所以有xss注入漏洞,可以直接在input标签这插入恶意代码。

第三关

进入第三关发现和第二关一样是一个输入框,所以继续使用
尝试弹窗
XSS-labs(1-10)闯关详解_第12张图片
输入后发现和上一关一样被包含在input标签中,继续闭合
尝试闭合发现还是没有弹窗但是前段代码显示闭合
XSS-labs(1-10)闯关详解_第13张图片
右键查看源代码,发现我们输入的 >,<,"符号都被转义成实体编码,但html在运行代码会自动将实体编码转换,所以我们之前查看的闭合代码是已经转义后的。
XSS-labs(1-10)闯关详解_第14张图片
既然这一关尖括号不能使用了,那就尝试使用上一关的input的事件属性。
' onclick='alert(11)'
XSS-labs(1-10)闯关详解_第15张图片
我们发现双引号不能用来闭合了,但是单引号没有过滤,所以我们可以使用单引号来闭合标签。成功弹窗

代码审计
XSS-labs(1-10)闯关详解_第16张图片
查看代码发现,这一关对input标签也使用了过滤函数.htmlspecialchars
查看官方文档可以知道,.htmlspecialchars可以对以下几种符号进行转义
XSS-labs(1-10)闯关详解_第17张图片
正常说单引号也会被函数过滤,但是为什么我们这里可以用单引号进行闭合呢。原因是.htmlspecialchars函数中的第二个参数默认值仅编码双引号,而本关代码只使用了一个参数,所以导致我们可以使用单引号对标签进行闭合。
XSS-labs(1-10)闯关详解_第18张图片

第四关

进入第四关后,输入后发现我们的尖括号被过滤了。
XSS-labs(1-10)闯关详解_第19张图片
因为看value值后用的是双引号,所以直接尝试使用和" onclick="alert(1)"方法
XSS-labs(1-10)闯关详解_第20张图片
成功弹窗

代码审计
XSS-labs(1-10)闯关详解_第21张图片

根据源码可以看出它用替换函数将尖括号直接替换为空,所以可以直接使用input标签中的方法进行弹窗。

第五关

进入第五关后,继续输入测试代码
XSS-labs(1-10)闯关详解_第22张图片
发现输入的代码被添加了一个_,但是还是在input标签中,继续尝试onclick="alert(1)
XSS-labs(1-10)闯关详解_第23张图片
发现也被添加了一个_,所以这两个方法无法使用了,需要尝试其他不带有script和on两个单词的标签

例如">,你可以会疑问这里也有script这个单词,但为什么没有被过滤,我将在下面代码审计中进行解答。

点击图片成功弹窗
XSS-labs(1-10)闯关详解_第24张图片
代码审计
XSS-labs(1-10)闯关详解_第25张图片
查看代码我们可以发现本关使用替换函数str_replace""on"进行了转换添加_所以这就是为啥我们使用a标签时没有被过滤。使用转换小写函数strtolower将输入的数据转换为小写。本关考虑了标签、及事件的转换,但是没有考虑完整。

第六关

进入第六关,依旧用" 进行测试
XSS-labs(1-10)闯关详解_第26张图片
发现和上一关一样,script被替换添加了一个_
XSS-labs(1-10)闯关详解_第27张图片
继续尝试"onclick="alert(1)发现也是和上一关一样。
XSS-labs(1-10)闯关详解_第28张图片
那就直接使用a标签进行尝试
XSS-labs(1-10)闯关详解_第29张图片
但是我们发现a标签也被添加替换了
那我们再尝试一下更改大小写看看能否成功。
XSS-labs(1-10)闯关详解_第30张图片
发现修改大小写后,成功弹窗。

代码审计
XSS-labs(1-10)闯关详解_第31张图片
通过查看代码我们可以发现本关替换了很多的关键词,但是没有使用上一关的将输入数据转换为小写的strtolower函数,所以导致我们通过大写的方式来输入恶意代码。

第七关

进入第七关输入alert(1)后,发现script这个单词直接被过滤掉了
XSS-labs(1-10)闯关详解_第32张图片
尝试onclick='alert(1)发现on也被过滤掉了
XSS-labs(1-10)闯关详解_第33张图片
尝试使用>XSS-labs(1-10)闯关详解_第34张图片
既然他每次都将我们输入的字符直接过滤所以我们可以尝试通过双写的形式进行拼接。
例如:">alert(1)" oonnclick="alert(1)"

XSS-labs(1-10)闯关详解_第35张图片
成功弹窗

代码审计
XSS-labs(1-10)闯关详解_第36张图片
通过查看可以知道本关与上一关的不同,在于转换后的内容不同,虽然添加了大小写转换,但是因为转换后,字符被转换为空字符,所以转换后的字符如何仍可以组合成,那么就可以绕过该防御机制。

第八关

进入第八关后,发现无法构造闭合,采用是采用了htmlspecialchars($str)函数,而且闭合方式是双引号,所以input中无法注入,但是在连接里面是有地方可以注入的
XSS-labs(1-10)闯关详解_第37张图片
发现还有一个a标签可以尝试输入,输入后发现被script被过滤了
XSS-labs(1-10)闯关详解_第38张图片
继续尝试大小写和之前的on标签和a标签,发现都被过滤了,暂时也不知道可以用什么标签了,所以这里我们就只能通过修改编码格式进行绕过。
例如:javascript:alert(1)

如果想了解这里为什么能通过编码绕过和还可以通过什么编码进行绕过可以查看这一篇我写的文章 从XSS Payload学习浏览器解码
XSS-labs(1-10)闯关详解_第39张图片
成功弹窗
代码审计
XSS-labs(1-10)闯关详解_第40张图片
发现这一关将大部分标签都进行了替换,也对大小写进行过滤,所以只能通过修改编码格式进行绕过。

第九关

进入第九关后,发现和上一关差不多也是要在a标签里插入代码,但是输入代码后发现他直接提示您的链接不合法?有没有!,不知道具体过滤了什么字符,只能一个一个测试了。
XSS-labs(1-10)闯关详解_第41张图片

因为是要输入连接,最后测试出要在输入框中输入http:// 才不会提示非法
XSS-labs(1-10)闯关详解_第42张图片

所以我们可以直接在http://前面输入我们要插入的恶意代码,最后再用注释将http://注释掉就可以实现弹窗了,具体效果如下。
XSS-labs(1-10)闯关详解_第43张图片
发现有过滤,所以继续使用编码格式绕过
payload为:javascript:alert('http://')
或者javascript:alert(1)//http://
因为这里使用的js的伪协议,所以需要使用js中的注释为//

代码审计
我们发现这一关在上一关的基础上添加了一个判断条件会检查输入的数据中是否会有http://字段,所以需要在输入的字段中加入该字段。

XSS-labs(1-10)闯关详解_第44张图片

第十关

进入第十关后,发现没有输入框了,需要测试在那个标签写入恶意代码
XSS-labs(1-10)闯关详解_第45张图片
检查前端代码发现他将input属性隐藏了
XSS-labs(1-10)闯关详解_第46张图片
先在url框测试
XSS-labs(1-10)闯关详解_第47张图片
发现只有h标签修改了,input标签没有改变,因为input是隐藏的,所以不会触发事件,需要通过其它方法触发。

尝试通过在url框中输入变量名传参数
XSS-labs(1-10)闯关详解_第48张图片
发现第三个参数可以成功传入参数

用双引号闭合,并将type修改为text,文本框出现
XSS-labs(1-10)闯关详解_第49张图片
输入payload:onclick="alert(1)"
XSS-labs(1-10)闯关详解_第50张图片

成功弹窗

代码审计
XSS-labs(1-10)闯关详解_第51张图片
表单参数只接受t_sort,然后输入的参数只过滤尖括号,所以相对简单绕过,只有第三个input才会接收传送给后端的值。

总结:看到表单参数进行尝试输入隐藏的参数获得正确的值。

你可能感兴趣的:(XSS-labs,xss,前端,安全)