[閒聊] ZD-2023-00143

作者: fxfxxxfxx (愛麗絲)   2023-06-04 12:08:22
https://zeroday.hitcon.org/vulnerability/ZD-2023-00143
這次比起上次的繞過註冊驗證碼又更沒有實際危害
雖然可以洗P幣,但條件非常多
必須是能開盤的板主才能穩定達成
而且賭盤都會留紀錄,就算真的發生了也可以事後追討
PTT 站方到最後都沒有回應,可能是覺得不值得修吧
不過我自己是覺得蠻好玩的
因為是三月回報的,其實我也忘了有這一回事
早上收到狀態變成公開的信才想起來
總之,在我找到能無限驗證 PTT 帳號的方法之後
我開始無聊翻翻 PTT 的程式碼
之後找到了 PTT 處理樂透的部份
對於樂透,在看板的資料夾下會有兩個檔案:
分別是紀錄各選項數目的 FN_TICKET_OUTCOME
以及紀錄使用者選什麼選項的 FN_TICKET_USER
當使用者買了 A 選項共 X 張時
會讀取 FN_TICKET_OUTCOME 並把 A 選項總數增加 X
並在 FN_TICKET_USER 紀錄使用者某某買了 X 張 A
等到開獎時,用 FN_TICKET_OUTCOME 計算賠率
並用 FN_TICKET_USER 對每個中獎的紀錄發放相應的P幣
最後把這兩個檔案刪除
假如我刻意卡在購買彩券的頁面,等開獎之後才購買會發生什麼事?
答案是 PTT 會檢查檔案存不存在所以會沒辦法購買
但一個很明顯的問題就出現了:
假如我卡在購買頁面,等待開獎之後繼續等
等到下一次賭盤又開啟時再按 ENTER 會發生什麼事
答案是可以購買,會直接寫到下一次的賭盤紀錄 ^_^
到這裡就有一個可以洗錢的方案了
條件是必須是有開盤權限的人
首先板主開一個單價 10 元的樂透
另一個使用者 A 停在購買頁面後
板主重新開一個單價 10000 元的樂透
使用者 A 此時再購買
最後板主取消賭盤退錢
就可以每張花 10p 買然後退 10000p 回來
直接翻 1000 倍
其實還有另一個增長更為快速的方法:
1. 板主開啟有兩個選項的樂透
2. 使用者A 停留在購買頁面
3. 板主結束樂透並開啟新的有三個選項的樂透
4. 使用者B 購買 Y-1 份樂透(選項3)
5. 使用者A 購買 X 份樂透(選項2)
6. 使用者B 購買 1 份樂透(選項3)
7. 板主開獎(選項3)
關鍵在第 5 步時
使用者 A 會因為只寫入前兩個選項的結果而造成
選項 3 在 FN_TICKET_OUTCOME 中歸零
到板主開獎時,賠率會是 X/1 = 1:X
但在發放獎金時使用的 FN_TICKET_USER 仍然有使用者B的紀錄
因此使用者B可以拿到 ((Y-1)X + 1X) * 0.95 = 0.95XY
其實不管是哪一個方法,增長速度都是非常快的
連續來個幾次就能突破 INT_MAX 上限了
P幣溢出成負的也不成問題
但因為我不是板主,沒辦法在站上測試
所以我只好拿原始碼自己架在我電腦上實驗
實驗後發現的確可以成功:
https://i.imgur.com/P12z68K.png
可以看到上方選項3 只有1份,但下方發獎金時發了23+1份
另外,若板主先開啟四個選項的樂透再開二個選項的樂透的話
便能讓使用者在後者下出不存在的第四個選項
在開獎印出選項名稱時,此時 betname[mybet] 是未初始化的 char[30]
因此可以 leak 出 stack 上的資訊
我有試過先Q一個人,把他的使用者資訊包含 hash 過的密碼 load 到 stack 上
看看有沒有辦法印出來
但排了好一陣子之後排不太出來,都會被洗掉
就放棄了
如果不是板主的話,就沒有辦法穩定洗錢
但想要惡搞系統還是挺容易的
譬如現在賭盤只有兩個選項
我們卡在購買界面
等到新的有三個選項的賭盤開啟之後再購買
就可以把選項三的紀錄洗掉
如果最後開前兩個選項賠率會減少
而如果最後開三賠率會暴增
甚至如果我們是最後下的,選項三會沒人中獎直接吞光
上次等到 HITCON ZeroDay 平台公開了之後才又跑來跟我說要退回不公開
這次不知道會不會也是這樣
不過反正我現在就要發文
都快三個月前的事了,時間應該夠了吧
作者: Mikotosama (鬼之子)   2023-06-04 12:14:00
大師
作者: rockyao   2023-06-04 12:20:00
P幣洗到一億會財富自由嗎 是有差逆

Links booklink

Contact Us: admin [ a t ] ucptt.com