日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

OWASP列舉的Web應用程序十大安全漏洞 - SQL注入

作者:Survivor001 更新時間: 2022-02-12 編程語言

十大漏洞:SQL注入、跨站腳本、失效的訪問控制、失效的身份認真和會話、安全配置錯誤、敏感信息泄露、攻擊檢測與防范不足、跨站請求偽造、使用含有已知漏洞的組件、未受保護的APIs。在系統架構設計、技術選型和編碼階段就需要充分考慮安全性要求,避免各類Web應用安全漏洞。

SQL注入

1、原理

? ? ? SQL注入即是指web應用程序對用戶輸入數據的合法性沒有判斷,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,以此來實現欺騙數據庫服務器執行非授權的任意查詢,從而進一步得到相應的數據信息。它不是利用操作系統的BUG來實現攻擊,而是利用程序員編程時的疏忽。

例如,一般用戶登錄用的SQL語句為:SELECT * FROM user WHERE username='admin' AND password='passwd',此處admin和passwd分別為用戶輸入的用戶名和密碼,如果程序員沒有對用戶輸入的用戶名和密碼做處理,就可以構造萬能密碼成功繞過登錄驗證,如用戶輸入' or 1#,SQL語句將變為:SELECT * FROM user WHERE username='' or 1#' AND password='','' or 1為TRUE,#注釋掉后面的內容,所以查詢語句可以正確執行。

另外,通過or或者and 與1=1、1=2等組合即可判斷是否存在SQL注入的漏洞,例如:

http://xxxxxxxx?id=xxx AND 1=1 --

http://xxxxxxxx?id=xxx AND 1=2 --

如果前一個能返回正常信息而后一個不能,則可以判定會有id注入的可能。因為后者即使id正常,1=2永遠無法成立。一反一正說明注入的語句可能會正常運行。

2、危害

  1. 繞過登錄或者獲取到系統管理員權限
  2. 注入時如果數據庫權限設置不當,可能會查看到數據庫系統表、數據,甚至可以非法增刪改查數據等
  3. 如果權限設置不當,注入木馬或者利用存儲過程擴展功能操作操作系統的shell,比如master.dbo.xp_cmdshell,從而控制整個服務器
  4. 注入過程如果錯誤沒有正確處理,則可能暴露整個系統文件夾結構

3、防范方法

  1. 所有的查詢語句都使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中。當前幾乎所有的數據庫系統都提供了參數化SQL語句執行接口,使用此接口可以非常有效的防止SQL注入攻擊。
  2. 對進入數據庫的特殊字符(’”<>&*;等)進行轉義處理,或編碼轉換。
  3. 確認每種數據的類型,比如數字型的數據就必須是數字,數據庫中的存儲字段必須對應為int型。
  4. 數據長度應該嚴格規定,能在一定程度上防止比較長的SQL注入語句無法正確執行。
  5. 網站每個數據層的編碼統一,建議全部使用UTF-8編碼,上下層編碼不一致有可能導致一些過濾模型被繞過。
  6. 嚴格限制網站用戶的數據庫的操作權限,給此用戶提供僅僅能夠滿足其工作的權限,從而最大限度的減少注入攻擊對數據庫的危害。
  7. 避免網站顯示SQL錯誤信息,比如類型錯誤、字段不匹配等,防止攻擊者利用這些錯誤信息進行一些判斷。
  8. 在網站發布之前建議使用一些專業的SQL注入檢測工具進行檢測,及時修補這些SQL注入漏洞。

具體在軟件開發層面,表現在以下:

  1. 前端表單進行參數格式控制;
  2. 后臺進行參數格式化,過濾所有涉及sql的非法字符;可通過攔截器統一攔截
//過濾 sql注解、關鍵字、符號等

static String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|"+ "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";

static Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);//表示忽略大小寫

/***************************************************************************

?* 參數校驗@param str ep: "or 1=1"

?*/

public static boolean isSqlValid(String str) {

Matcher matcher = sqlPattern.matcher(str);

if (matcher.find()) {

System.out.println("參數存在非法字符,請確認:"+matcher.group());//獲取非法字符:or

return false;

}

return true;

}
  1. ?持久層使用參數化的持久化sql,使用預編譯語句集,切忌使用拼接字符串;例如spring的jdbcTemplate防止sql注入,mybatis防止sql注入,jpa防止sql注入。
String sql= "select * from user where name=?";

PreparedStatement ps = conn.prepareStatement(sql);

ps.setString(1, name);

ResultSet rs = ps.executeQuery();

原文鏈接:https://blog.csdn.net/qq_31142237/article/details/122875456

欄目分類
最近更新