㈠ 什麼是sql注入式攻擊 如何防範
一、 SQL注入攻擊的簡單示例。
statement := "SELECT * FROM Users WHERE Value= " + a_variable + "
上面這條語句是很普通的一條SQL語句,他主要實現的功能就是讓用戶輸入一個員工編號然後查詢處這個員工的信息。但是若這條語句被不法攻擊者改裝過後,就可能成為破壞數據的黑手。如攻擊者在輸入變數的時候,輸入以下內容SA001』;drop table c_order--。那麼以上這條SQL語句在執行的時候就變為了SELECT * FROM Users WHERE Value= 『SA001』;drop table c_order--。
這條語句是什麼意思呢?『SA001』後面的分號表示一個查詢的結束和另一條語句的開始。c_order後面的雙連字元 指示當前行餘下的部分只是一個注釋,應該忽略。如果修改後的代碼語法正確,則伺服器將執行該代碼。系統在處理這條語句時,將首先執行查詢語句,查到用戶編號為SA001 的用戶信息。然後,數據將刪除表C_ORDER(如果沒有其他主鍵等相關約束,則刪除操作就會成功)。只要注入的SQL代碼語法正確,便無法採用編程方式來檢測篡改。因此,必須驗證所有用戶輸入,並仔細檢查在您所用的伺服器中執行構造 SQL命令的代碼。
二、 SQL注入攻擊原理。
可見SQL注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施。
SQL注入是目前比較常見的針對資料庫的一種攻擊方式。在這種攻擊方式中,攻擊者會將一些惡意代碼插入到字元串中。然後會通過各種手段將該字元串傳遞到SQLServer資料庫的實例中進行分析和執行。只要這個惡意代碼符合SQL語句的規則,則在代碼編譯與執行的時候,就不會被系統所發現。
SQL注入式攻擊的主要形式有兩種。一是直接將代碼插入到與SQL命令串聯在一起並使得其以執行的用戶輸入變數。上面筆者舉的例子就是採用了這種方法。由於其直接與SQL語句捆綁,故也被稱為直接注入式攻擊法。二是一種間接的攻擊方法,它將惡意代碼注入要在表中存儲或者作為原書據存儲的字元串。在存儲的字元串中會連接到一個動態的SQL命令中,以執行一些惡意的SQL代碼。
注入過程的工作方式是提前終止文本字元串,然後追加一個新的命令。如以直接注入式攻擊為例。就是在用戶輸入變數的時候,先用一個分號結束當前的語句。然後再插入一個惡意SQL語句即可。由於插入的命令可能在執行前追加其他字元串,因此攻擊者常常用注釋標記「—」來終止注入的字元串。執行時,系統會認為此後語句位注釋,故後續的文本將被忽略,不背編譯與執行。
三、 SQL注入式攻擊的防治。
既然SQL注入式攻擊的危害這么大,那麼該如何來防治呢?下面這些建議或許對資料庫管理員防治SQL注入式攻擊有一定的幫助。
1、 普通用戶與系統管理員用戶的許可權要有嚴格的區分。
如果一個普通用戶在使用查詢語句中嵌入另一個Drop Table語句,那麼是否允許執行呢?由於Drop語句關繫到資料庫的基本對象,故要操作這個語句用戶必須有相關的許可權。在許可權設計中,對於終端用戶,即應用軟體的使用者,沒有必要給他們資料庫對象的建立、刪除等許可權。那麼即使在他們使用SQL語句中帶有嵌入式的惡意代碼,由於其用戶許可權的限制,這些代碼也將無法被執行。故應用程序在設計的時候,最好把系統管理員的用戶與普通用戶區分開來。如此可以最大限度的減少注入式攻擊對資料庫帶來的危害。
2、 強迫使用參數化語句。
如果在編寫SQL語句的時候,用戶輸入的變數不是直接嵌入到SQL語句。而是通過參數來傳遞這個變數的話,那麼就可以有效的防治SQL注入式攻擊。也就是說,用戶的輸入絕對不能夠直接被嵌入到SQL語句中。與此相反,用戶的輸入的內容必須進行過濾,或者使用參數化的語句來傳遞用戶輸入的變數。參數化的語句使用參數而不是將用戶輸入變數嵌入到SQL語句中。採用這種措施,可以杜絕大部分的SQL注入式攻擊。不過可惜的是,現在支持參數化語句的資料庫引擎並不多。不過資料庫工程師在開發產品的時候要盡量採用參數化語句。
3、 加強對用戶輸入的驗證。
總體來說,防治SQL注入式攻擊可以採用兩種方法,一是加強對用戶輸入內容的檢查與驗證;二是強迫使用參數化語句來傳遞用戶輸入的內容。在SQLServer資料庫中,有比較多的用戶輸入內容驗證工具,可以幫助管理員來對付SQL注入式攻擊。測試字元串變數的內容,只接受所需的值。拒絕包含二進制數據、轉義序列和注釋字元的輸入內容。這有助於防止腳本注入,防止某些緩沖區溢出攻擊。測試用戶輸入內容的大小和數據類型,強制執行適當的限制與轉換。這即有助於防止有意造成的緩沖區溢出,對於防治注入式攻擊有比較明顯的效果。
如可以使用存儲過程來驗證用戶的輸入。利用存儲過程可以實現對用戶輸入變數的過濾,如拒絕一些特殊的符號。如以上那個惡意代碼中,只要存儲過程把那個分號過濾掉,那麼這個惡意代碼也就沒有用武之地了。在執行SQL語句之前,可以通過資料庫的存儲過程,來拒絕接納一些特殊的符號。在不影響資料庫應用的前提下,應該讓資料庫拒絕包含以下字元的輸入。如分號分隔符,它是SQL注入式攻擊的主要幫凶。如注釋分隔符。注釋只有在數據設計的時候用的到。一般用戶的查詢語句中沒有必要注釋的內容,故可以直接把他拒絕掉,通常情況下這么做不會發生意外損失。把以上這些特殊符號拒絕掉,那麼即使在SQL語句中嵌入了惡意代碼,他們也將毫無作為。
故始終通過測試類型、長度、格式和范圍來驗證用戶輸入,過濾用戶輸入的內容。這是防止SQL注入式攻擊的常見並且行之有效的措施。
4、 多多使用SQL Server資料庫自帶的安全參數。
為了減少注入式攻擊對於SQL Server資料庫的不良影響,在SQLServer資料庫專門設計了相對安全的SQL參數。在資料庫設計過程中,工程師要盡量採用這些參數來杜絕惡意的SQL注入式攻擊。
如在SQL Server資料庫中提供了Parameters集合。這個集合提供了類型檢查和長度驗證的功能。如果管理員採用了Parameters這個集合的話,則用戶輸入的內容將被視為字元值而不是可執行代碼。即使用戶輸入的內容中含有可執行代碼,則資料庫也會過濾掉。因為此時資料庫只把它當作普通的字元來處理。使用Parameters集合的另外一個優點是可以強制執行類型和長度檢查,范圍以外的值將觸發異常。如果用戶輸入的值不符合指定的類型與長度約束,就會發生異常,並報告給管理員。如上面這個案例中,如果員工編號定義的數據類型為字元串型,長度為10個字元。而用戶輸入的內容雖然也是字元類型的數據,但是其長度達到了20個字元。則此時就會引發異常,因為用戶輸入的內容長度超過了資料庫欄位長度的限制。
5、 多層環境如何防治SQL注入式攻擊?
在多層應用環境中,用戶輸入的所有數據都應該在驗證之後才能被允許進入到可信區域。未通過驗證過程的數據應被資料庫拒絕,並向上一層返回一個錯誤信息。實現多層驗證。對無目的的惡意用戶採取的預防措施,對堅定的攻擊者可能無效。更好的做法是在用戶界面和所有跨信任邊界的後續點上驗證輸入。如在客戶端應用程序中驗證數據可以防止簡單的腳本注入。但是,如果下一層認為其輸入已通過驗證,則任何可以繞過客戶端的惡意用戶就可以不受限制地訪問系統。故對於多層應用環境,在防止注入式攻擊的時候,需要各層一起努力,在客戶端與資料庫端都要採用相應的措施來防治SQL語句的注入式攻擊。
6、 必要的情況下使用專業的漏洞掃描工具來尋找可能被攻擊的點。
使用專業的漏洞掃描工具,可以幫助管理員來尋找可能被SQL注入式攻擊的點。不過漏洞掃描工具只能發現攻擊點,而不能夠主動起到防禦SQL注入攻擊的作用。當然這個工具也經常被攻擊者拿來使用。如攻擊者可以利用這個工具自動搜索攻擊目標並實施攻擊。為此在必要的情況下,企業應當投資於一些專業的漏洞掃描工具。一個完善的漏洞掃描程序不同於網路掃描程序,它專門查找資料庫中的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。所以憑借專業的工具,可以幫助管理員發現SQL注入式漏洞,並提醒管理員採取積極的措施來預防SQL注入式攻擊。如果攻擊者能夠發現的SQL注入式漏洞資料庫管理員都發現了並採取了積極的措施堵住漏洞,那麼攻擊者也就無從下手了。
㈡ SQL注入步驟和常用函數以及中文處理方法
第一節 SQL注入的一般步驟 首先 判斷環境 尋找注入點 判斷資料庫類型 這在入門篇已經講過了 其次 根據注入參數類型 在腦海中重構SQL語句的原貌 按參數類型主要分為下面三種 (A)ID= 這類注入的參數是數字型 SQL語句原貌大致如下 Select * from 表名 where 欄位= 注入的參數為ID= And [查詢條件] 即是生成語句 Select * from 表名 where 欄位= And [查詢條件](B) Class=連續劇 這類注入的參數是字元型 SQL語句原貌大致概如下 Select * from 表名 where 欄位= 連續劇 注入的參數為Class=連續劇 and [查詢條件] and = 即是生成語句 Select * from 表名 where 欄位= 連續劇 and [查詢條件] and = (C) 搜索時沒過濾參數的 如keyword=關鍵字 SQL語句原貌大致如下 Select * from 表名 where 欄位like %關鍵字% 注入的參數為keyword= and [查詢條件] and % = 即是生成語句 Select * from 表名 where欄位like % and [查詢條件] and % = % 接著 將查詢條件替換成SQL語句 猜解表名 例如 ID= And (Select Count(*) from Admin)>= 如果頁面就與ID= 的相同 說明附加條件成立 即表Admin存在 反之 即不存在(請牢記這種方法) 如此循環 直至猜到表名為止 表名猜出來後 將Count(*)替換成Count(欄位名) 用同樣的原理猜解欄位名 有人會說 這里有一些偶然的成分 如果表名起得很復雜沒規律的 那根本就沒得玩下去了 說得很對 這世界根本就不存在 %成功的黑客技術 蒼蠅不叮無縫的蛋 無論多技術多高深的黑客 都是因為別人的程序寫得不嚴密或使用者保密意識不夠 才有得下手 有點跑題了 話說回來 對於SQLServer的庫 還是有辦法讓程序告訴我們表名及欄位名的 我們在高級篇中會做介紹 最後 在表名和列名猜解成功後 再使用SQL語句 得出欄位的值 下面介紹一種最常用的方法-Ascii逐字解碼法 雖然這種方法速度很慢 但肯定是可行的方法 我們舉個例子 已知表Admin中存在username欄位 首先 我們取第一條記錄 測試長度 ?id= and (select top len(username) from Admin)> 先說明原理 如果top 的username長度大於 則條件成立 接著就是> > > 這樣測試下去 一直到條件不成立為止 比如> 成立 > 不成立 就是len(username)= 當然沒人會笨得從 一個個測試 怎麼樣才比較快就看各自發揮了 在得到username的長度後 用mid(username N )截取第N位字元 再asc(mid(username N ))得到ASCII碼 比如 id= and (select top asc(mid(username )) from Admin)> 同樣也是用逐步縮小范圍的方法得到第 位字元的ASCII碼 注意的是英文和數字的ASCII碼在 之間 可以用折半法加速猜解 如果寫成程序測試 效率會有極大的提高 第二節 SQL注入常用函數 有SQL語言基礎的人 在SQL注入的時候成功率比不熟悉的人高很多 我們有必要提高一下自己的SQL水平 特別是一些常用的函數及命令 Access asc(字元)SQLServer unicode(字元)作用 返回某字元的ASCII碼Access chr(數字)SQLServer nchar(數字)作用 與asc相反 根據ASCII碼返回字元Access mid(字元串 N L)SQLServer substring(字元串 N L)作用 返回字元串從N個字元起長度為L的子字元串 即N到N+L之間的字元串Access abc(數字)SQLServer abc (數字)作用 返回數字的絕對值(在猜解漢字的時候會用到)Access A beeen B And CSQLServer A beeen B And C作用 判斷A是否界於B與C之間 第三節 中文處理方法 在注入中碰到中文字元是常有的事 有些人一碰到中文字元就想打退堂鼓了 其實只要對中文的編碼有所了解 中文恐懼症 很快可以克服 先說一點常識 Access中 中文的ASCII碼可能會出現負數 取出該負數後用abs()取絕對值 漢字字元不變 SQLServer中 中文的ASCII為正數 但由於是UNICODE的雙位編碼 不能用函數ascii()取得ASCII碼 必須用函數unicode ()返回unicode值 再用nchar函數取得對應的中文字元 了解了上面的兩點後 是不是覺得中文猜解其實也跟英文差不多呢?除了使用的函數要注意 猜解范圍大一點外 方法是沒什麼兩樣的 lishixin/Article/program/SQLServer/201311/22039
㈢ 如何防範SQL注入漏洞及檢測
SQL注入漏洞攻擊的防範方法有很多種,現階段總結起來有以下方法:
(1)數據有效性校驗。如果一個輸入框只可能包括數字,那麼要通過校驗確保用戶輸入的都是數字。如果可以接受字母,那就要檢查是不是存在不可接受的字元,最好的方法是增加字元復雜度自動驗證功能。確保應用程序要檢查以下字元:分號、等號、破折號、括弧以及SQL關鍵字。另外限製表單數據輸入和查詢字元串輸入的長度也是一個好方法。如果用戶的登錄名最多隻有10個字元,那麼不要認可表單中輸入10個以上的字元,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
(2)封裝數據信息。對客戶端提交的數據進行封裝,不要將數據直接存入cookie中,方法就是在編程的代碼中,插入session、if、try、else,這樣可以有效地防止攻擊者獲取cookie中的重要信息。
(3)去除代碼中的敏感信息。將在代碼中存在的用戶名、口令信息等敏感欄位刪除,替換成輸入框。
SQL=" select from users where username = 』admin』and password= 』1234567』 "
如:這樣顯然會暴露管理員的用戶名、口令信息。可以將其修改成:
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
這樣就安全了很多,入侵者也是不會輕易的就獲取到用戶名、口令信息。
(4)替換或刪除單引號。使用雙引號替換掉所有用戶輸入的單引號,這個簡單的預防措施將在很大程度上預防SQL注入漏洞攻擊,單引號時常會無法約束插入數據的Value,可能給予輸入者不必要的許可權。用雙引號替換掉單引號可以使大部分SQL注入漏洞攻擊失敗。 如:
「select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'」
顯然會得到與
「select * from users where username='admin' and password= '1234567'」
相同的結果。
(5)指定錯誤返回頁面。攻擊者有時從客戶端嘗試提交有害代碼和攻擊字元串,根據Web Service給出的錯誤提示信息來收集程序及伺服器的信息,從而獲取想得到的資料。應在Web Service中指定一個不包含任何信息的錯誤提示頁面。
(6)限制SQL字元串連接的配置文件。使用SQL變數,因為變數不是可以執行的腳本,即在Web頁面中將連接資料庫的SQL字元串替換成指定的Value,然後將Web.config文件進行加密,拒絕訪問。
(7)設置Web目錄的訪問許可權。將虛擬站點的文件目錄禁止遊客用戶(如:Guest用戶等)訪問,將User用戶許可權修改成只讀許可權,切勿將管理許可權的用戶添加到訪問列表。
(8)最小服務原則。Web伺服器應以最小許可權進行配置,只提供Web服務,這樣可以有效地阻止系統的危險命令,如ftp、cmd、vbscript等。
(9)鑒別信息加密存儲。將保存在資料庫users表中的用戶名、口令信息以密文形式保存,也可以對users表進行加密處理,這樣可以大大增加對鑒別信息訪問的安全級別。
(10)用戶許可權分離。應盡可能的禁止或刪除資料庫中sa許可權用戶的訪問,對不同的資料庫劃分不同的用戶許可權,這樣不同的用戶只能對授權給自己的資料庫執行查詢、插入、更新、刪除操作,就可以防止不同用戶對非授權的資料庫進行訪問。
㈣ 求php防止被sql 注入攻擊的過濾用戶輸入內容的函數
functionclean($v){
//判斷magic_quotes_gpc是否為打開
if(!get_magic_quotes_gpc()){
//進行magic_quotes_gpc沒有打開的情況對提交數據的過濾
$v=addslashes($v);
}
//把'_'過濾掉
$v=str_replace("_","\_",$v);
//把'%'過濾掉
$v=str_replace("%","\%",$v);
//把'*'過濾掉
$v=str_replace("*","*",$v);
//回車轉換
$v=nl2br($v);
//html標記轉換
$v=htmlspecialchars($v);
return$v;
}
如果需要,還可以屏蔽一下危險字元,例如insert, update, delete等
//將update去掉
$v=str_replace("update","",$v);
最後,在拼裝sql語句時,用戶輸入的東西,全括在單引號內
㈤ ThinkPHP如何防止SQL注入
(1)查詢條件盡量使用數組方式,這是更為安全的方式;
(2)如果不得已必須使用字元串查詢條件,使用預處理機制;
(3)使用綁定參數;
(4)強制進行欄位類型驗證,可以對數值數據類型做強制轉換;
(5)使用自動驗證和自動完成機制進行針對應用的自定義過濾;
(6)使用欄位類型檢查、自動驗證和自動完成機制等避免惡意數據的輸入;
(7)做一些過濾。
㈥ SQL注入 當or、and等常用字元被過濾(less-25)
當常用字元被注釋無法使用時,通常採取以下方法(可自行搜索sql注入繞開過濾等):
如:Or、OR、oR等
如:通過hex、urlencode、url等編碼
舉例:如果or被過濾時,我們可以採用url編碼(其相當於把ascii編碼的0x給替換成%,比如o的ascii為0x6f,url編碼就是%6f),這個時候我們可以試試%6fr,即把o換成url編碼,也可以全換,也可以大小寫的換,如果沒被過濾就成功了,(如果%被過濾了的話…)
【註:這個可以積極的去使用,比如測試時and被注釋,使用&&替換也失敗,這個時候不妨試試%26%26(&的url編碼)】
如: /* */ (這個不止可以應對字母被注釋)
舉例:某個過濾器能夠過濾的字元如下——「select 」、」from 」、」limit 」等,注意這些字元最後面都有一個空格,這個時候我們就能通過內聯注釋來繞過這個過濾器,如:
【註:這個注釋甚至可以穿插在關鍵字當中,例如被過濾了or,我們可以把 order by 改成 o/**/rder by ,參考的資料上是這么說,但本人試了沒成功,不知是否依舊實用】
比如or被過濾了,我們可以往裡面加or,即注入:oorr,這個時候裡面的or就被刪去了,剩下的組成新字元,也就是or,是個很好用的繞過方法,像這種類似的還有很多,需要我們去思考
如:&&、||
舉例:
如盲注時經常用到比較,這時候要是比較符號被注釋了不能用平常的方法了,所以需要用某些函數如 greatest() 【 greatest(n1,n2,n3,...) 函數返回輸入參數(n1,n2,n3,...)的最大值】、least()等,比如語句: select * from users where id=1 and ascii(substr(database(),0,1))>64 就可以替換成 select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
【註:當or被注釋時,像order by這種含有相關字元的語句也同樣無法使用,這個時候如果改變大小寫也無用時,可以使用上述的內聯注釋 /**/ ,或者用別的編碼形式,如果不行的話,那就只能放棄使用order by,可以嘗試使用group by語句等】
㈦ 避免mysql注入應該避免有哪些特殊字元
特殊字元有:
SQL中通配符的使用
SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字元串,欺騙伺服器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。
㈧ 什麼是sql注入,怎麼防止注入
sql注入其實就是在這些不安全控制項內輸入sql或其他資料庫的一些語句,從而達到欺騙伺服器執行惡意到嗎影響到資料庫的數據。防止sql注入,可以在接受不安全空間的內容時過濾掉接受字元串內的「'」,那麼他不再是一條sql語句,而是一個類似sql語句的zifuc,執行後也不會對資料庫有破壞。
如:
username = request("username") //獲取用戶名 這里是通過URL傳值獲取的。
password = request("password") //獲取密碼 也是通過URL傳值獲取的。
sql="select * from userlist where username = '" & username & "' and password = '" & password & "'"--------如果某個人知道某個用戶名是admin,常常有人網站的管理員用戶名就是admin,這是密碼可以選用'or 1 or ',
那麼sql="select * from userlist where username = 'admin' and password = '' or 1 or ''",顯然1是恆真的,那麼驗證密碼就通過了。
防止的方式比較多,比如可以限制username,password中出現"'"這些字元,一般網站都是只允許數字,字元,下劃線的組合,這可以通過javascript驗證。也可以採取用存儲過程代替sql拼接,等等。