#知识点:
1、商品购买 - 修改 数量&价格&编号等
2、支付模式 - 状态& 支付接口 & 负数等
3、折扣处理 - 优惠券(重复使用、重新获取)&积分&重放等
#详细点:
1、熟悉常见支付流程
选择商品和数量-选择支付及配送方式-生成订单编号-订单支付选择-完成支付
2、熟悉那些数据篡改
商品编号ID,购买价格,购买数量,支付方式,订单号,支付状态等 能不能修改。怎么判定支付成功还是支付失败(能不能修改),支付接口能不能被篡改
3、熟悉那些修改方式
替换支付(用3000支付6000的东西),
重复支付(支付完成,把支付流程数据包重新走一遍)
最小额支付
负数支付,溢出支付,优惠券支付等
#章节内容:
1、权限相关-越权&访问控制&未授权访问等
2、购买支付-数据篡改&支付模式&其他折扣等
一、数据篡改-修改价格&数量&产品
1.修改数量达到价格变动
2.修改单价达到价格变动
3.修改产品达到低价购买
4.修改接口达到成功购买
【例】:大米CMS - 修改数量、价格、产品
在这个案例中,购买商品时,商品的价格和数量是以数据包提交的数据为准,从而导致最终付款金额被篡改
访问:http://localhost:8085/dami/index.php?s=/articles/127.html
1. 先登录账号,点击购买时抓包:
发现数量qty和price都是参数的形式

2. 修改价格(将6000改为6),重新发包:


3. 修改数量(将1改为-1),重新发包


4. 修改产品,用产品1的价格(5400元)去购买产品2(6000元),以低价商品的价格买到高价产品
① 购买“大米测试产品”(6000元):http://localhost:8085/dami/index.php?s=/articles/127.html
购买时抓取的数据包:
GET /index.php?m=Member&a=gobuy&iscart=0&id=127&name=%E5%A4%A7%E7%B1%B3%E6%B5%8B%E8%AF%95%E4%BA%A7%E5%93%81&qty=1&price=6000>ype=%E7%81%B0%E8%89%B2&pic=/Public/Uploads/thumb/thumb_1393218295.jpg HTTP/1.1
② 购买“小米cms”(5400元):http://localhost:8085/dami/index.php?s=/articles/70.html
购买时抓取的数据包:
GET /index.php?m=Member&a=gobuy&iscart=0&id=70&name=%E5%A4%A7%E7%B1%B3%E6%89%8B%E6%9C%BACMS&qty=1&price=5400>ype=%E7%81%B0%E8%89%B2&pic=/Public/Uploads/thumb/thumb_1393218295.jpg HTTP/1.1
③ 修改数据包,以5400的价格去购买6000的东西
拿6000数据包,对5400的数据包的商品名和商品图片等内容(价格和数量保持不变),进行替换:

放出数据包,实现了5400的价格购买了大米测试产品(6000)

二、支付接口修改 - 修改支付方式-订单号&数量&优惠券
1、修改数量达到价格变动2、修改订单达到底价购买
3、优惠券重放使用&重领使用
【例】:damicms - 修改支付接口
1. 点击购买时,抓取支付接口的数据
抓取数据包:
/gateway.do?_input_charset=utf-8&logistics_fee=0.00&logistics_payment=SELLER_PAY&logistics_type=EXPRESS¬ify_url=http%3A%2F%2Fwww.myweb.com%2Findex.php%2FPublic%2Fshouquan&out_trade_no=GB1718264900-9&partner=2088002530455064&payment_type=1&price=6000&quantity=1&receive_address=111111111111&receive_mobile=15888888888&receive_name=test111&return_url=http%3A%2F%2Fwww.myweb.com%2FTrade%2Fap_danbao%2Freturn_url.php&seller_email=admin%40126.com&service=create_partner_trade_by_buyer&show_url=http%3A%2F%2Fwww.damicms.com%2FPublic%2Fdonate&subject=%E5%A4%A7%E7%B1%B3%E6%B5%8B%E8%AF%95%E4%BA%A7%E5%93%81&sign=4b8ee53c256c2f9b8af57dc1962a7aad&sign_type=MD5

2. 把支付接口换成自己的,如果最后商品能支付成功后,钱就到了自己的账户,
当然如果对方在支付成功后判断了返回的支付状态里面不是自己的账户信息,就会判定支付失败
三、折扣处理 - 优惠券 &支付接口修改 -订单号
【例】:niushop
1. 新建一个商品,价格为1000元
2.修改购买数量:
购买时抓包,发现数据包中没有出现商品的价格(价格无法修改),但是有购买数量(修改数量为0.000001)

结果最终支付金额被修改为0.1元

3. 优惠券问题
情况一:优惠券只能领取一次(摸清优惠券的编码规律)
情况二:优惠券可以重复使用 - 重放数据包
情况一:优惠券只能领一次(摸清优惠券的编码规律)
① 分别抓取到使用优惠券和没有使用优惠券时支付时的数据包,
post请求,DATA差异:发现use_coupon的数值不同

② 多次尝试,发现优惠券是有编码的,编码规律就是数字+1
抓取未使用优惠券时的订单数据包
然后把use_coupon值修改为200,重新发包

发现最终支付价格变成了使用优惠券后的价格:

