[閒聊] ZD-2023-00143已回收

看板Marginalman作者 (愛麗絲)時間2年前 (2023/06/04 12:08), 編輯推噓2(200)
留言2則, 2人參與, 2年前最新討論串1/1
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 平台公開了之後才又跑來跟我說要退回不公開 這次不知道會不會也是這樣 不過反正我現在就要發文 都快三個月前的事了,時間應該夠了吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.16.175 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1685851704.A.B0F.html

06/04 12:14, 2年前 , 1F
大師
06/04 12:14, 1F

06/04 12:20, 2年前 , 2F
P幣洗到一億會財富自由嗎 是有差逆
06/04 12:20, 2F
文章代碼(AID): #1aV0uuiF (Marginalman)