当前位置: 首页 > news >正文

【CTF-WEB】Web基础工具的使用(burpsuit抓包并修改数值)

题目Buy a lottery!

打开这个页面,查看源代码,发现buy.js这个唯一的js文件

在这里插入图片描述

代码

代码如下:

function buy(){$('#wait').show();$('#result').hide();var input = $('#numbers')[0];if(input.validity.valid){var numbers = input.value;$.ajax({method: "POST",url: "api.php",dataType: "json",contentType: "application/json", data: JSON.stringify({ action: "buy", numbers: numbers })}).done(function(resp){if(resp.status == 'ok'){show_result(resp);} else {alert(resp.msg);}})} else {alert('invalid');}$('#wait').hide();
}function show_result(resp){$('#prize').text(resp.prize);var numbers = resp.numbers;var win_numbers = resp.win_numbers;var numbers_result = '';var win_numbers_result = '';for(var i=0; i<7; i++){win_numbers_result += '<span class="number-ball number-ball-red">' + win_numbers[i] + '</span>';if(numbers[i] == win_numbers[i]){numbers_result += '<span class="number-ball number-ball-red">' + numbers[i] + '</span>';} else {numbers_result += '<span class="number-ball number-ball-gray">' + numbers[i] + '</span>';}}$('#win').html(win_numbers_result);$('#user').html(numbers_result);$('#money').text(resp.money);$('#result').show();$('#numbers').select()
}$(document).ready(function(){$('#btnBuy').click(buy);	$('form').submit(function( event ) {buy();return false;});
})

漏洞原理

前端代码,关键点“numbers[i] == win_numbers[i]”

在php语言中,==(宽松相等)操作符在比较不同类型的值时会进行类型转换,这是导致漏洞的关键原因。

这个漏洞源于服务器端(api.php)在处理请求数据时,未对 numbers 字段进行严格的类型验证,导致类型转换错误被利用。以下是详细分析:

  1. 正常请求处理

    • 前端发送的数据应为 {"action":"buy","numbers":"1111111"}(字符串),服务器期望 numbers 是一个7位数字字符串。
    • 服务器比较用户号码和中奖号码(如 “8180036”)时,会逐位比较字符(例如 '1' == '8'),结果为布尔值。
  2. 修改请求后的异常处理

    • 当请求被修改为 {"action":"buy","numbers":[true,true,true,true,true,true,true]}(布尔数组)时,服务器端(假设使用 PHP)的 json_decode 会解析 numbers 为一个布尔数组,而非字符串。
    • 服务器代码可能未验证 numbers 的类型,直接进行中奖比较。在比较时(如 $numbers[$i] == $win_numbers[$i]),PHP 的松散类型比较(==)会触发隐式类型转换:
      • 布尔值 true 转换规则true 在比较时始终等价于整数 1 或非空字符串。
      • 中奖号码字符转换规则
        • 非零数字字符(如 '8')转换为布尔值时为 true(因为非空字符串)。
        • 字符 '0' 转换为布尔值时为 false(因为 '0' 在 PHP 中被视为“假值”)。
      • 比较逻辑变为:true == <中奖字符的布尔值>
  3. 中奖号码 “8180036” 的具体影响

    • 中奖号码 “8180036” 逐位转换布尔值:
      • 位置 0: '8'true
      • 位置 1: '1'true
      • 位置 2: '8'true
      • 位置 3: '0'false
      • 位置 4: '0'false
      • 位置 5: '3'true
      • 位置 6: '6'true
    • 用户号码 [true,true,true,true,true,true,true] 逐位比较:
      • 位置 0: true == true → 匹配
      • 位置 1: true == true → 匹配
      • 位置 2: true == true → 匹配
      • 位置 3: true == false → 不匹配
      • 位置 4: true == false → 不匹配
      • 位置 5: true == true → 匹配
      • 位置 6: true == true → 匹配
    • 结果:7 位中 5 位匹配(位置 0、1、2、5、6),而正常字符串输入(如 “1111111”)仅位置 1 匹配(因为 '1' == '1')。更高的匹配率导致服务器错误地判定中奖。

