如何sql注入攻擊
❶ sql注入攻擊的原理以及防範措施
SQL注入攻擊的原理及防範措施
SQL注入攻擊,是發生在Web程序中資料庫層的安全漏洞。其主要原因是程序對用戶輸入數據的合法性未進行判斷和處理,導致攻擊者在Web應用程序中插入惡意SQL語句,以非法操作資料庫伺服器執行非授權查詢,進而獲取數據信息。
SQL注入的原理主要包括以下幾點:惡意拼接查詢、利用注釋執行非法命令、傳入非法參數和添加額外條件。攻擊者通過在用戶輸入中加入SQL命令,如果程序未進行檢查,這些命令將被誤認為正常執行,攻擊者可執行非預期命令或訪問未授權數據。
防範SQL注入方法主要有:嚴格區分用戶許可權、強制使用參數化語句、使用資料庫安全參數、增強用戶輸入驗證和多層環境下的身份驗證。確保資料庫操作安全,避免SQL注入攻擊,需要開發者在設計時嚴格控制用戶輸入,使用安全的編程實踐。
數字注入點、字元注入點和搜索注入點是常見的SQL注入類型,它們主要出現在鏈接地址、數據參數、cookie信息和HTTP請求頭中。通過輸入`AND 1=1`等來判斷注入點是否有效,使用參數化語句可以防止大部分SQL注入攻擊。
參數化語句將用戶輸入作為參數傳遞,而非直接嵌入SQL語句,這可以防止SQL注入攻擊。SQL Server資料庫提供了安全參數集合,有助於防止惡意注入攻擊。驗證用戶輸入內容、類型和長度,過濾特殊字元,是防範SQL注入的有效手段。
存儲過程、陷阱賬戶等技術也可以在特定場景下用於防範SQL注入。在多層應用環境中,實施多層身份驗證,確保各層協同工作,同時對用戶輸入進行嚴格驗證,是防範SQL注入攻擊的重要策略。
通過綜合採用以上防範措施,可以顯著降低SQL注入攻擊的風險,保護數據安全。預防SQL注入攻擊,是開發者、安全專家和所有依賴Web應用程序的組織應關注的核心問題。
❷ 什麼是sql注入,如何防止sql注入
SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到後台資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊.
SQL注入攻擊實例:
比如在一個登錄界面,要求輸入用戶名和密碼:
可以這樣輸入實現免帳號登錄:
用戶名: 『or 1 = 1 –
密 碼:
點登陸,如若沒有做特殊處理,那麼這個非法用戶就很得意的登陸進去了.(當然現在的有些語言的資料庫API已經處理了這些問題)
這是為什麼呢? 下面我們分析一下:
從理論上說,後台認證程序中會有如下的SQL語句:
String sql = "select * from user_table where username=
' "+userName+" ' and password=' "+password+" '";
當輸入了上面的用戶名和密碼,上面的SQL語句變成:
SELECT * FROM user_table WHERE username=
'』or 1 = 1 -- and password='』
分析SQL語句:
條件後面username=」or 1=1 用戶名等於 」 或1=1 那麼這個條件一定會成功;
然後後面加兩個-,這意味著注釋,它將後面的語句注釋,讓他們不起作用,這樣語句永遠都能正確執行,用戶輕易騙過系統,獲取合法身份。
這還是比較溫柔的,如果是執行
SELECT * FROM user_table WHERE
username='' ;DROP DATABASE (DB Name) --' and password=''
….其後果可想而知…
防SQL注入:
下面我針對JSP,說一下應對方法:
1.(簡單又有效的方法)PreparedStatement
採用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。
使用好處:
(1).代碼的可讀性和可維護性.
(2).PreparedStatement盡最大可能提高性能.
(3).最重要的一點是極大地提高了安全性.
原理:
sql注入只對sql語句的准備(編譯)過程有破壞作用
而PreparedStatement已經准備好了,執行階段只是把輸入串作為數據處理,
而不再對sql語句進行解析,准備,因此也就避免了sql注入問題.
2.使用正則表達式過濾傳入的參數
要引入的包:
import java.util.regex.*;
正則表達式:
private String CHECKSQL = 「^(.+)\sand\s(.+)|(.+)\sor(.+)\s$」;
判斷是否匹配:
Pattern.matches(CHECKSQL,targerStr);
下面是具體的正則表達式:
檢測SQL meta-characters的正則表達式 :
/(\%27)|(』)|(--)|(\%23)|(#)/ix
修正檢測SQL meta-characters的正則表達式 :/((\%3D)|(=))[^ ]*((\%27)|(』)|(--)|(\%3B)|(:))/i
典型的SQL 注入攻擊的正則表達式 :/w*((\%27)|(』))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix
檢測SQL注入,UNION查詢關鍵字的正則表達式 :/((\%27)|(』))union/ix(\%27)|(』)
檢測MS SQL Server SQL注入攻擊的正則表達式:
/exec(s|+)+(s|x)pw+/ix
等等…..
3.字元串過濾
比較通用的一個方法:
(||之間的參數可以根據自己程序的需要添加)
publicstaticbooleansql_inj(Stringstr)
{
Stringinj_str="'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
Stringinj_stra[]=split(inj_str,"|");
for(inti=0;i<inj_stra.length;i++)
{
if(str.indexOf(inj_stra[i])>=0)
{
returntrue;
}
}
returnfalse;
}
❸ 求教誰給講講SQL注入攻擊的步驟
第一步:SQL注入點探測。探測SQL注入點是關鍵的第一步,通過適當的分析應用程序,可以判斷什麼地方存在SQL注入點。通常只要帶有輸入提交的動態網頁,並且動態網頁訪問資料庫,就可能存在SQL注入漏洞。如果程序員信息安全意識不強,採用動態構造SQL語句訪問資料庫,並且對用戶輸入未進行有效驗證,則存在SQL注入漏洞的可能性很大。一般通過頁面的報錯信息來確定是否存在SQL注入漏洞。
第二步:收集後台資料庫信息。不同資料庫的注入方法、函數都不盡相同,因此在注入之前,我們先要判斷一下資料庫的類型。判斷資料庫類型的方法有很多,可以輸入特殊字元,如單引號,讓程序返回錯誤信息,我們根據錯誤信息提示進行判斷,還可以使用特定函數來判斷。
第三步:猜解用戶名和密碼。資料庫中的表和欄位命名一般都是有規律的,通過構造特殊的SQL語句在資料庫中依次猜解出表名、欄位名、欄位數、用戶名和密碼。
第四步:查找Web後台管理入口。Web後台管理通常不對普通用戶開放,要找到後台管理的登錄網址,可以利用Web目錄掃描工具快速搜索到可能的登錄地址,然後逐一嘗試,便可以找到後台管理平台的登錄網址。
第五步:入侵和破壞。一般後台管理具有較高許可權和較多的功能,使用前面已破譯的用戶名、密碼成功登錄後台管理平台後,就可以任意進行破壞,比如上傳木馬、篡改網頁、修改和竊取信息等,還可以進一步提權,入侵Web伺服器和資料庫伺服器。