pikachu XSS Cross-Site Scripting(皮卡丘漏洞平台通关系列)
目录
一、听pikachu介绍xss
本节引用内容来自pikachu漏洞靶场
XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
二、羞耻又走心的推荐
推荐一下我之前写的另外两个漏洞靶场的XSS通关(╹ڡ╹ )
1、DVWA通关--反射型XSS(XSS (Reflected)) 这篇里面有如何在攻击者计算机上获得受害者cookie的操作
2、WebGoat (A7) Cross Site Scripting (XSS) WebGoat也挺有意思,self XSS就是在这里学到的概念
三、比较EASY的闯关
第1关 反射型xss(get)
输入个<script>alert("xian nv")</script>试试。
出师未捷身先死,一看就有长度限制。
刚把payload放进输入框,还没submit就发现payload被截短了,应该是html代码中的限制
此时有一条阳关道,有一根独木桥
1、阳关道
阳关道是直接在地址栏插payload,想插什么就插什么。比如:
<script>alert("xian nv")<%2fscript>(记住/一定要亲自手动进行URL编码,其他的浏览器可以自动编码)
2、独木桥
独木桥是请出开发者工具,修改html代码中的输入框长度限制,然后在输入框中输入payload并提交。之所以叫独木桥就是因为每输入一个payload之前都要改一次输入框长度限制。。。
首先在输入框 鼠标右键--检查 弹出开发者工具,这时浏览器非常友好地用蓝色底色提示出了输入框对应的代码所在的位置
改大上图中的maxlength,比如改成100:
然后在输入框中输入payload:<script>alert(1)</script>
当然,payload也可以是下面这样:
<script>alert(/xian nv/)</script>
<script>alert(`xian nv`)</script>
<script>alert('xian nv')</script>
3、第三种方法
这种方法不太直观。。
burpsuite抓到包之后,在repeater里改请求行的url,send之后在右边搜索payload中的关键字,比如下图我用的payload是 <script>console.log(2)</script>
于是我搜索了console,发现payload在html代码中是原封不动的,可以判断有XSS漏洞
第2关 反射型xss(post)
一进去是这么个登录页面,我还以为漏洞在这两个框的其中一个呢,于是用用户名xiannv,密码123456试了一下,心想输入回显到页面上的应该是注入点,结果发现两个都没回显。。。>︿<
点开提示一看要先用admin账号密码登录( ╯□╰ )于是就登录了。。登进去之后感觉和上一关差不多。。而且这关的输入框还没有长度限制
输入payload:<script>alert(document.cookie)</script>
得到admin的cookie
第3关 存储型xss
它是一个留言板,来玩玩
输入payload:<script>alert("交出你的cookie");alert(document.cookie)</script>
提交之后首先弹出下图,对应payload中的 alert("交出你的cookie")
点 确定 之后又弹出下图,对应payload中的 alert(document.cookie)
点 确定 之后就变成下图这样了,虽然留言内容显示不出来,但是对比一开始进来的时候可以看到多了个“删除”,说明确实多了一条留言
右键--查看网页源代码 的话,可以看到payload在html代码中是原封不动的。。
下面就是见识存储型XSS威力的时候了:
在另外一个浏览器中来到本关页面,也出现了同样的弹框。说明存储型XSS能危害所有访问受影响页面的用户。
然后有个题外话,这关作者大概懒得搞防止表单重复提交的操作,如果直接在提交评论的页面刷新的话,会再次提交评论的!
第4关 DOM型xss
一个输入框,先输入个<script>alert(1)</script>试试。
没有弹框,回显了一个链接名曰“what do you see?”
鼠标右键--查看网页源代码,Ctrl+F弹出搜索框,输入what do you see看看
找到了一段js代码,寻找DOM XSS的本质是做js语言阅读理解题。。
假装看不到注释的提示(/▽\)这段js代码的意思是会把用户提交的内容输出到<a>标签中,这样的话,就需要闭合标签和引号
输入payload:'><img src=x οnerrοr='alert(`xiannv`)试试
弹框是可以弹框,但是有个破碎的图片标识,不好看,强迫症请教诸位大神有没有什么办法可以让这个破碎的图片不显示,试过style="display:none;"以及height="0" width="0"都不行(⓿_⓿)
当然上上图中js代码提示的两个payload也是亲测有效的,但是都要配合鼠标的操作,onmouseover需要鼠标划过,onclick需要鼠标点击,不像我刚刚用的那个payload直接就弹框了(onerror表示出错时执行,这里是指图片源不存在)。
题外话:
这关看起来是self DOM XSS。。就是自娱自乐自问自答型的,不太好利用,一方面输入不在url中,另一方面也没有表单提交的操作。。在网上找了一下,可能要结合复制粘贴劫持(详见一种结合了点击劫持、Self-XSS、复制粘贴劫持的新型XSS攻击)
第5关 DOM型xss-x
在输入框中输了个“吃瓜”,提交之后发现吃瓜群众跑到url里面去了(这就是和上一关的不同),然后多出来个链接“有些费尽心机想要忘记的事情,后来真的就忘掉了”
既然还是DOM型,就 鼠标右键 -- 查看网页源代码
假装看不到提示(还有注意下图这个alert(xss)是注释掉的。。我还研究了半天这句放在这儿干嘛 ╯︿╰)
这题跟第4题没啥差别,就是比第4题更容易利用而已
注意下图中高亮的那行,本关输入payload之后需要点击链接“有些费尽心机想要忘记的事情,后来真的就忘掉了”才能触发domxss()函数,从而触发XSS
输入第4关的payload:'><img src=x οnerrοr='alert(`xiannv`)
点击链接“有些费尽心机想要忘记的事情,后来真的就忘掉了”之后弹框
题外话:
由于本关payload在url中,因此比第4关好利用很多
第6关 xss盲打
首先还是观察一下敌情,随便输入点东西,提交之后发现输入的东西完全不显示在页面上,去哪儿了呢?
查看网页源代码之后,发现本关的输入是以POST方法提交的,但是form标签里没有action属性,也不知道表单数据被提交到哪里去了呀。。。
点一下提示,原来要登录后台才能迎接攻击啊
到了这个页面首先需要登录,再点一下提示,发现用户名是admin,密码是123456
登录进去之后发现评论内容和用户名都有显示
那注入点在哪儿呢?两个都试试吧
返回提交评论的页面,
在评论输入框填写payload:<script>prompt(document.cookie)</script>
在输入名字的地方填写payload:<script>console.log(document.cookie)</script>
然后刷新后台
弹框的这个说明输入评论的地方是注入点
开发者工具的控制台(Console)中有显示cookie说明输入名字的地方也是注入点
第7关 xss之过滤
随便输入一些内容,提交之后发现页面有回显输入的内容,url中也有输入的内容,离开本页面再回来,页面就没有这个内容了,说明是反射型GET型XSS
下面正式开始
先不着急输入payload(着急的话也可以直接输入),先看看哪些东西会被过滤或者编码,猜测一下可能有:"<>'on/`() script img href src
可以把这些一个个输入提交试试,也可以一起提交,然后就发现了好玩的情况,如果单独输入"<>'on/`()则什么都没有被过滤,如果输入了"<>'on/`() script img href src,则<>'on/`() script被删掉了,这说明什么问题?这说明过滤语句超可能是<.*script
那就不要用<script>标签了,用<img>标签试试,输入payload:<img src="#" οnerrοr=alert(document.cookie)>
成功弹框
第8关 xss之htmlspecialchars
先输入个<script>alert('xiannv')</script>试试,理所当然没有弹框,出现了一个链接(高亮部分),根据之前的经验,这里恐怕是有个<a>标签
鼠标右键--查看网页源代码,发现不管是<a>标签内还是href属性内,左右尖括号被编码了,因此这关想闭合标签是不行了。仔细一看,又发现单引号居然没有被html编码,可以可以,利用一下<a>标签吧。
输入payload:这里有仙女' οnclick='alert(document.cookie)'
提交后点击下图高亮的链接即可弹框(至于输入都输出到页面上了怎么办?好像只能祈祷受害者不懂JavaScript了?)
查看网页源代码可以发现payload闭合了href属性的值,并增加了鼠标点击时的事件(onclick)
重要思考:
这关可以过得如此轻易,得益于单引号没有被html编码,来看看php代码是咋写的
编码特殊字符使用的函数就是题目中的htmlspecialchars(),这函数不知道出于什么考虑,默认是不编码单引号的。
具体来说(引用内容参见https://www.w3school.com.cn/php/func_string_htmlspecialchars.asp)
该函数语法是:
htmlspecialchars(string,flags,character-set,double_encode)
其中flags中有三个flag是用来控制对引号的编码的:
- ENT_COMPAT - 默认。仅编码双引号。
- ENT_QUOTES - 编码双引号和单引号。
- ENT_NOQUOTES - 不编码任何引号。
因此,如果把上图的第26行改为下面这样,本关使用的payload就失效了,闭合href属性就行不通了。恐怕这就是本关的意图吧。。。
$message=htmlspecialchars($_GET['message'],ENT_QUOTES);
第9关 xss之href输出
还是先输入个<script>alert('xiannv')</script>试试,没有弹框
鼠标右键--查看网页源代码,发现左右尖括号和单引号都被html编码了,这样的话,闭合标签或者闭合属性都行不通了。
但也不是没办法了,W3School中对<a>标签的href属性有以下描述(引用摘自HTML <a> 标签的 href 属性):
<a> 标签的 href 属性用于指定超链接目标的 URL。
href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 <a> 标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。
从上述描述可见,这边可以利用JavaScript协议。输入payload:javascript:alert(document.cookie)
然后点击下图高亮的链接即可弹框
思考:
那么当用户输入由href属性输出时,该怎么防御xss呢?
仅仅html编码就不够了,本关的php源代码中给了提示(有点简略,这里稍微扩充一点)。遇到这种情况,需要两点处理:
1、检查用户输入,必须以http或者https开头。注意,不可以仅仅是包含http和https。
2、进行html实体编码
第10关 xss之js输出
还是输入<script>alert('xiannv')</script>试试,果不其然没有弹框
鼠标右键--查看网页源代码,刚刚输入的东西跑到<script>标签内了,并且没有被编码
这就很easy了,只要无中生有出一个js语句就好了,怎么生呢首先要用';闭合掉当前的语句,然后插入新语句,然后再用//注释掉老语句遗留下来的';
输入payload:';alert(1);//
弹框成功
更多推荐
所有评论(0)