HTB diogenes rage

目標說明

hackthebox上的web靶機,名稱為diogenes rage,情境是販賣機

安全風險

此目標發現1個安全風險

  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