逻辑漏洞(业务逻辑)dami CMS

news2024/10/3 8:20:39

逻辑漏洞(业务支付逻辑漏洞)dami CMS

0x01 业务逻辑简介

业务逻辑指的是一个系统或应用程序中的实际业务规则和流程。它描述了如何处理特定的业务需求、数据和操作。业务逻辑通常是根据特定行业或组织的需求而设计的。

在软件开发中,业务逻辑是指应用程序处理数据的方式、进行计算和决策的规则,以及用户执行特定操作时系统的响应方式。这些规则和流程定义了系统的行为,并确保系统能够按照预期的方式工作。

举例来说,对于在线购物系统,业务逻辑包括但不限于以下内容:

  • 用户添加商品到购物车后如何计算总价;
  • 用户下单后的支付和物流处理流程;
  • 管理员如何管理商品库存和价格;
  • 用户的个人信息如何存储和保护。

业务逻辑通常在软件开发过程中被转化为代码,实现特定的功能和需求。在安全方面,了解业务逻辑对于发现潜在的安全漏洞和保护系统安全也非常重要。

0x02 dami靶场

dami cms 靶场是一个使用thinkphp2.1版框架搭设的网站,它是thinkphp的早期版本,目前也很少在使用。

ThinkPHP是一个基于PHP语言的开源Web应用框架,采用MVC(Model-View-Controller)设计模式,有助于更好地组织应用程序代码。它提供了丰富的工具和函数库,简化了开发流程,包括强大的路由功能、模板引擎和ORM支持。

image-20231122143400469

首先通过注册页面,多注册几个账号,用于测试越权。

image-20231122145651559

漏洞 一

​ 验证码验证漏洞,未设置过期时间,导致验证码一直有效,会被暴力破解利用。

  • 经测试,验证码机制为页面刷新才会重新生成新的验证码
  • image-20231122151818492

漏洞 二

支付漏洞,订单数量未严格限制,导致可通过抓包修改负数,导致支付漏洞

image-20231122152244389

支付选项中,分别为 支付宝支付、货到付款、站内支付,选择站内支付,点击购买后,进行抓包。

image-20231122152814511

发现前端使用POST的方式,发送的订单信息给后端进行处理。发送的内容经过了URL编码,通过解码了解到发送为以下内容

  • id[]=69: 一个 ID 列表,包含一个 ID 为 69 的条目。
  • pic[]=\/Public\/Uploads\/thumb\/thumb_1393206337.jpg: 图片列表,指向一个图片路径 /Public/Uploads/thumb/thumb_1393206337.jpg
  • name[]=大米CMS手机开发专版: 名称列表,包含一个名称为“大米CMS手机开发专版”的条目。
  • gtype[]=灰色: 类型列表,包含一个类型为“灰色”的条目。
  • qty[]=1: 数量列表,包含一个数量为 1 的条目。
  • price[]=5400: 价格列表,包含一个价格为 5400 的条目。
  • realname=123: 真实姓名为 “123”。
  • tel=123: 电话号码为 “123”。
  • province=宁夏city=银川市area=市辖区: 地址信息,包括省份为“宁夏”,城市为“银川市”,地区为“市辖区”。
  • address=: 地址为空。
  • trade_type=2: 交易类型为 2。
  • iscart=0: 是否在购物车中为 0。
  • __hash__=7fe310a6298f63572cae4f0f818eafd9: 可能是用于验证或身份验证的哈希值。

在支付漏洞中,黑客最想干的事情就是白嫖,所以在这一串信息中,我们着重关注与金钱相关的的内容,那么我们可以尝试去修改qty[]price[]两条信息,来尝试修改数量或金额来达到白嫖的目的。

由于我们注册的账号并没有钱,所以我修改qty[]为-1,来尝试购买。

image-20231122154457393

通过回显发现,已经成功下单,通过站内查询,我购买了一个产品,网站又给了我5400元,这是又白嫖,又拿钱。

