逻辑漏洞(业务逻辑)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.hqwc.cn/news/208667.html

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

相关文章

transformer之KV Cache

一、为什么要研究KV Cache 非常有效的加速推理速度&#xff0c;效果如下所示&#xff1a; import numpy as np import time import torch from transformers import AutoModelForCausalLM, AutoTokenizer NAME_OR_PATH r*************** device "cuda" if torch.cu…

基于docker实现JMeter分布式压测

为什么需要分布式&#xff1f; 在工作中经常需要对一些关键接口做高QPS的压测&#xff0c;JMeter是由Java 语言开发&#xff0c;没创建一个线程&#xff08;虚拟用户&#xff09;&#xff0c;JVM默认会为每个线程分配1M的堆栈内存空间。受限于单台试压机的配置很难实现太高的并…

[网鼎杯 2018]Fakebook

[网鼎杯 2018]Fakebook 打开环境出现一个登录注册的页面 在登录和注册中发现 了地址栏出现变化&#xff0c;扫一波看看 看看robots.txt和flag.php 访问robots.txt看看 再访问user.php.bak <?php class UserInfo { public $name ""; public …

扩散模型实战(十一):剖析Stable Diffusion Pipeline各个组件

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…

JVM 之 class文件详解

目录 一. 前言 二. class文件结构 2.1. 文件格式 2.2. 魔数与版本号 2.3. 常量池 2.4. 访问标志 2.5. 类索引、父类索引和接口索引集合 2.6. 字段表集合 2.7. 方法表集合 2.8. 属性表集合 2.8.1. Code 属性表 2.8.2. Exceptions 属性 2.8.3. LineNumberTable 属性…

[Unity+OpenAI TTS] 集成openAI官方提供的语音合成服务,构建海王暖男数字人

1.简述 最近openAI官方发布了很多新功能&#xff0c;其中就包括了最新发布的TTS语音合成服务的api接口。说到这个语音合成接口&#xff0c;大家可能会比较陌生&#xff0c;但是说到chatgpt官方应用上的聊天机器人&#xff0c;那个台湾腔的海王暖男的声音&#xff0c;可能就有印…

Oracle与Redis Enterprise协同,作为企业缓存解决方案

来源&#xff1a;虹科云科技 虹科干货丨Oracle与Redis Enterprise协同&#xff0c;作为企业缓存解决方案 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 单独使用Oracle作为企业缓存数据库时&#xff0c;会出现哪些问题呢&#xff1f;使用Redis Enterprise与Oracle共…

汇编-CALL和RET指令

CALL指令调用一个过程&#xff0c; 使处理器从新的内存位置开始执行。过程使用RET(从过程返回) 指令将处理器转回到该过程被调用的程序点上。 CALL指令的动作&#xff1a; 1.将CALL指令的下一条指令地址压栈(作为子过程返回的地址) 2.将被调过程的地址复制到指令指针寄存器E…

七、通过libfdk_aac编解码器实现aac音频和pcm的编解码

前言 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12 AAC编码是MP3格式的后继产品&#xff0c;通常在相同的比特率下可以获得比MP3更高的声音质量&#xff0c;是iPhone、iPod、iPad、iTunes的标准音频格式。 AAC相较于MP3的改进包含&#xff1a; 更多的采…

Eclipse常用设置-乱码

在用Eclipse进行Java代码开发时&#xff0c;经常会遇到一些问题&#xff0c;记录下来&#xff0c;方便查看。 一、properties文件乱码 常用的配置文件properties里中文的乱码&#xff0c;不利于识别。 处理流程&#xff1a;Window -> Preferences -> General -> Ja…

「快学Docker」监控和日志记录容器的健康和性能

「快学Docker」监控和日志记录容器的健康和性能 1. 容器健康状态监控2. 性能监控3. 日志记录几种采集架构图 4. 监控工具和平台cAdvisor&#xff08;Container Advisor&#xff09;PrometheusGrafana 5. 自动化运维 1. 容器健康状态监控 方法1&#xff1a;需要实时监测容器的运…

机器人算法—ROS TF坐标变换

1.TF基本概念 &#xff08;1&#xff09;什么是TF&#xff1f; TF是Transformations Frames的缩写。在ROS中&#xff0c;是一个工具包&#xff0c;提供了坐标转换等方面的功能。 tf工具包&#xff0c;底层实现采用的是一种树状数据结构&#xff0c;根据时间缓冲并维护多个参考…