如何在 Insert, Update 中使用 SQL Injection
這個月台灣某公司開了一個網頁小遊戲,前 50 名可以得到小小的獎品,至於是哪家我就不多說了。
身為一個工程師,看到網頁小遊戲,隨手送幾個 request 戳戳人家 server 也是很正常的。經過幾分鐘的研究之後,很快就可以找到他送 request 驗證分數的規則,然後把自己分數洗很高。
毫不意外的很多各路好手也都破解 request 該怎麼送,每個人分數都衝很高,但是光是這樣是無法滿足我的。
因為我不小心發現,這個可愛的小遊戲,會把 Error Message 送到 response 裡,包括 SQL syntax error
秉持著研究的精神,我送了在分數填了幾個不是數字的東西送給他的 server,身為一個 2020 年網頁遊戲,這種小伎倆應該是沒有用的吧
摁,我太小看他惹
第一次 SQL injection 就成功惹耶 (◐‿◑)
這裡記錄一下這次學到的新東西:
在 Insert, Update 裡面塞一個 Select 然後用 Error Message 看結果
首先他的 SQL 長的類似這樣
UPDATE user_score
SET score = 'SCORE'
WHERE userid = 'USER_ID'
舉例來說我們可以在 SCORE 填入 100' WHERE userid = 'other_id'; --
來修改別人的分數
不過很可惜的是他不支援 stacked query 沒辦法在分號後面接第二個 query
那就要想辦法把 query 塞到一個 update 的語句裡面
然後因為他會把 error message 送到前端,所以我們可以利用這個把結果送回來
這次使用到的語法是 updatexml,我們可以把我們想執行的 query 塞給這個 function ,讓他產生 XPATH syntax error,然後就可以看到結果惹
最後送出的 SCORE 大概是長這樣:
100' OR updatexml(null, (SELECT ...), 0) WHERE userid = 'id'; --
最後 query 會變成這樣:
UPDATE user_score
SET score = '100'
OR updatexml(null, (SELECT ...), 0)
WHERE userid = 'id'
會得到這應得 error message
XPATH syntax error: 'SELECT 的結果'
大概 4 john
但是他有一個限制就是只看得到 32 個 char 的結果
如果各位大大有什麼更厲害的招數,歡迎跟我分享 ><