image-20231122154626339

现在账号有钱了,继续尝试,查看price[]在金额参数中是否还存在漏洞。

image-20231122155417288

price[]参数值改为1,回显页面显示余额不足,应该是做了相对应的限制,继续尝试。

image-20231122160052583

多次尝试后,任然不行,price[]参数应该是后端已经根据id[]锁定了。所信把qty[]改为-100,price[]改为16000,回显订单提交成功,但是订单数量应该变了,金额应该不会有变化。

image-20231122160541339

与我猜想是一样,价格金额仍然是6000元,数量却变成是-100,而我的余额变成60万5千400元,由此也可以看出业务逻辑漏洞的可怕之处,空手套白狼的一把好手!!!

代码分析

ThinkPHP采用了自己的一套约定俗成的文件架构,这种方式有别于一些其他框架。

在ThinkPHP中,index.php文件是整个应用的入口文件,它通常放置在Web服务器的根目录中。通过这个入口文件,整个应用被启动并初始化。

通常,ThinkPHP的核心代码会放置在/lib/目录下。在这个目录中,包含了各种类文件,这些文件定义了框架的核心功能和组件。这些类文件包括路由处理、模板引擎、数据库操作、安全特性等。

在整个应用的生命周期中,index.php文件会加载这些核心类文件,并根据请求的路由信息调用相应的控制器和方法。这种架构隐藏了很多细节,使得开发者可以更专注于业务逻辑,同时框架会自动处理很多底层工作。

此次漏洞挖掘我们是经过,www.dami.me/index.php?s=/Member/dobuy.html,那么我们就应该从Web文件下去找类文件/Member下去找dobuy()方法。

image-20231122161956258

