【SQL Server】--SQL隱碼攻擊

ZeroWM發表於2015-01-31

Sql Inject概念:

  百度解釋:通過SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器質性惡意的SQL命令。

  SQL隱碼攻擊指的是通過構件特殊的輸入作為引數傳入Web應用程式,而這些輸入大都是SQL語法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。

  SQL隱碼攻擊分為兩種:平臺注入、程式碼注入。


例項:

 

  牛腩新聞釋出系統 資料庫 新聞類別表

 

  查詢Id=1的新聞類別


嵌入惡意表示式1=1使where失去作用,恆真後,查詢出來的資料是所有的新聞類別名稱。

 

教訓:

1.      永遠不要信任使用者的輸入(正規表示式驗證)。

2.      永遠不要使用動態拼裝sql,可以使用引數化sql或者直接使用儲存過程進行資料查詢存取(我們常用的)。

3.      永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。

4.      不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。

5.      應用的異常資訊應該給出儘可能少的提示,最好使用自定義的錯誤資訊對元素錯誤資訊進行包裝。

6.      SQL隱碼攻擊採取輔助軟體或網站平臺來檢測。


SQL隱碼攻擊程式碼(Java)——2015年12月12日

/**	
	 * 使用者登入 演示sql注入
	 * 使用者名稱稱:sdfsdfdsf 
	 * 使用者密碼 'or '1'='1
	 * SQL語句:select * from t_user where user_id='sdfsdfdsf'and password=''or '1'='1'
	 * @param userId 使用者id 
	 * @param password 使用者密碼 'or '1'='1
	 * @return
	 */
	public boolean login(String userId,String password){
		String sql="select * from t_user where user_id='" +userId +"'and password='"+password +"'";
		System.out.println(sql);
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		boolean success=false;
		try {
			conn=DbUtil.getConnection();
			pstmt=conn.prepareStatement(sql);
			rs=pstmt.executeQuery();
			if(rs.next()){
				success=true;
				System.out.println("使用者和密碼正確!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			
			DbUtil.close(rs);
			DbUtil.close(pstmt);
			DbUtil.close(conn);
		}
		return success;
	}
	





相關文章