如何在 Insert, Update 中使用 SQL Injection

Gordon Ueng
3 min readJan 31, 2020

--

這個月台灣某公司開了一個網頁小遊戲,前 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 的結果

如果各位大大有什麼更厲害的招數,歡迎跟我分享 ><

--

--