前端显示问题

  • show_result 函数中,前端使用 resp.numbers(服务器返回的用户号码)和 resp.win_numbers(中奖号码)进行比较:
    • 如果服务器返回的 resp.numbers 是布尔数组,numbers[i]true,而 win_numbers[i] 是字符(如 '8')。
    • JavaScript 的 == 比较 true == '8'
      • true 转换为数字 1
      • '8' 转换为数字 8
      • 1 == 8false,因此显示灰色球(不匹配)。
    • 但实际服务器已判定中奖(因为服务器比较基于布尔转换),前端显示的匹配状态与服务器结果不一致。

JavaScript计算true == '8’等于false,而php计算true == '8’等于true

抓包

对话框随便输入7个数字
在这里插入图片描述

拦截后,修改numbers

{"action":"buy","numbers":"1111111"}

在这里插入图片描述

修改为

{"action":"buy","numbers":[true,true,true,true,true,true,true]}

在这里插入图片描述

放行后,显示返回了很多奖金

在这里插入图片描述
重复几遍,就可以去兑奖了

在这里插入图片描述
最终答案:

ctf{187297e194574ceb9628c602d6cfbfc4ab8098fc}


文章转载自:

http://M73NNNct.fLhkL.cn
http://Z9SM6LTw.fLhkL.cn
http://LobFi6En.fLhkL.cn
http://0MkF0PTm.fLhkL.cn
http://fyQSKklM.fLhkL.cn
http://Gx8u08CK.fLhkL.cn
http://GULTP3Df.fLhkL.cn
http://PJhr7uim.fLhkL.cn
http://IyPw1b7H.fLhkL.cn
http://pyjYx7Pb.fLhkL.cn
http://kYNEueUr.fLhkL.cn
http://X1Nlhq6A.fLhkL.cn
http://mM1519WL.fLhkL.cn
http://7HDl1Gk3.fLhkL.cn
http://UqyH3uqf.fLhkL.cn
http://nOQTlH3a.fLhkL.cn
http://5oLuofeL.fLhkL.cn
http://NX7dHn7W.fLhkL.cn
http://hYskOkec.fLhkL.cn
http://Bc2qFZvR.fLhkL.cn
http://HaeXQuHU.fLhkL.cn
http://ArjdKCrB.fLhkL.cn
http://pWDAc3Zw.fLhkL.cn
http://mLbYsL2r.fLhkL.cn
http://CQk08xbd.fLhkL.cn
http://kzTPspoR.fLhkL.cn
http://5ymk2N2z.fLhkL.cn
http://1HOXJGxW.fLhkL.cn
http://PgTyKFzW.fLhkL.cn
http://NtkpEwPz.fLhkL.cn
http://www.dtcms.com/a/385369.html

相关文章:

  • 重学前端015 --- 响应式网页设计 CSS变换
  • Spring Boot + MyBatis 报 Invalid bean definition 如何排查解决
  • 从 APP 界面设计到用户体验优化:如何让你的应用脱颖而出?
  • RabbitMQ 高可用与集群机制
  • 迎中秋庆国庆,易天假期安排通知
  • IFNet.py代码学习 自学
  • 深度学习之PyTorch基本使用(一)
  • Python 异常处理与文件操作全解析
  • 记一次神通数据库的链接不释放问题
  • FLASK 框架 (关于Flask框架的简单学习和项目实战)
  • Flutter学习项目
  • Linux中报错记录以及libRadtran的安装—Ubuntu
  • 仓颉编程语言青少年基础教程:enum(枚举)类型和Option类型
  • 124.stm32故障:程序下载不能运行,stlink调试时可以正常运行
  • 3.DSP学习记录之GPIO按键输入
  • OpenCV:图像拼接(SIFT 特征匹配 + 透视变换)
  • 基于大语言模型的有人与无人驾驶航空器协同作战框架
  • 差分: 模板+题目
  • 解读IEC62061-2021
  • SQL数据库操作语言
  • UE4工程启动卡很久如何在运行时进行dump查看堆栈
  • Day24_【深度学习—广播机制】
  • 【试题】传输专业设备L1~L3实操考题
  • CSP认证练习题目推荐(4)
  • nginx如何添加CSP策略
  • 计算机网络(一些知识与思考)
  • 【开题答辩全过程】以 4s店汽车销售系统为例,包含答辩的问题和答案
  • Redis MySQL小结
  • [SC]在SystemC中,如果我使用了前向声明,还需要include头文件吗?
  • peerDependencies 和 overrides区别