【渗透测试】XSS-Labs通关教程,超详细,小白也能看懂
一、为什么要学 XSS-Labs了解XSS漏洞的利用技巧和绕过技巧是Web安全学习的核心能力之一。无论是面试中的XSS知识点还是真正的渗透测试中的漏洞通过XSS-Labs的通关练习可以帮助你1、理解不同类型 XSS反射型、存储型、DOM 型的原理差异2、掌握 HTML 标签注入、事件触发、编码绕过等核心技巧3、建立 “输入过滤与输出编码” 的安全防护思维。二、前置知识2.1 W3C标准W3C标准网页主要由三部分构成1、结构HTML简单掌握HTML学会写常用标签、大体能看懂网站HTML源码即可2、表现CSS简单了解知道作用就行3、行为JavaScript需要较深入了解但具体的语法在练习中学习即可2.2 XSS 原理与分类XSS跨站脚本攻击是指攻击者在网页中注入恶意 JavaScript 代码当用户浏览时代码被执行从而实现窃取 Cookie、劫持会话等攻击。根据触发方式分为三类反射型 XSS非持久化需诱骗用户点击含恶意代码的链接如搜索页 URL常用于窃取 Cookie存储型 XSS持久化恶意代码存储在服务器如评论区、个人资料所有访问该页面的用户都会触发危害更大DOM 型 XSS不经过后端通过 URL 参数控制前端 DOM文档对象模型执行代码本质属于反射型。三、通关实战Level1-20Level1基础标签注入本关主要考的是无过滤的 HTML 标签注入当输入的内容直接嵌入 HTML 页面时可通过script标签执行 JavaScript 代码。script 和 /script: 是HTML标签用于定义JavaScript代码 alert() :是JavaScript内置函数用于在浏览器中弹出警告对话框 当浏览器解析到这行代码时会立即执行 alert(文本) 函数,弹出一个含有文本的警告对话框,用户需要点击确定按钮才能继续浏览页面通过查看网站源码,可以发现get传参中name的值test插入了html的head,并且回显了payload长度,可以断定要通过name传入payload大家可以可以试试在name后面输入testtest,这时就会回显payload的长度为8在url后的get传参处上payloadurl?namescriptalert()/script顺利进入level2level2闭合标签绕过考点输入被包裹在input的value属性中需闭合标签才能执行代码。input namekeyword value input namekeyword value scriptalert()/script 通过手动添加 进行双引号闭合,进而使得scriptalert()/script生效这里搜索框的test和payload的长度有关,也可以修改搜索框中的文本长度来确定payload传输位置那我们就和上一关一样在搜索框插入payload并提交scriptalert()/script输入scriptalert()/script测试发现和被转义为和HTML 实体化利用闭合value属性再插入新标签scriptalert()/script注用于抵消后续的闭合符号避免语法错误Level3事件触发绕过考点和被严格过滤需用 HTML 事件属性执行代码。onfocus事件在元素获得焦点时触发最常与input、select和a标签一起使用onfocus事件就是当输入框被点击的时候就会触发对应的函数然后我们再配合javascript伪协议来执行javascript代码比如input typetext onfocusmyFunction(), 这里input标签是有输入框的简单来说onfocus事件就是当输入框被点击的时候就会触发myFunction()函数input namekeyword value onfocusjavascript:alert() 那这里就会使得点击input框时,执行alert函数,这里的javascript:alert()是JavaScript伪协议,相当于onfocusalert()自然而然的想到上一关的解题方法,试一试测试发现被过滤但未被过滤用闭合value属性似乎和上一关没区别,来看看上一关的payload scriptalert()/script 哦哦,细心的同学已经发现了,上一关的闭合方式是,而这一关的闭合方式是’,所以要把单引号改为双引号,相应的payload就是 scriptalert()/script 还是不行观察源码发现这题value部分的符号也被实体化了,那就无法通过符号闭合的方式进行注入,这里就可以利用onfocus事件进行绕过,构造出payload onfocusjavascript:alert() ** 温馨提示**这里注意,在搜索框输入完payload点击搜索后需要在点击一下文本框,保证触发onfocusLevel4双引号闭合与事件复用被过滤需用闭合标签。就是从level3的单引号变为双引号熟悉的页面基本上xss就是通过输入数据的地方进行注入所以这里就不再一步步通过上一关的答案进行试验了直接查看源码先通过 scriptalert()/script 闭合,发现符号被过滤那么自然而然就想到onfocus事件,构造payload onfocusjavascript:alert() ** 温馨提示**记得搜索后点击一下文本框,保证onfocus事件能被触发Level5a 标签 href 伪协议a href标签法:href属性的意思是 当标签a被点击的时候就会触发执行转跳转跳到一个网站也可以触发执行一段js代码a hrefhttps://www.baidu.com /a当点击a标签的时候,就会跳转到百度的网站,很多跳转链接就是基于href标签完成将 a hrefjavascript:alert()xxx/a 和input namekeyword value拼接起来得到input namekeyword value a hrefjavascript:alert()xxx/a 试试上一关的payload onfocusjavascript:alert() 发现无法通过,那就看看源码很明显的看到过滤了js的标签还有onfocus事件虽然str_replace不区分大小写但是有小写字母转化函数所以就不能用大小写法来绕过过滤了只能新找一个方法进行xss注入这里我们用a href标签法构造payload a hrefjavascript:alert()xxx/a 这时候点击xxx就会跳转到href标签并执行js代码,完成本关Level6大小写绕过html标签代码不区分大小写例如script/script和sCript/sCript而言是相同的还是先用上一关的payload试试发现xxx部分显示不可以点击,那来看一下源码发现href标签也被过滤了,那试试onfocus事件,发现也被过滤了,这时基础的办法就只有大小写绕过,构造payload(任选其一就好,这里我用的第三个) a hRefjavascript:alert()x/a Onfocusjavascript:alert() sCriptalert()/sCript 这样就完成了Level7双写绕过双拼写绕过,代码可以检测关键字进行过滤,我们可以进行关键字中间插入关键字的办法进而进行注入比如scr script ipt进行关键字script过滤后就会变成script(一般写为scrscriptipt不带空格的形式,我这里是为了大家看的更方便)这里还是用常用的payload试试,我一般用上一关的,因为xss-labs是逐渐增加难度,和上一关一般有关联 sCriptalert()/sCript 看源码这里发现不仅检测出了script大小写,还进行了过滤,直接不显示了,但是没事,这时候就要举出另一个常用的知识点了,那就是双写绕过,构造payload sCrsCriptiptalert()/sCrsCriptipt 这样就完成了Level8Unicode 编码绕过href的隐藏属性自动Unicode解码当在href标签用Unicode符号时,点击href会自动进行Unicode解码比如hrefquto会自动解析为href(的Unicode编码为quto)还是拿上一关的payload试一试,再看源码可以发现添加了html实体转化函数还把双引号也给实体化了 添加了小写转化函数还有过滤掉了src、data、onfocus、href、script、双引号但是我们能利用href的隐藏属性自动Unicode解码我们可以插入一段js伪协议javascript:alert()利用在线工具进行Unicode编码得到payload(编码工具浏览器搜一下就好了,这里就不打广告了)#106;#97;#118;#97;#115;#99;#114;#105;#112;#116;#58;#97;#108;#101;#114;#116;#40;#41;将这些插入href中再点击一下友情链接即可过关Level9注释符绕过内容校验/*内容*/注释js代码老套路看看过滤了什么,用上一关的payloadjavascript:alert()试试为啥不合法,这里需要看一下php源码这里的意思是当false等于false的时候(就是传入的值没有http://)就会执行if为了防止falsefalse我们需要向传入的值里面添加http://并用注释符注释掉否则会执行不了无法弹窗让函数strpos返回一个数字构造payloadjavascript:alert()/* http:// */为什么还是过不了,来看一下网页源码发现这里进行了过滤,自然而然的想到level8的解法,转成Unicode编码构造payload#106;#97;#118;#97;#115;#99;#114;#105;#112;#116;#58;#97;#108;#101;#114;#116;#40;#41;/* http:// */添加完成后点击一下友情链接触发代码Level10隐藏参数注入typehidden 隐藏类型在页面上不可见 常用于 传递服务器端数据到客户端 表单安全令牌CSRF token 会话标识 页面状态信息 typetext 表示文本输入框并且显示 input namet_sort value typehidden和 onfocusjavascript:alert() typetext进行拼接得到input namet_sort value onfocusjavascript:alert() typetext typehidden发现这关没有输入框,别着急,观察一下这时候就发现了payload需要再url中传入,那我们测试一下常用的关键字 sRc DaTa OnFocus sCriPt a hReFjavascript:alert() #106;构造的payload是url?keyword sRc DaTa OnFocus sCriPt a hReFjavascript:alert() #106;这时候查看一下源码居然都被实体化了没法子只能看一下这关的源码了原来还有隐藏传参方法学到了这里是get传参t_sort并过滤掉了号不能闭合插入标签但是我们还能用onfocus事件因为这里输入框被隐藏了需要添加type“text”构造payloadurl?t_sort onfocusjavascript:alert() typetext记得传参后点击一下文本框进行触发Leve11Referer 头注入Referer是 HTTP 请求头中的一个重要字段用于表示当前请求的来源页面 URL主要作用1、流量来源分析Referer: https://www.google.com/search?qexample 网站可以知道用户是从哪个网站跳转过来的2、防盗链保护3、SEO 分析4、用户行为追踪通过referer能记录信息进行注入来看一下源码input标签有四个值都做了隐藏处理不难看出第四个名为t_ref的input标签是http头referer的参数就是由哪个地址转跳到这里的http头的referer会记录有那我们通过bp抓包注入referer头(burp suit的使用这里就不详细说了,请自行查阅文档)构造payloadReferer: onfocusjavascript:alert() typetext考虑一下http头传值本关是referer但接下来也有可能是其他头如Cookie等Level12User-Agent 头注入UA头User-Agent头是 HTTP 请求头中的一个重要字段用于标识客户端软件的信息本意是想通过客户软件识别身份避免爬虫等,但是由于其可以向后端传递信息,所以依然可以作为攻击位置太明显了,这肯定是User-Agent头了再用burpsuite抓包一下将User-Agent头修改为我们的测试代码,先用关键字测试一下 sRc DaTa OnFocus sCriPt a hReFjavascript:alert() #106;看一下源码,那就确定用onfocus事件,构造payload onfocusjavascript:alert() typetext将其传入别忘了最后要点击一下文本框Level13Cookie 注入Cookie 头是 HTTP 请求头中的一个重要字段用于在客户端存储和发送会话状态信息 不需要了解太多,只需要知道它是一个维持会话的作用就行(比如登录一个网页退出,一天后还可以登录,那就是cookie的作用)查看下源码很明显就是用cookie注入的方式,还是注入一下常见的关键字看看效果cookie界面可以通过点击F12进入源代码格式,在点击application(有的中文界面是存储/记忆)传入常见的参数 sRc DaTa OnFocus sCriPt a hReFjavascript:alert() #106; sRc DaTa OnFocus sCriPt a hReFjavascript:alert() #106;点击选中value的值,右键选择edit(某些中文页面就是编辑),传入要注入的数据,刷新一下页面就好了那我们构造payload并传输 onclickalert() typetext再刷新一下点击文本框就好了Level14Exif XSS了解即可这关主要涉及的漏洞是exif xss漏洞。exif是可交换图像文件格式英语Exchangeable image file format官方简称Exif是专门为数码相机的照片设定的可以记录数码照片的属性信息和拍摄数据。我们右键图片选择属性点击详细信息就可以看到exif的相关属性。我们可以在这些属性里面添加XSS代码然后上传图片实现弹窗。由于目标URL无法访问我们也无法上传图片。这题的网站崩了,只能跳过了(真不是作者划水啊)Level15ng-include 文件包含ng-include指令就是文件包涵的意思用来包涵外部的html文件如果包涵的内容是地址需要加引号不用记住太复杂的东西,就记住可以包含地址进行跳转这里不能包涵那些直接弹窗的东西如script但是可以包涵那些标签的东西比如a、input、img、p标签等等这些标签是能需要我们手动点击弹窗的onmoouseover标签,表示鼠标移动上去时会触发事件比如img src1 onmouseoveralert(),当鼠标移动到1.img的时候,就会触发alert()函数弹窗(相应的还有onmousedown属性,大家可以了解一下)看眼源码那就直接转到第一关最简单的一关呗构造payload(这里注意要包含url所有地址,包括http/https)?srcurl/level1.php这样你就会惊奇的发现跳转到第一关了,嘿嘿这时候大家可能就想说直接包含level1的payload就行了呗,很容易构造下面的payloadurl?srcurl/level1.php?namescriptalert()/script但是发现不行啊,注意这里不能包涵那些直接弹窗的东西如script但是可以包涵那些标签的东西比如a、input、img、p标签等等这些标签是能需要我们手动点击弹窗的那我们就讲一个新姿势吧onmoouseover?srcurl/level1.php?nameimg src1 onmouseoveralert()把payload输入并移动到图片就好了Level16对于html标签而言,空格和回车没有区别比如代码svg%0Aonloadalert(1)svg onloadalert(1)运行的结果是相同的看一下get的传参test,是payload的输入部分,输入一下常见的关键字?keyword sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P sCriPt a hReFjavascript:alert() #106;再看一下源码这里先是将字母小写化了再把script替换成空格最后将空格给实体化想尝试一下p标签p οnmοusedοwnalert()abc/p谁知道也将/给替换成了空格空格可以用回车来代替绕过回车的url编码是%0a再配合上不用/的img、details、svg等标签将空格替换成回车的url编码(%0A)构造payload?keywordsvg%0Aonloadalert(1)Level17Flash XSS了解即可这些关卡依赖 Flash 插件目前主流浏览器已不再支持核心思路是通过 Flash 参数注入事件如onclick。实际测试中可忽略重点掌握前 16 关的思路。这题的解法很简单首先得用一个支持flash插件的浏览器打开本关打开后会有个图片出来的不支持flash插件浏览器就没有如果不想下载的话自己去后端改一下也行将后端第十七关的代码level17.php)指向的swf文件改为index.png看一下源码有个embed标签的区域在其实用不用swf文件都一样的主要是区域接着我们构造payload?arg02 onclickalert()在url上插入就好了Level18Flash XSS了解即可换个支持flash插件的浏览器Cent Browser。看一下源码源码跟上关差别不大就是换了个swf文件我们直接测试一波过滤了啥构建payload?arg02 sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P sCriPt a hReFjavascript:alert();搞了个html实体化函数也没过滤啥感觉跟上关一样用事件触发属性即可如onmouse系列、onfocus、onclick等直接上payload?arg02 onmousedownalert()再点一下embed标签区域四、总结本文主要讲解了xss漏洞的各种绕过攻击的手法另外提一嘴xss漏洞主要用于钓鱼攻击在企业src漏洞挖掘的时候xss漏洞有很多厂商是不收的这取决于你怎么和厂商沟通在我们的课程里也会讲解或者关注我们后续的文章五、 网络安全学习资源推荐觉得文章对你有帮助想获取更多实战干货我们为你准备了一套「从零到一的网络安全学习资料包」包括红队攻防实战手册- 内网渗透、漏洞利用、权限提升网络安全学习路线图- 零基础入门到就业完整路径最新网络安全面试题- 大厂真题面试技巧️渗透测试工具包- 常用工具使用教程靶场搭建全套方案- DVWA、SQLi-Labs等实战环境如何获取微信搜索公众号[智榜样网络安全学习中心]关注后回复关键词「资料领取」即可免费领取全套学习资料 适合人群网络安全初学者、转行人员、在校学生、想要提升实战能力的从业者我们在网络安全培训领域深耕多年专注红蓝对抗实战与就业指导帮助数百名学员成功入行