修复:把优惠券加密,或者存放在数据库中,加密放在别的地方,让别人猜。
4. 订单问题
① 到付款的时候,抓取数据包,数据包中出现了“订单编号”:
② 记录一下订单金额为1000的数据包:
/index.php?s=/wap/pay/getpayvalue&out_trade_no=1648272697757(1000块钱的订单编号)
③ 一次购买10件的数据包,订单金额为100000,抓取数据包
/index.php?s=/wap/pay/getpayvalue&out_trade_no=1648272342449(100000块钱的订单编号)
1000数据包:
订单数据:/index.php?s=/wap/pay/getpayvalue&out_trade_no=1648272697757
付款数据:/index.php?s=/wap/pay/wchatpay&no=1648272697757
10000数据包:
订单数据:/index.php?s=/wap/pay/getpayvalue&out_trade_no=1648272842264
付款数据:/index.php?s=/wap/pay/wchatpay&no=1648272842264
这个时候,想用1000的数据包来支付10000的东西
100000的订单,支付时抓包,并用1000订单的数据信息去修改,看结果是否变成1000的支付信息
在10000这里点过去,把订单编号变成1000,他也变成了1000付款(但是没有成功,应该是有过滤了。)
会出现几种情况:
修改1000的订单去购买100000的订单 最终价格100000 订单商品还是为1000的
修改100000的订单去购买1000订单 最终价格1000 订单为100000的商品(有较大的安全问题)
修改100000订单去购买1000订单 最终价格1000 订单为1000的商品
有没有安全问题应该是看最终付款的商品价格。解决这个问题很简单,在购买的时候有一个订单id=1,在购买10000的商品的时候订单id=2
id编号对应了支付金额
订单1对应1000的商品
订单2对应10000的商品
这里如果修改其中一个,比如id,最后商品对应不上,会发生错误,说明进行了过滤。

有没有检测订单编号和对应商品是否一致
四、实例-演示站交易支付逻辑安全
【例】:奇乐CMS - guarantee1
① 购买时,抓包
__token__=a7146a632a21b04459f29d6717970f5a&id=11&title=%E6%88%BF%E5%9C%B0%E4%BA%A7%E7%BD%91%E7%AB%99%EF%BC%8C%E6%9D%836%E7%AB%99+%E5%A4%9A%E5%B9%B4%E8%80%81%E7%AB%99+%E7%9B%AE%E5%89%8DIP1.6%E4%B8%87+%E6%97%A5%E6%94%B6%E5%BD%9510w%2B&id_type=1&username=admin&price=6000.00&fee_type=1&buyer_pay=6180&seller_get=6000
price&买家支付价格含手续费&卖家收到的金额,都显示在请求数据中,可以修改这些数据
② 修改price,结果价格被修改

五、代码审计-业务支付逻辑&安全修复
支付类漏洞,看网站有没有购买支付功能
1.金额以数据库定义为准
2.购买数量限制为正整数
3.优惠券固定使用后删除
4.订单生成后检测对应值
(1)价格分析(可修改/不可修改):

【例】damicms - 找到相对应的文件web\Lib\Action\MenberAction.class.php
价格以数据包中的输入的数据为准(可修改)

nunstop -
① 价格 - 从数据库获取(不可更改)
找到相对应的文件:application\shop\controller\Member.php下的ordercreatesession方法
没有接收价格的输入,价格是从数据库获取的:

在goods表中看到了价格信息

这个就是通过数据库的查询来获取价格。
支付时抓取数据包,看这个价格是从哪里来的,触发以下3个地址
/index.php?s=/member/paymentorder
/index.php?s=/components/getlogininfo
/index.php?s=/components/platformadvlist
说明这三个数据包里面出现价格的换算。
application\shop\controller\Member发现价格换算

② 数量 - 接收输入(可更改)
在这里接受中没有进行过滤(数量可以被更改为负数、0、小数等)
$_SESSION['order_tag'] = 'buy_now';
$_SESSION['order_sku_list'] = $_POST['sku_id'] . ':' . $_POST['num'];
如何避免修改:把数量进行限制,限制为正整数
③ 优惠券
优惠券数据包:
触发地址:
/index.php?s=/order/ordercreate
goods_sku_list=1%3A1&leavemessage=&use_coupon=4&integral=0&account_balance=0&pay_type=0&buyer_invoice=&pick_up_id=0&express_company_id=1
找到对应的文件代码段:application\shop\controller\Order.php下的ordercreate方法
代码: $use_coupon = request()->post('use_coupon', 0); // 优惠券

继续跟踪(搜索use_coupon): $order_id = $order->orderCreate('1', $out_trade_no, $pay_type, $shipping_type, '1', 1, $leavemessage, $buyer_invoice, $shipping_time, $address['mobile'], $address['province'], $address['city'], $address['district'], $address['address'], $address['zip_code'], $address['consigner'], $integral, $use_coupon, 0, $goods_sku_list, $user_money, $pick_up_id, $express_company_id);

看领取优惠券是什么一个情况
数据包:
/index.php?s=/goods/receiveGoodsCoupon
coupon_type_id=2
找到相对应的文件

跟踪一下memberGetCoupon这个函数

这个就是判断这个coupon_type_id值是不是等于2,如果等于2就可以领优惠券
订单对应值
生成订单,在数据库就会生成唯一绑定值。
浙公网安备 33010602011771号