02.价格篡改漏洞案例
价格篡改漏洞是指攻击者可以在前端页面中篡改商品价格,并在提交订单时将修改后的价格发送至后端,从而以篡改价格的方式获取商品的更低价格或者执行其他恶意操作。
示例代码:
前端部分代码展示了购物车页面,其中显示了商品的名称、描述、价格等信息,并提供了修改数量和提交订单的按钮。
<form method="post" action="#">
<table cellspacing="0" class="shop_table cart">
<!-- 省略部分HTML代码 -->
<tbody>
{{range .CartInfo}}
<tr class="cart_item">
<!-- 省略部分HTML代码 -->
<td class="product-price">
<span class="amount">${{.ProductPrice}}</span>
</td>
<!-- 省略部分HTML代码 -->
</tr>
{{end}}
<!-- 省略部分HTML代码 -->
</tbody>
</table>
</form>
后端部分代码展示了提交订单的接口,其中接收前端传来的订单信息,并在后端进行订单的处理和入库操作。
// 提交订单
{
DefaultQuery: "",
Path: "/order/submit",
Handler: func(writer http.ResponseWriter, request *http.Request) {
// 省略部分代码
var order UserOrder
var FirstOrder FirstUserOrder
err = json.NewDecoder(request.Body).Decode(&FirstOrder)
if err != nil {
http.Error(writer, err.Error(), http.StatusBadRequest)
return
}
// 调用函数提交订单
for _, item := range FirstOrder.OrderItems {
order.ProductName = item.ProductName
order.Quantity, err = strconv.Atoi(item.Quantity)
order.TotalPrice, err = strconv.ParseFloat(item.TotalPrice, 64)
order.DeliveryStatus = "已发货"
err = s.database.AddOrder(FirstOrder.UserID, order)
if err != nil {
http.Error(writer, err.Error(), http.StatusInternalServerError)
return
}
}
writer.WriteHeader(http.StatusOK)
writer.Write([]byte("订单提交成功"))
},
}
攻击示例:
攻击者可以利用浏览器的开发者工具或者其他网络调试工具,在购物车页面中将某些商品的价格进行篡改,例如将高价商品的价格修改为极低的价格。然后攻击者提交篡改后的订单,将修改后的价格发送至后端,后端可能会无条件地接收并处理这些篡改后的价格,导致订单价格与实际商品价格不符。
防御措施:
- 价格校验: 在前端页面提交订单前,应该对订单中商品的价格进行校验,确保订单中的价格与后端数据库中的价格一致。
- 防篡改机制: 在前端页面和后端接口中应该加入防篡改机制,例如在前端页面对价格进行加密或者签名处理,后端在接收到订单后进行价格解密或者验签,确保订单中的价格没有被篡改。
- 双重价格校验: 在后端接收到订单后,应该对订单中的价格进行二次校验,确保订单中的价格与商品的实际价格一致,避免篡改后的价格被接受。
- 限制价格修改权限: 对于敏感操作或者需要修改价格的功能,应该限制只有特定的管理员或者权限较高的用户才能执行,避免普通用户对价格进行任意修改。
通过以上防御措施,可以有效地防止价格篡改漏洞的利用,保障商城系统的安全性和稳定性。
靶场演示:
会话固定漏洞在靶场的**"加入购物车"**和"提交订单"位置,演示如下: