xss-labs靶场挑战

目录

环境搭建:

 level1

 level2

level3

 level4

level5

level6

 level7

 level8 

 level9

 level10

level11

 level12

level13

总结:


环境搭建:

Phpstudy软件,将下载好的源码文件放到相应目录下,然后通过浏览器访问即可。

xss-labs靶场的项目地址:GitHub - do0dl3/xss-labs: xss 跨站漏洞平台

 level1

 

 

所以这明显是get类型传参数,直接在name后尝试书写恶意代码
<script>alert(1)</script> <svg/onload=alert(1)>

弹窗成功

level2

进入第二关输入aaa依然有回显

 所以直接继续使用<script>alert(1)</script>尝试弹窗

 输入后发现并没有弹窗,查看源码发现我们输入的代码被包裹在value中导致无法弹窗,所以我们需要先把前面的标签闭合。这里有两种方法可以实现弹窗,第一种方法是通过闭合标签,然后使用脚本代码, "><script>alert('xss')</script>//

另一种是闭合value属性,然后在input标签内加入事件属性:"οnclick="alert(1)

如图所示,闭合后成功弹窗

level3

 进入第三关发现和第二关一样是一个输入框,所以继续使用
<script>alert(1)</script>尝试弹窗

 输入后发现和上一关一样被包含在input标签中,继续闭合,尝试闭合发现还是没有弹窗但是前段代码显示闭合

 f12查看源代码,发现我们输入的 >,<,"符号都被转义成实体编码,但html在运行代码会自动将实体编码转换,所以我们之前查看的闭合代码是已经转义后的。

 既然这一关尖括号不能使用了,那就尝试使用上一关的input的事件属性 ''οnclick=''alert(1)
'onclick='alert(11)'我们发现双引号不能用来闭合了,但是单引号没有过滤,所以我们可以使用单引号来闭合标签。成功弹窗

源代码:

在这里插入图片描述

查看代码发现,这一关对input标签使用了过滤函数.htmlspecialchars  把预定义的字符转换为 HTML 实体,预定义的字符有下面这些

  • & (和号)成为 &
  • " (双引号)成为 "
  • ' (单引号)成为 '
  • < (小于)成为 <
  • > (大于)成为 >

正常说单引号也会被函数过滤,但是为什么我们这里可以用单引号进行闭合呢?这里我们不妨可以想想是不是程序员的水平太菜,没有严格按照要求使用该函数呢,果然我们通过查阅官方文档和查看本关的源码发现,而本关代码该代码只使用了一个参数,没有设置flags这个参数 ,导致第二个参数默认值仅编码双引号。flags参数如下

可用的引号类型:

  • ENT_COMPAT - 默认。仅编码双引号。
  • ENT_QUOTES - 编码双引号和单引号。
  • ENT_NOQUOTES - 不编码任何引号。

 这里还可以通过<input>标签的一些特殊事件来执行js代码 'οnfοcus=javascript:alert('xss') > //

 level4

这一关很明显还是用的get方式传参数,老规矩我们第一步先用弹窗代码测试一下<script>alert('xss')</script>  这里明显可以看到我们输入的> <两个符号被过滤了 

 

  查看网页源码:

在这里插入图片描述箭头1处直接将<>编码转换了  ,箭头2处却是把<>删除了  但是,事件触发却不需要使用这两个符号所以我们可以使用事件触发相关的语句进行绕过 "onfocus=javascript:alert('xss')" 在点击输入框之后成功触发了事件进行弹窗。"onclick="alert(1)"也是可以的 

level5

老规矩首先输入测试代码<script>alert('xss')</script> 没有成功弹窗

 

查看网页源码

 

箭头1处:应该是被htmlspecialchars()函数将<和>进行了编码处理 ,箭头2处:在显示位可以看到,它在我们的恶意代码<script>中添加了一个_符号,用之前事件触发的代码进行测试:?keyword="οnfοcus=javascript:alert('xss')>//   

 然后并没有得到我们想要的弹窗,明显这道题,比上一道复杂 ,继续查看一下网页源码

在这里插入图片描述

这里居然对onfocus这一类的事件字符也进行了防范。从刚才的响应来看提交的javascript字符并没有被过滤或者转义等,所以此处既然无法通过<script>标签或触发事件来执行js代码的话,那么可以换一个标签来执行js代码。继续构造如下代码:?keyword="> <a href=javascript:alert('xss') > xss</a> //   从页面回显可以看到一个xss的链接 ,点击链接即可触发弹窗的js代码

 

接下来去看下这一关的php文件源码

在这里插入图片描述

箭头1:将get方式传递到服务器端的keyword参数的值进行全小写的转换,然后赋值给str变量。

箭头2和3:通过str_replace()函数来破坏变量值中的敏感字符的语义。

箭头4:通过htmlspecialchars()函数处理之后显示到网页上,

箭头5:直接将进行敏感字符处理之后的变量值插入到<input>标签的value属性值中。

level6

 前面做了几道题后,有了一定经验 ,可以分别用<script>alert('xss')</script>   "onclick="alert(1)" 或者a标签 "> <a href=javascript:alert('xss') > xss</a> // 都先测试一下

 首先第一个script被替换添加了一个_  跟上关一样 ,继续尝试"onclick="alert(1)发现也是和上一关一样。

 做到这里,我们不经意会怀疑会不会a标签也不可以 ,经过测试后,果然是不行的,a标签也被替换掉了 ,我们直接查看php源码

