pikachu系列之XSS(后续会更新其它系列)
漏洞类型:Cross-Site Scripting
XSS(跨站脚本攻击):
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
(以上来自百度百科)
XSS有三种类型:
- 反射型
交互的数据不会放在服务端,所见即所得,一般出现在查询界面
- 存储型
交互的数据会放在服务端的数据库中,永久存在,一般出现在留言板,注册界面等
- DOM型(类似反射型)
交互的数据同样不会服务端,是DOM操作前端JS代码时产生的,一次性的反射
XSS测试很简单,见框就插。每一个输入的地方都可能存在。
反射型XSS(get)
来看一下第一关:
先输入个’ljf666’再看看前端源码:
可以看到参数之间是直接拼接在一起的
那既然是直接拼接没有过滤那就直接上payload,上的过程中发现前端对输入框的长度进行了限制,小问题,改一下长度再上payload
具体操作按F12,再点击我箭头指向的那个按钮,再点击输入框就会自动查看到输入框的那段代码,将20修改一下改为大于我们payload的长度。
Payload:<script>alert('ljf666')</script>
拿捏!
反射型XSS(post)
先按照tips登录
然后进入下面这个界面
有输入框啊,怎么说,肯定是见框就插 payload
直接上我们的究极payload: <script>alert('ljf666')</script>
拿捏!
存储型XSS
看一下页面
哇哦,又是输入框,直接上payload: <script>alert('ljf666')</script>
再次拿捏!
我们来看一下我之前写的XSS分类定义,存储型是会到服务端的数据库的,永久存在,即任何人再次访问这个界面的时候都会弹框,不需要做任何事。
直接刷新,继续弹框,要想解决只有将代码删除才可以。
DOM型XSS
先看一下界面
又有输入框,啧,想都不想先上payload: <script>alert(‘ljf666’)</script>
欸,没有弹框啊,看一下前端源码,发现我们输入的payload被构造进了a标签的href属性里面,哇哦这个就属于DOM型,接下来构造一下新的payload
我把这个js复制下来方便大家看
<a href="<script>alert(" ljf666')<="" script="">'&gt;what do you see?</a>
着重看前面这个<a href="<script>alert(" ljf666')<="" script="">
想要造成XSS首先我们需要先闭合a标签,不然我们输入的任何参数都在a标签的<>里面
'><img src=xss onerror=alert('ljf666')>
这个payload原理就是图片的onerr报错属性
拿捏!
看一下源码
发现是直接将参数拼接在a标签里面的。
DOM型 XSS-X
看一下界面
先随便输入一个 长太帅 试一下
出现了一个链接啊,点一下看看
出现了两个链接,这个时候查看一下前端源码,找到两个链接对应的代码
这个时候长得确实帅的就已经注意到了我们输入的内容被拼接在了就让往事随风的a标签里面
那还说什么,老生常谈,像上面一样闭合标签就完事
Payload: '><img src=xss onerror=alert('ljf666')>
输入payload后,点击提交会跳转到初始页面
你以为失败了?NONONO,你忘了咱这是什么类型的XSS,随便输入点东西重新进入提交payload的那个页面,欸嘿,出来了
拿捏!
看一下源码,就是很自然的拼接到a标签里面
XSS之盲打
看一下界面
一看标题XSS盲打,欸,蒙了,什么是盲打,别慌,让我们百度一下
盲打仅仅是一种惯称的说法,就是不知道后台不知道有没有xss存在的情况下,不顾一切的输入xss代码在留言啊,feedback啊之类的地方,尽可能多的尝试xss的语句与语句的存在方式,就叫盲打。
“xss盲打”是指在攻击者对数据提交后展现的后台未知的情况下,站点採用了攻击者插入了带真实攻击功能的xss攻击代码(一般是使用script标签引入远程的js)的数据。当未知后台在展现时没有对这些提交的数据进行过滤,那么后台管理人员在操作时就会触发xss来实现攻击者预定好的“真实攻击功能”。
通俗讲就是见到输入框就输入提前准备的xss代码,一般是使用script标签引入远程的js代码,当有后台人员审核提交数据时候,点击了提交的数据,触发获取到有价值信息。
其实总得来说就是指你输入的语句得不到回显,只有后台才能看到你得输入,你的攻击目标也换成了后台管理员。
那么我们先随便输入,看看什么情况
可以看到它提示你,你的输入是被管理员收到了
OK,那让我们来个经典payload,然后点击提示可以看到它给了我们一个后台地址,显然是让我用管理员的视角去看看我们的payload是否攻击成功
Payload:<script>alert('ljf666')</script>
发现一登录进去就成功弹窗
属实是拿捏了!
XSS之过滤
先看下界面
先不管他三七二十一四七二十八的,先上个经典payload
emm,看起来是做了过滤,来,让我们瞅瞅过滤了啥
一般简单的绕过有两种方式:
- 双写绕过
- 大小写绕过
这里我们可以看到他做的限制,小写的script都会被替换为空,那么双写也会被过滤,那我们来尝试大小写
Pyload:<sCript>alert('ljf666')</ScriPt>
实际上当他只过滤script语句的时候我们还可以构造其它的payload来达到目的
Payload:<img src=# onclick=alert('ljf666')>
点击一下,因为payload构造的是点击后alert
再次拿捏
XSS之htmlspecialchars
看一下界面
题目是htmlspecialchars,这是个啥捏,少年不要慌,让我们来看一下百度怎么说~
咳咳,百度告诉我,这是一个函数,作用是将一些特殊的字符转换为HTML实体
预定义的字符是:
- & (和号) 成为 &amp;
- " (双引号) 成为 &quot;
- ' (单引号) 成为 &#039;
- < (小于) 成为 &lt;
- > (大于) 成为 &gt;
让我们来看看转换了哪些特殊字符
先把这几个特殊字符都输入进去
可以看到除了 ’ 以外其它的字符都被过滤了
同时我们也注意到了,输入的内容会放到a标签的href属性中
让我们来构造个payload:#' onclick='alert(666)'
(href = # 的意思空链接)
拿捏!
XSS之href输出
看一下界面
嘶,叫我输入一个常用的网站,咳咳,还是让你们来吧www._____.com
随便填入一个www.baidu.com
看一下回显
可以看到url中的message参数接受了我们的输入,并且作者还夸我是一个浩然正气的人
那么当我们的输入会被拼接到url中的时候,我们该如何是好,这个时候先让我们来了解一下什么是javascript伪协议
javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行
当浏览器装载了这样的URL时,它将执行这个URL中包含的javascript代码,并把最后一条javascript语句的字符串值作为新文档的内容显示出来。这个字符串值可以含有HTML标记,并被格式化,其显示与其他装载进浏览器的文档完全相同。
javascript URL还可以含有只执行动作,但不返回值的javascript语句
简单来说就是,javascript:这个伪协议用于url中,将 : 后的语句当成js代码并且执行
那么我们构造一个payload:javascript:alert('ljf666');
再次拿捏住!
XSS之js输出
首先看一下界面
先随便输入一些真理
这个时候页面回显不要放弃爱
然后我们再用F12看看前端源码
发现我们的输入会被变量ms接受,再将变量ms放在if里面判断,输入一个tmac看看我们的猜想是否正确
输入后页面回显成为了这样,证明我们的判断是正确的
我们来构造payload,首先我们想要我们的输入由自己来控制,那么我们先闭合他的标签
Payload: me'</script><script>alert('ljf666')</script>
成功拿捏!
这个时候我们还有另外一种姿势,上图
我输入了666
可以看到我们的语句是在script之中的,天然我们就有了script,那我们可不可以闭合赋值语句,再构造payload呢
Payload : me';alert('ljf666');//
后面的//是注释,可以看到上图,他是
<script>
xxx
</script>
所以//会注释掉后面的if判断
拿捏!