• Web Security 03.10.2014

    SQL Injection 的測試與防範

    網站後端的資料通常會存放在資料庫中,(MySQL or MS SQL Server)

    網站的程式資料查詢或是更新,將對後端資料庫進行SQL 語法的執行

    因此,只要巧妙的設計輸入值,就會造成該 SQL 語法執行其他非預期的結果

    舉例來說,這個 SQL 語法

    Select Name from Users where password = $pwd

     

    這個例子中,$id 為使用者輸入參數,最常見的方式為在 Where 的條件中加入 or 1 = 1 —

    Select Name from Users where password = ‘a’ or 1 = 1 —Select Name from Users where password = ‘b’ or 1 = 1 —

    Select Name from Users where password = ‘c’ or 1 = 1 —

     

    如以一來該 SQL statement 永遠成立,不論 where 條件為何都會執行

    如果這種情況發生在登入密碼的檢查的話就很危險

    因為不論該輸入的密碼為何,該 SQL 都會成立

     

    SQL injection 兩種策略

    1. 透過受害者網頁或是應用程式介面:

    這種方式指的是,測試相關的 query or login頁面的輸入,是否有條件的限制

    通常會透過上述 or 1 = 1 的方式測試

     

    2. 透過 Email 或是其他方法讓受害使用者執行

    這種方式為駭客事先準備好一定的 SQL scripts or http request,並且透過社交工常,讓受害者點擊並執行

     

    SQL injection 五種技巧

    歸類來說,SQL injection 的語法有五種技巧,分述如下:

    1. Query 1 UNION Query 2: 

    透過 UNION 可以將兩種 query 的集合彙整起來,

    第一個 query 1 為程式原本預期的,第二個 query 2為駭客加入的

     

    2. Boolean

    運用邏輯運算 true or false 來得知 SQL server 的資訊,

    例如: 如何得知 Table or Column Name?

    可以查詢:

    請問第一個字元是否為 a ?

    請問第一個字元是否為 b ? ….

    請問第二個字元是否為 a ?

    這種方式比較費時,當然也有自動化工具可以完成這些測試

     

    3. Error 錯誤訊息

    透過SQL Server 會在語法錯誤時,回傳錯誤訊息於網頁或是 http request 時,

    可以得知進一步的訊息

    例如:

    SQL 版本

    語法錯誤

    資料型態轉換錯誤

     

    4. HTTP request

    設計 http request 將相關的 SQL 指令透過 http request 傳送

    或是透過 email 讓使用者觸發該 http request

     

    5. Sleep

    當網頁或是 http response 不會回傳任何訊息、執行結果、或是錯誤訊息時,

    透過資料庫 sleep 的指令,可以間接知道指令執行的狀況,例如:

    “請問 Table Name 第一個字元是否為 ‘a’,是的話 sleep 10秒”

    因此,透過該應用程式反應的時間,來判斷是否有執行成功.

     

    如何測試?

    這邊舉一個簡單的例子

    情境:登入時的帳號密碼驗證,

    使用者輸入 UserName 與 Password 之後

    帳號密碼存放於資料庫,因此就會進行這樣的查詢

     

    SELECT * FROM Users

    WHERE

    Username=’$username’ AND Password=’$password’

     

    透過 or 1 = 1 的輸入讓 SQL 語法變成

     

    SELECT * FROM Users

    WHERE

    Username=’1’ OR ‘1’ = ‘1’

    AND
    Password=’1’ OR ‘1’ = ‘1’

    因此,該使用者或是密碼不管打什麼,該 SQL 皆會成立

     

    假設該  UserName 與 Password 是透過 HTTP GET 來傳送的話,

    最後傳送的 http GET request為:

     

    http://www.SQLInjection.com/login.php?Username=’1’ OR ‘1’ = ‘1’ & Password=’1’ OR ‘1’ = ‘1’

     

    網站安全防護?

    1. prepared statements (aka parameterized queries)

    將相關的參數輸入見證檢查完後,在組合出適當的 SQL statement

     

    2. Input validation

    單純透過前端網頁 JavaScript的檢查還不足夠,

    還需要於後端網站程式檢查輸入的參數合法性、字元、長度等

     

    3. 網站與資料庫回傳訊息

    將 database 執行結果、錯誤訊息等回傳

    讓http response 或是網頁回傳的訊息,不會包含 SQL 相關的執行結果或是錯誤

     

    4. Firewall  or IDS

    Firewall 與 IDS 針對 HTTP Request 內容,可疑的 SQL injection (例如 1 = 1 )進行驗證

     

    Posted by Tony @ 10:41 am

    Tags: , , , ,

  • Leave a Reply

    Your email address will not be published.