在这里插入图片描述

 结果通过查看代码我们可以发现本关替换了很多的关键词,但是凑巧就是使用上一关的将输入数据转换为小写的strtolower函数,所以导致我们通过大写的方式来输入恶意代码。于是构造绕过语句 "Onclick="alert(1)

 level7

 没有成功弹窗,查看网页源码

 可以发现这里的<>中两个符号被过滤掉了,相应的<script>标签j就没有办法使用了,我们在试试事件触发"οnfοcus=javascript:alert('xss')// 同样也失败了 ,查看网页代码可以发现可以看到onfocus事件直接把on字符删除了,javascript中的script字符也被删除了。如果是这样的话就不需要再继续尝试新的标签了,看看前面的大小写能不能绕过

 大小写也绕过失败,我们是黑盒测试看不见Php源代码,所以我们只能一个个的去尝试,然后我想到了双写标签,话不多说,开始尝试"oonnfocus=javascriscriptpt:alert('xss')//

出乎意料居然成功了,我们进入php源代码看看

 在这里插入图片描述

箭头1:对参数值转换成了小写  ,箭头2:将基本的关键字都删除了,但是它只执行了一次 所以可以双写绕过

 level8 

这一关卡有些不一样,我们先随便输入一个值测试一下,查看网页源代码可以发现这里我输入的值一个传入到了<input>标签,同时下面的<a>标签也有值

<script>alert('xss')</script>&submit=添加友情链接,会发现<>被编码了,在href属性值中script字符被插入了_字符破坏语义,用来闭合引号的引号也被编码了。onfocus一类的事件也被破坏了大小写绕过,失败了,因为此处没有对关键字进行删除,所以就不进行双写测试了,用当用完了上面所有方法是不是觉得无计可施了,这个时候想起来老师上一节提到的实体编码的问题,我们可以尝试把javascript这个协议进行实体编码试试  java&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1)

 最后我们再看一下php源代码,看看本关都做了哪些限制

在这里插入图片描述

 发现这一关将大部分标签都进行了替换,也对大小写进行过滤,所以只能通过修改编码格式进行绕过。

 level9

我们有了前几关的经验后,可以想到这关应该是用前面所有方法几乎不太可能会实现,我们直接看html源代码,输入一个值进行测试

提交的参数值插入到了标签的value属性值中但是在<a>标签的href属性中却并没有出现该参数值,

而是显示的 "您的链接不合法?有没有!"这样的字符串。猜测这里可能对url地址做了匹配。

只有包含正常的url地址才能添加到href属性值中,于是我们构造一个正常的链接,让这个链接指向我们恶意的js代码 ,测试一下 javascript:alert('xss')http://www.baidu.com

结果发现这个协议被多了一个下划线,我们用上一关的实体编码在测试一下java&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(1)//http://

成功弹窗

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

在这里插入图片描述

 level10

在这里插入图片描述当作为新手的我,第一次看见这一关的时候是有点懵的,连个输入框都没有,我该如何进行绕过呢,算了直接先f12查看一下网页代码再做打算 在这里插入图片描述

 惊奇的发现这里跟前面几关多了在源码中有一个隐藏的表单,同时含有t_link t_history t_sort这样三个隐藏的<input>标签,不禁思索这道题的解法,会不会跟这三参数有关系,先用最基本的弹窗命令测试一下看看 有啥不同

 发现只有h标签修改了,input标签没有改变,因为input是隐藏的,所以不会触发事件,需要通过其它方法触发。尝试通过在url框中输入变量名传参数 ,先测试一下

?keyword=<script>alert('xss')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"

 从页面响应来看,有一个<input>标签的状态可以被改变。这个标签就是名为t_sort<input>标签,之前都是隐藏状态,但是通过构造参数响应发现只有它里面的值被改变了。因此可以从该标签进行突破,尝试能不能注入恶意代码进行弹窗

?keyword=<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')

其实发现只要第一步把文本框,显示出来后,经过测试随便用哪一种之前的绕过方法都是可行的。

level11

先用上一关的办法测试一下

?keyword=<script>alert('xss')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"

 发现这里其他两个参数都没有传进去,t_sort仍然是接受参数值的,但是里面的双引号被编码了这样浏览器只能正常显示字符但是却无法起到闭合的作用了。但是这里还多了一个t_ref会不会跟这个有关呢?

进行抓包

可以看到在原始的请求数据包中并没有referer这个请求头,那么我们可以自己给它加上

在这里插入图片描述

在这里插入图片描述

 构造代码

referer:"type="text" onclick="alert('xss')

在这里插入图片描述

可以看到我们添加的referer头的值出现在了t_ref标签的value属性值中了。接下来就是从这里突破注入恶意代码了,恶意代码成功插入了value属性值中,接着将这个请求的响应放行到浏览器试试成功弹窗了,说明通过referer头来提交恶意代码触发了xss

查看源代码

在这里插入图片描述

 在服务器端还将请求头中的referer头的值赋给了str11这个变量,在将变量值中的<>删除之后就会插入到t_ref这个标签的value属性值中。而上一关的t_sort标签虽然也能接收并显示参数值,但是这个参数值是要用htmlspecialchars()函数处理的

 level12

在这里插入图片描述

 同11的方法相同,这一关修改的是User-Agent头的值

level13

在这里插入图片描述

  同11的方法相同,这一关修改的是http头部cookie的值

总结:

1.可以通过闭合的方式进行绕过

2.可以通过构造事件来进行绕过

3.可以进行双写或者大小写绕过

4.查看http头部相关的标签是否缺少消息

5.通过进行实体编码进行绕过

6.通过引入外部链接的方式进行绕过

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值