接著來介紹一種叫做Blind SQL Injection的技術,它也是SQL Injection的一種,但跟我們之前介紹的SQL Injection有點差異。之前介紹的SQL Injection是透過利用系統因為讀取到錯誤SQL而吐出來的系統錯誤來決定我們要寫什麼SQL語法,才能讓系統吐想看的資料,而Blind SQL Injection則不大一樣,在這種狀況下,系統不會有明確的錯誤訊息,只能靠觀察伺服器有沒有回應,類似true或false的方式來判斷SQL式是不是有用。
舉例來說,有個網站的網址是「hxxps://my-shop.com?article=4」,我們先推測這個網址的含意是要顯示資料庫中第4篇文章,所以在資料庫進行查詢的SQL式可能如下:
SELECT * from articles where article_id = 4
那要如何驗證呢?我們可以透過把參數改為「4 AND 1 = 1」,來看看頁面的反應,而這時資料庫中的SQL式可能就變成如下:
SELECT * from articles where article_id = 4 AND 1 = 1
這時如果我們發現顯示的頁面跟原本的長的一樣,就可以進行下一個驗證步驟;反之,若頁面出現404 Page not found或其他的錯誤,就代表這個網頁沒辦法應用Blind SQL Injection的技術。
接下來我們把參數改為「4 AND 1 = 2」,來看看頁面的反應,而這時資料庫中的SQL式可能就變成如下:
SELECT * from articles where article_id = 4 AND 1 = 2
這時我們如果發現頁面資料無法正常顯示,就可以更加肯定這一頁是可以應用Blind SQL Injection的技術,因為上述的SQL語法的邏輯是錯誤的,所以就會導致頁面無法正常顯示。
這裡有一個小技巧,有時候輸入執行的SQL式需要依些時間執行,這時可以使用「article = 4; sleep(10) --」的句法,先擱置一些時間後才完成網頁連線。
接著WebGoat在第5步提供一個挑戰,但目前還沒有成功解出來,等解出來後再分享解法給大家囉~