if($trade_type ==3){
$title='';
$total_fee =0;
$total_num =0;
for($i=0;$i<count($_POST['id']);$i++){
$price = (float)M('article')->where('aid='.intval($_POST['id'][$i]))->getField('price');
if(!is_numeric($_POST['id'][$i]) || !is_numeric($_POST['price'][$i]) || !is_numeric($_POST['qty'][$i])){continue;}
$total_fee += (intval($_POST['qty'][$i]) * $price)*1;	
}
$have_money = M('member')->where('id='.$_SESSION['dami_uid'])->getField('money');
if($have_money < $total_fee){
$this->assign('jumpUrl',U('Member/chongzhi'));
$this->error('您的余额不足,请充值!');exit();
}
for($i=0;$i<count($_POST['id']);$i++){
if(!is_numeric($_POST['id'][$i]) || !is_numeric($_POST['price'][$i]) || !is_numeric($_POST['qty'][$i])){continue;}
 $data['gid'] = $_POST['id'][$i];
 $data['uid'] = $_SESSION['dami_uid'];	
 $data['price'] = (float)M('article')->where('aid='.$data['gid'])->getField('price');//必须
 $data['province'] = $_POST['province'];
 $data['city'] = $_POST['city'];
 $data['area'] = $_POST['area'];
 $data['sh_name'] = $_POST['realname'];
 $data['sh_tel'] = $_POST['tel'];
 $data['address'] = $_POST['address'];
 $data['group_trade_no'] = $group_trade_no;
 $data['out_trade_no'] = "DB".time()."-".$_SESSION['dami_uid'];	
 $data['servial'] = $_POST['gtype'][$i];
 $data['status'] = 1;//已付款等待发货
 $data['trade_type'] = 3;
 $data['addtime'] = time();
 $data['num'] = (int)$_POST['qty'][$i];
 $total_num += $data['num'];
 $trade->add($data);
 if(strlen($title)<400){$title .= $_POST['name'][$i]."&nbsp;&nbsp;数量:".$data['num'].' 单价:'.$data['price'].'<br>';}
}

在第6行的代码中,可以看到价格并不是由前端页面传入到$data变量中,而是从名为 article 的数据库表中,根据指定条件(aid 等于 $data['gid']),获取对应记录的 price 字段值,并将其转换为浮点数类型,最后存储在 $data['price'] 中。所以我们在BP中修改price没有任何效果。

然而在第8行代码中,qty 只做了转换为整型的操作,验证的不够验证,所以导致了该漏洞的生成.

在初步的代码审计后,感觉该靶场应该还存在很多漏洞,在日后的博客更新中在慢慢挖掘。

0x03 总结

业务支付漏洞的产生通常源于在编写支付逻辑时的不严谨。这些漏洞可能是因为开发者未能充分考虑各种支付场景、未进行全面的输入验证、或者对支付过程中的边界条件和异常情况缺乏考虑。一旦这些漏洞被利用,可能会造成巨大的损失。

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

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

相关文章

Matplotlib颜色条的配置_Python数据分析与可视化

Matplotlib颜色条配置 基本颜色颜色条选择配色方案颜色条刻度的限制与扩展功能的设置离散型颜色条 基本颜色 Matplotlib提供了8种指定颜色的方法&#xff1a; 在[0&#xff0c;1]中的浮点值的RGB或RGBA元组&#xff08;例如 (0.1, 0.2, 0.5) 或&#xff08;0.1&#xff0c; 0.…

MacOS 成为恶意软件活动的目标

Malwarebytes 警告称&#xff0c;一个针对 Mac 操作系统 (OS) 的数据窃取程序正在通过虚假的网络浏览器更新分发给毫无戒心的目标。 Atomic Stealer&#xff0c;也称为 AMOS&#xff0c;是 Mac OS 上流行的窃取程序。 Atomic Stealer (AMOS) 恶意软件最近被发现使用“ClearFa…

使用websocket获取thingsboard设备的实时数据

背景 有一个读者前来咨询,如何实时获取设备的遥测数据。 其实tb是有提供websocket接口来获取设备数据的。而且还支持js跨域调用。下面给大家演示一下。 websocket地址 完整代码 <!DOCTYPE HTML> <html><h

2023亚太杯数学建模赛题人工精准翻译

大家好&#xff0c;亚太杯今天早上6点已经开赛啦&#xff0c;然后我在这里给大家带来赛题的精准人工翻译&#xff0c;防止大家直接用软件翻译导致某些地方乱码或者翻译不精准&#xff0c;这会导致后续做题过程出现很大偏差。 注意&#xff0c;以下翻译均免费发放word形式的哈&…

自学成为android framework高手需要准备哪些装备-千里马车载车机系统开发学习

背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;经常有很多学员买课同学都会问到需要准备哪些装备&#xff0c;我也回答了很多学员了&#xff0c;今天就搞一篇文章来统一说明一下&#xff0c;告诉一下大家如果你想从一个framework新手变成一个framework开发的高…

【精选】CSS入门必看知识点大合集

CSS简介 CSS概念 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表&#xff0c;又叫级联样式表&#xff0c;简称样式表 CSS文件后缀名为.css CSS用于HTML文档中元素样式的定义 为什么需要CSS 使用css的唯一目的就是让网页具有美观一致的页面 语法 CSS 规则…

VS Code 如何搭建C/C++环境

目录 一、VS Code是什么&#xff1f; 二、VS Code下载和安装 2.1下载 2.2安装 2.3环境介绍 三、Vs Code配置C/C环境 3.1下载和配置MinGW-w64编译器套件 3.1.1下载 3.1.2配置 一、VS Code是什么&#xff1f; 跨平台&#xff0c;免费且开源的现代轻量级代码编辑器 Vis…

vivado产生报告阅读分析15-时序报告11

Report Clock Domain Crossings “ Clock Domain Crossings (CDC) ” &#xff08; 时钟域交汇 &#xff09; 报告可对设计中的时钟域交汇执行结构分析。此信息可用于识别潜在不安全的 CDC &#xff0c; 此类 CDC 可能导致亚稳态或数据一致性问题。虽然 CDC 报告与“ Clock …

C#,数值计算——插值和外推,多项式插值与外推插值(Poly_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 多项式插值与外推插值 /// Polynomial Interpolation and /// Extrapolation interpolation routines for one dimension /// </summary> public class Poly…

Rust错误处理:Result

文章目录 简介错误匹配 Rust基础教程&#xff1a; 初步⚙ 所有权⚙ 结构体和枚举类⚙ 函数进阶⚙ 泛型和特征⚙ 并发和线程通信⚙ cargo包管理⚙ 可空类型Option Rust进阶教程&#xff1a; 用宏实现参数可变的函数⚙ 类函数宏 简介 Rust中没有提供类似try…catch之类…

排序算法--希尔排序

实现逻辑 ① 先取一个小于n的整数d1作为第一个增量&#xff0c;把文件的全部记录分成d1个组。 ② 所有距离为d1的倍数的记录放在同一个组中&#xff0c;在各组内进行直接插入排序。 ③ 取第二个增量d2小于d1重复上述的分组和排序&#xff0c;直至所取的增量dt1(dt小于dt-l小于……

2023 年 亚太赛 APMCM (B题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 问题一&#xff1a; 建立没有作物的玻璃温室内的温度和风速分…

【每日OJ —— 20.有效的括号(栈)】

每日OJ —— 20.有效的括号&#xff08;栈&#xff09; 1.题目&#xff1a;20.有效的括号&#xff08;栈&#xff09;2.方法讲解2.1.解法2.1.1.算法讲解2.1.2.代码实现2.1.3.提交通过展示 1.题目&#xff1a;20.有效的括号&#xff08;栈&#xff09; 2.方法讲解 2.1.解法 利用…

Mysql中正则表达式Regexp常见用法

Mysql中正则表达式Regexp常见用法_regexp不包含-CSDN博客

设计模式——RBAC 模型详解

1.什么是 RBAC 呢&#xff1f; RBAC 即基于角色的权限访问控制&#xff08;Role-Based Access Control&#xff09;。这是一种通过角色关联权限&#xff0c;角色同时又关联用户的授权方式。 简单地说&#xff1a;一个用户可以拥有若干角色&#xff0c;每一个角色又可以被分配…

nint和Pattern matching介绍(C#)

nint 最近看C# 9.0时&#xff0c;发现一个有意思的关键词&#xff0c;就是nint&#xff0c;第一次看到这个&#xff0c;于是好奇心爆棚&#xff0c;就去实际操作了一下。 nint i 1000; Console.WriteLine("i{0}", i);实际结果与int的结果是一样的&#xff0c;那为什…

PHP中间件实现

目录 1、简单中间实现 2、使用闭包函数实现中间件 在PHP中&#xff0c;中间件是一种常用的设计模式&#xff0c;用于处理请求和响应&#xff0c;它可以在请求到达目标处理程序之前或响应发送给客户端之前执行一些特定的逻辑。中间件提供了一种灵活的方式来修改或扩展应用程序的…

从0开始学习JavaScript--JavaScript生成器

JavaScript生成器&#xff08;Generator&#xff09;是一项强大的语言特性&#xff0c;它允许函数在执行过程中被暂停和恢复&#xff0c;从而实现更灵活的控制流。本文将深入探讨JavaScript生成器的基本概念、用法&#xff0c;并通过丰富的示例代码展示其在实际应用中的优势和强…

RT-Thread 线程间同步【信号量、互斥量、事件集】

线程间同步 一、信号量1. 创建信号量2. 获取信号量3. 释放信号量4. 删除信号量5. 代码示例 二、互斥量1. 创建互斥量2. 获取互斥量3. 释放互斥量4. 删除互斥量5. 代码示例 三、事件集1. 创建事件集2. 发送事件3. 接收事件4. 删除事件集5. 代码示例 简单来说&#xff0c;同步就是…