所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到后台數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到sql注入攻擊。
驗證繞過漏洞就是'or'='or'后台繞過漏洞,利用的就是AND和OR的運算規則,從而造成后台腳本邏輯性錯誤。
先舉個例子,你要登錄一個網站,上面讓你輸入用戶名字和密碼。那么,假如你輸入的用戶名是 admin ,但是你不知道密碼,你就輸入了一個 1' OR '1' = '1 ,那么,你就提交了兩個參數給服務器。假如,服務器拿這兩個參數拼SQL語句:SELECT T.* FROM XXX_TABLE TWHERE T.USER_ID = '/*param1*/'AND T.PASSWORD = '/*param2*/'那么,你提交的兩個參數就使SQL文變成了:SELECT T.* FROM XXX_TABLE TWHERE T.USER_ID = 'admin'AND T.PASSWORD = '1' OR '1' = '1'那么,這個SQL原來的校驗功能就被你繞過去了,你的這種行為就稱之為SQL注入。
public boolean login(String cardid,String password) { boolean rtn=false; try { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "test2016", "8656553"); Statement st=conn.createStatement(); //這種方式會造成SQL注入 //String sql="select * from bankcard where card_id='"+cardid+"'and password='"+password+"'and state='1'"; //注入登錄 String sq="select * from bankcard where card_id='admin'and password='1'or'1'='1'"; ResultSet rs=st.executeQuery(sq); rtn=rs.next(); rs.close(); st.close(); conn.close(); } catch (ClassNotFoundException | SQLException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } return rtn; }
public void testLogin() { test01 t=new test01(); if(t.login("286", "56")) { System.out.println("登錄成功"); } else { System.out.println("卡號錯誤"); } }