目標說明
hackthebox上的web靶機,名稱為diogenes rage
,情境是販賣機
安全風險
此目標發現1個安全風險
- 購買優惠券的API有條件競爭問題
安全優化建議
- 安排代碼檢查,確保在不允許並發的流程中使用
async
而引發條件競爭問題 - 針對優惠券等相關功能進行並發測試,確保無其他條件競爭問題
攻擊手法
flag
要花錢才能取得,所以要想辦法把手上的錢變多
分析outer/index.js
代碼發現條件競爭問題,async
允許並發執行,這意謂著我可以同一時間一次購買多個優惠券
router.post('/api/coupons/apply', AuthMiddleware, async (req, res) => {
...omit...
if (coupon_code) {
if (user.coupons.includes(coupon_code)) {
return res.status(401).send(response("This coupon is already redeemed!"));
}
return db.getCouponValue(coupon_code)
.then(coupon => {
if (coupon) {
return db.addBalance(user.username, coupon.value)
.then(() => {
db.setCoupon(user.username, coupon_code)
.then(() => res.send(response(`$${coupon.value} coupon redeemed successfully! Please select an item for order.`)))
})
.catch(() => res.send(response("Failed to redeem the coupon!")));
}
res.send(response("No such coupon exists!"));
})
}
...omit...
在正常流程中一次只能買一張價值1元面額的優惠券,但因為有條件競爭漏洞,我們可以用並發的方式,在同一時間申請多張優惠券
flag
價格為13.37元,所以我們至少要對/api/coupons/apply
並發14次以上請求,成功後就能利用這些錢去買flag
補充說明
nodejs的async
在使用 async
時,如果存在多個非同步操作共享同一個資料或狀態,而這些非同步操作可能會同時進行讀寫操作,那麼就有可能出現條件競爭漏洞。 這種情況並非 async
本身引發的問題,而是由於並發操作共享資源而導致的。
例如,假設有兩個非同步函數 A 和 B,它們都會對同一個變數進行讀寫運算。 由於非同步函數的執行順序是不確定的,A 和 B 可能會同時讀取和修改這個變量,從而產生競爭條件。 這樣的情況下,如果沒有正確地處理共享資源的訪問,就可能導致資料不一致或錯誤的行為。
參考文獻
https://domdom.tistory.com/293
https://b3cl4ssy.tistory.com/481
https://www.freebuf.com/articles/web/340879.html