SQL注入(別人的寫的不錯啊)

 

最常用的SQL注入攻擊,就是繞過用戶的身份驗證。

    先看看一個用戶身份驗證的代碼吧,假設頁面爲login.aspx。

        string strName = Request["name"].ToString();
        string strPSD = Request["password"].ToString();
        string strSQL = "select * from tbUser where name='" + strName + "'and password='" + strPSD + "'";

    假設提交的數據爲“login.aspx?name=smallfools&password=123”,那麼strSQL的運行結果爲:

    select * from tbUser where name='smallfools' and password='123'

    然後運行該SQL語句,如果返回的記錄條數不爲0,則說明用戶身份驗證成功。

    從代碼上看來,一切OK,可是事實上並非如此。假設一個用戶在“姓名”文本框中輸入“admin”,在密碼框裏輸入“11' or 1=1”,然後提交這兩個數據。

    那麼,strName的值爲“admin”,strPSD的值爲“11' or 1=1”,再將這兩個值代入strSQL,那麼strSQL的值爲:

select * from tbUser where name='admin' and password='11' or 1=1

    以上SQL語句的運行結果會怎麼樣?很明顯,無論name和password的值是什麼,只要or後面的值爲true,那麼返回結果就是true,所以,以上SQL語句可以返回tbUser表中的所有記錄,如下圖所示。

查看更多精彩圖片

 

    在上圖中可以看出,以上SQL語句將返回表中的所有記錄。

    除此之外,還有一種SQL注入攻擊的方法,那就是在“姓名”文本框中輸入“admin' or 1=1 --”,在密碼框裏隨便輸入些什麼,如“11”,然後提交這兩個數據。

    那麼,strName的值爲“admin' or 1=1 --”,strPSD的值爲“11”,再將這兩個值代入strSQL,那麼strSQL的值爲:

select * from tbUser where name='admin' or 1=1 --' and password='11'

    SQL中“--”符號爲註釋的符號,因此,--後的所有代碼將不會執行,所以,以上語句相當於

select * from tbUser where name='admin' or 1=1

    以上語句就更好理解了,無論name是否爲true,只要or後面的條件爲true,就返回true,所以以上SQL也會返回tbUser表中的所有數據,如下圖所示:

查看更多精彩圖片



   在上圖中可以看出,以上SQL語句將返回表中的所有記錄。

     這就是一個典型的SQL注入攻擊,攻擊方法很簡單,沒有使用任何黑客手段,僅僅是利用了網頁編寫的漏洞來完成的,因此,這種功擊是病毒軟件和防火牆所無論防範的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章