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

逻辑漏洞(业务支付逻辑漏洞)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.mfbz.cn/a/177167.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2021年06月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 小明同学设计了一款游戏,其中一段程序如下图所示,下面这段程序可以实现哪项功能? A:在任何地方点击鼠标,角色都会移到鼠标位置 B:没有任何操作的时候角色会在舞台区域随机移动…

接口自动化测试实战经验分享,测试用例也能自动生成

作为测试&#xff0c;你可能会对以下场景感到似曾相识&#xff1a;开发改好的 BUG 反复横跳&#xff1b;版本兼容逻辑多&#xff0c;修复一个 BUG 触发了更多 BUG&#xff1b;上线时系统监控毫无异常&#xff0c;过段时间用户投诉某个页面无数据&#xff1b;改动祖传代码时如履…

C#学习相关系列之Linq用法---group和join相关用法(三)

一、Group用法 在C#的LINQ中&#xff0c;Grou将集合中的元素按照指定的键进行分组。Group方法返回一个IEnumerable<IGrouping<TKey, TElement>>类型的集合&#xff0c;其中TKey表示分组的键类型&#xff0c;TElement表示集合中元素的类型。每个IGrouping<TKey, …

机器学习实战第1天:鸢尾花分类任务

专栏介绍 欢迎订阅专栏——机器学习实战 机器学习实战_Nowl的博客-CSDN博客 纸上得来终觉浅 本专栏项目将着重于解决各类实际机器学习问题&#xff0c;带你上手各种场景的实际问题 数据集可以在我的资源中找到&#xff0c;也可以自行搜索 文中导入数据集的路径要改成自己的…

华为obs上传下载-Java版 2023-11-23

弄了半天&#xff0c;老师帮弄成功了&#xff0c;经过同意&#xff0c;分享到网上&#xff0c;希望能帮助更多人&#xff0c;至于怎么弄的&#xff0c;我也不知道。 创建idea项目后&#xff0c;项目结构&#xff0c;对应文件没有的创一个 pom.xm 注意改Java版本&#xff0c;我…

解决Vision Transformer在任意尺寸图像上微调的问题:使用timm库

解决Vision Transformer在任意尺寸图像上微调的问题&#xff1a;使用timm库 文章目录 一、ViT的微调问题的本质二、Positional Embedding如何处理1&#xff0c;绝对位置编码2&#xff0c;相对位置编码3&#xff0c;对位置编码进行插值 三、Patch Embedding Layer如何处理四、使…

算法设计与分析复习--分支界限法

文章目录 上一篇分支界限法性质装载问题0-1背包问题单源最短路问题最大团问题下一篇 上一篇 算法设计与分析复习–回溯法&#xff08;二&#xff09; 分支界限法性质 分支界限法是按广度优先策略或最小耗费优先遍历问题的解空间树。 搜索解空间&#xff1a; 子集树排列树 …

轻量级压测工具Apache Bench实战

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【c++】——类和对象(下) 万字解答疑惑

作者:chlorine 专栏:c专栏 目录 &#x1f6a9;再谈构造函数 &#x1f393;构造函数体赋值 &#x1f393;初始化列表 &#x1f6a9;explicit关键字 &#x1f6a9;static成员 &#x1f393;概念 面试题&#xff1a;计算创建多少个类对象 &#x1f393;特性 【问题】(非)…

香蕉派BPI-M4 Zero单板计算机采用全志H618,板载2GRAM内存

Banana Pi BPI-M4 Zero 香蕉派 BPI-M4 Zero是BPI-M2 Zero的最新升级版本。它在性能上有很大的提高。主控芯片升级为全志科技H618 四核A53, CPU主频提升25%。内存升级为2G LPDDR4&#xff0c;板载8G eMMC存储。它支持5G WiFi 和蓝牙, USB接口也升级为type-C。 它具有与树莓派 …

内部网关协议_路由信息协议RIP_开放路径优先OSPF协议_基本知识

目录: 因特网路由选择协议概述 路由信息协议RIP 开放路径优先OSPF协议 因特网路由选择协议概述 一.路由选择分类 静态路由选择和动态路由选择 静态路由选择: 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。静态路由选择简单、开销小&#…

在Spring Boot中使用ECharts绘制数据图表

使用ECharts来完成一些花里胡哨的图表吧&#xff0c;一般这种需求我们在我们的客户端不太常见&#xff0c;但是&#xff0c;我们在后端进行各种数据统计的时候就会发现ECharts的优点了&#xff0c;比如我们常常做的柱状图&#xff0c;折线图&#xff0c;雷达图等可视化形式&…

最常用的5款报表系统

在这个信息化飞速发展的时代&#xff0c;报表系统已经成为了企业管理和决策的重要工具。随着市场的需求不断增长&#xff0c;报表系统也在不断地更新和完善。如今&#xff0c;市面上有数不尽的报表系统&#xff0c;但是哪款才是最常用的呢&#xff1f;接下来&#xff0c;我们将…

CSS伪类选择器详细讲解

前言 伪类选择器在CSS中起到的作用可以说是至关重要的&#xff0c;如果CSS没有伪类选择器&#xff0c;有很多效果都要借助js来完成&#xff0c;这样不仅代码量增加&#xff0c;维护起来你难度也大。这样程序员的工作量大&#xff0c;也违背了CSS诞生的作用&#xff0c;就是提高…

STM32F103C8T6第5天:独立看门狗、窗口看门狗、dma实验

1. 独立看门狗IWDG介绍&#xff08;341.45&#xff09; 什么是看门狗&#xff1f; 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成程序的跑飞&#xff0c;而陷入死循环&#xff0c;程序的正常运行被打断&#…

美国云服务器:CN2/纯国际/高防线路介绍

​  谈到国外云服务器&#xff0c;美国云服务器必有一席之地。但是&#xff0c;一般来说使用美国云服务器&#xff0c;线路质量是一个重要的考虑因素。如果线路选择不合理&#xff0c;就有可能造成速度减慢或者安全隐患问题产生。本文将介绍美国云服务器的CN2/纯国际/高防三种…

PHP反序列化简单使用

注&#xff1a;比较简陋&#xff0c;仅供参考。 编写PHP代码&#xff0c;实现反序列化的时候魔法函数自动调用计算器 PHP反序列化 serialize(); 将对象序列化成字符串 unserialize(); 将字符串反序列化回对象 创建类 class Stu{ public $name; public $age; public $sex; publi…

有一台电脑一部手机就可以在网上赚钱,这些项目你也可以学会

很多人都希望能够在家中或者闲暇的时候&#xff0c;能够在网上赚钱&#xff0c;而网络给了我们这样的可能。只要有一台电脑和一部手机&#xff0c;你就可以开始你的赚钱之旅。这些项目并不难&#xff0c;只要你肯学&#xff0c;就一定能够成功。 1、美工设计 这个副业主要是推荐…

python plot绘图

使用python绘制t-sne图&#xff0c;并保存 一下是一个将que_im_features向量可视化的例子&#xff1a; def emb_save(que_im_features,i):# 向量[75, 640, 11, 11], episodeimport numpy as npimport pandas as pdfrom sklearn import manifoldimport matplotlib.pyplot as p…

jmeter中调用python代码

1、安装pyinstaller pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller 2、将py脚本打包 pyinstaller -F venv/get_image/OCR_jmeter_api.py 3、jmeter中添加OS Process Sampler并调用dist下的程序 4、执行jmeter
最新文章