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