pikachu靶场实战之XSS漏洞(2)

XSS(跨站)漏洞概述

Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写”CSS”冲突,故又称XSS。一般XSS可以分为如下几种常见类型:

  1. 反射型XSS;
  2. 存储型XSS;
  3. DOM型XSS;
    XSS漏洞的形成原因是由于程序对输入和输出没有进行合适的处理,使得精心构造的字符在前端被浏览器当做有效代码而执行。

0x01 反射型XSS漏洞(get/post)

反射型XXS是一种非持久性的攻击,它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的目的。这里插入的恶意代码并没有保存在目标网站,需要引诱用户点击一个链接到目标网站的恶意链接来实施攻击。

xss001

第一题 <script>alert(1)</script>代码输入不进去,查看源代码可知是前端对字符数做了限制,<input class="xssr_in" type="text" maxlength="20" name="message"> 直接将maxlength改成100即可。

xss002

成功弹出。

image-20220825083230381

第二题是登录后,输入<script>alert(1)</script>也是能弹出,查看源代码。

xss003

代码中就是将前端传入的参数原封不动的执行了,就存在xss漏洞。

0x02 存储型xss

存储型xss 顾名思义就是恶意脚本会同正常信息一起被存到数据库或者文件中,等到用户在访问这个页面时就会成为受害者,这种漏洞常见于论坛、博客以及留言板。

直接上payload。

xss004

重新加载下页面,依旧会弹出。也是说每个访问该页面的用户都会受到攻击。

xss005

0x03 DOM型xss

DOM 型 XSS 其实是一种特殊类型的反射型 XSS,它是基于 DOM 文档对象模型的一种漏洞。
DOM 就是一个树状的模型,你可以编写 js 代码对树进行操作,比如获取节点的名称,增加一个元素等。DOM树长这样:

xss008

再回到题目本身,可以发现输入框输入的字符为未经过处理而是直接拼接的,代码是"<a href='"+str+"'>what do you see?</a>",那么直接闭合前面的a标签,然后插入恶意代码即可。代码如下:

1
><img src='#' onmouseover="alert('xss')">

xss009

onmouseover事件:指鼠标移动都某个指点的HTML标签上,会出现什么效果。
onmouseout事件:指鼠标移出某个指点的HTML标签后,会出现什么效果。

好,成功弹出。

0x04 xss之盲打

xss盲打在我的理解就是遇见输入框就先输入个弹窗脚本试试,或许就有什么惊喜。

xss010

果不其然,在后台就有了新发现,弹窗成功。

xss011

0x05 xss之过滤

废话不多说,直接上payload<script>alert(1)</script>,结果不出所料,直接被吞了。

xss012

推测是做了过滤,那就变一种方式再来。

xss013

看源码实际是利用正则将“<script”替换为空。直接全部换成大写在弹出,

1
<SCRIpt>ALErt(11)<SCRipt>

0x06 xss之htmlspecialchars

查询资料可知,php的htmlspecialchars()函数是将预定义的字符转换成HTML实体,HTML实体是浏览器用来代替特殊的字符的一种代码。有时候需要在文档内容中这些字符,但是不想让它们作为HTML被处理,为此应该使用这些实体(比如将 < 小于号转换成&lt;)。比如:

预定义的字符是:

  • & (和号)成为 &
  • “ (双引号)成为 “
  • ‘ (单引号)成为 ‘
  • < (小于)成为 <
  • > (大于)成为 >

另外,函数常用的参数有:

ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
可以看到,我们的nihao<>h"#'hha被转换成了nihao&lt;&gt;h\&quot;#\'hha,其中单引号并没有被转义,那么我们可以用单引号闭合href结合其他语句进行注入。

xss001

xss002

1
'onclick=alert(11)'

0x07 xss之href输出

这个直接看源码:xss004

源码中使用了htmlspecialchars的ENT_QUOTES,双引号及单引号以及左右尖括号均会被转义,可以使用javascript伪协议来执行js,payload如下:

1
javascript:alert(11)

伪协议不同于因特网上所真实存在的协议,如http://,https://,ftp://,

而是为关联应用程序而使用的.如:tencent://(关联QQ),data:(用base64编码来在浏览器端输出二进制文件),还有就是javascript:

我们可以在浏览地址栏里输入”javascript:alert(‘JS!’);”,点转到后会发现,实际上是把javascript:后面的代码当JavaScript来执行,并将结果值返回给当前页面。

0x08 xss之js输出

这道题的特点在于我们的输入被带入到js中,对我们输入的数据进行判断再动态生成内容。那么我们注入的话,可以使用单引号以及script标签闭合掉前面的script,再插入自己的注入代码。如:

1
'</script><script>alert(11)</script>

成功弹出!!!

xss006

0x09 总结

形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。

因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理: 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入; 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

XSS常见Payload

1
2
3
4
5
6
<script>alert("xss")</script>
<script>alert(document.cookie)</script>
<a href=javascript:alert(111)>
<body onload=alert('XSS')>
<img src=x onerror=alert(1)>
<div onclick="alert('xss')">

其他可参考: https://www.cnblogs.com/xuehen/p/4814237.html


pikachu靶场实战之XSS漏洞(2)
https://www.yeyusec.com/2023/09/10/安全笔记/靶场学习/pikachu靶场实战之XSS漏洞(2)/
作者
yeyusec
发布于
2023年9月10日
许可协议