1. 程式人生 > >SQL注入的一個簡單例項

SQL注入的一個簡單例項

<p>很多Web應用程式都使用資料庫來儲存資訊。SQL命令就是前端Web和後端資料庫之間的介面,使得資料可以傳遞至Web應用程式。很多Web站點都會利用使用者輸入的引數動態地生成SQL查詢要求,攻擊者通過在URL、表單域,或者其他的輸入域中輸入自己的SQL命令,以此改變查詢屬性,騙過應用程式,從而可以對資料進行不受限的訪問。</p>

以JSP+SQL Server環境為例,對於一個正常的登入表單,輸入正確的賬號和密碼之後,JSP程式會查詢資料庫:如果存在此使用者並且密碼正確,將會成功登入;如果使用者不存在或者密碼不正確,則會提示賬號或密碼錯誤。

然而當輸入使用者名稱: ‘or 1=1–,密碼為空時,卻發現可以正常登入,顯然資料庫中不存在這樣一個使用者。

實際上,登入處最終呼叫程式碼如下:

public boolean findAdmin(Admin admin)
    {
    String sql = "select count(*) from admin where username='" + admin.getUsername() + "'and password='" + admin.getPassword() + "'"  //SQL查詢語句
    try {
        Resultset res = this.conn.creatStatement().executQuery(sql);
        //執行sql語句
        if(res.next())
        {
            int i = res.getInt(1);//獲取第一列的值
            if (i>0)
            {return true;} //如果結果大於0,則返回true
        }
        } catch (Exception e) {
        e.printStackTree();//列印異常資訊
        }
        return false;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

上面程式段的意義很清楚:在資料庫中查詢username=xxx and password=xxx的結果個數。如果結果個數大於0,表示存在這樣的使用者,返回true,代表登入成功,否則返回false,代表登入失敗。

這段程式碼本身沒有什麼錯誤。正常情況下,當一個使用者 username='test'password='test'時,執行了sql語句 select count(*) from admin where username = 'test' and password = 'test' 但是當輸入username="'or 1=1--"

時,在java程式中String型別變數sql 為 " select count(*) from admin where username = ' 'or 1=1-- ' and password = ' ' " 這句sql語句在執行時,"--""and"及之後的語句都註釋掉了,相當於執行了 select count(*) from admin where username = ' 'or 1=11=1是永遠為true的,所以該語句的執行結果實際上是admin表的行數,而不是符合輸入的username和password的行數,從而順利通過驗證。 這個例子中雖然注入的過程非常簡單,但可能的危害卻很大。如果在使用者名稱處輸入 "' or 1=1; drop table admin --" 由於SQL Server支援多語句執行,就可以把admin表drop掉了,後果不堪設想。