什么是SQL注入,如何防止SQL注入
所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到后臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.防護歸納一下,主要有以下幾點:1.永遠不要信任用戶的輸入。
對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和雙"-"進行轉換等。2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
5.應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝*注入的檢測方法一般采取輔助軟件或網站平臺來檢測,軟件一般采用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。
采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻擊等。
SQL Server里常用的語句有哪些
一、 簡單查詢 簡單的Transact-SQL查詢只包括選擇列表、 FROM子句和WHERE子句。
它們分別說明所查詢列、查詢的 表或視圖、以及搜索條件等。例如, 下面的語句查詢testtable表中姓名為“張三” 的nickname字段和email字段。
SELECT nickname,email FROM testtable WHERE name='張三' (一) 選擇列表 選擇列表(select_list)指出所查詢列, 它可以是一組列名列表、星號、表達式、變量( 包括局部變量和全局變量)等構成。 1、選擇所有列 例如,下面語句顯示testtable表中所有列的數據: SELECT * FROM testtable 2、 選擇部分列并指定它們的顯示次序查詢結果集合中數據的排列順序與 選擇列表中所指定的列名排列順序相同。
例如: SELECT nickname,email FROM testtable 3、更改列標題 在選擇列表中,可重新指定列標題。定義格式為: 列標題=列名 列名 列標題如果指定的列標題不是標準的標識符格式時, 應使用引號定界符,例如,下列語句使用漢字顯示列標題: SELECT 昵稱=nickname,電子郵件=email FROM testtable 4、刪除重復行 SELECT語句中使用ALL或DISTINCT選項來顯示表中 符合條件的所有行或刪除其中重復的數據行,默認 為ALL。
使用DISTINCT選項時, 對于所有重復的數據行在SELECT返回的結果集合中只保留一行 。 5、限制返回的行數 使用TOP n [PERCENT]選項限制返回的數據行數,TOP n說明返回n行,而TOP n PERCENT時,說明n是 表示一百分數,指定返回的行數等于總行數的百分之幾。
例如: SELECT TOP 2 * FROM testtable SELECT TOP 20 PERCENT * FROM testtable (二)FROM子句 FROM子句指定SELECT語句查詢及與查詢相關的表或視圖。 在FROM子句中最多可指定256個表或視圖, 它們之間用逗號分隔。
在FROM子句同時指定多個表或視圖時, 如果選擇列表中存在同名列,這時應使用對象名限定這些列 所屬的表或視圖。 例如在usertable和citytable表中同時存在ci tyid列,在查詢兩個表中的cityid時應 使用下面語句格式加以限定: SELECT username,* FROM usertable,citytable WHERE *=citytable. cityid 在FROM子句中可用以下兩種格式為表或視圖指定別名: 表名as 別名 表名 別名 (二) FROM子句 FROM子句指定SELECT語句查詢及與查詢相關的表或視圖。
在FROM子句中最多可指定256個表或視圖, 它們之間用逗號分隔。在FROM子句同時指定多個表或視圖時, 如果選擇列表中存在同名列,這時應使用對象名限定這些列 所屬的表或視圖。
例如在usertable和citytable表中同時存在ci tyid列, 在查詢兩個表中的cityid時應使用下面語句格式加以限定: SELECT username,* FROM usertable,citytable WHERE *=citytable. cityid 在FROM子句中可用以下兩種格式為表或視圖指定別名: 表名as 別名 表名 別名 例如上面語句可用表的別名格式表示為: SELECT username,* FROM usertable a,citytable b WHERE *=* SELECT不僅能從表或視圖中檢索數據, 它還能夠從其它查詢語句所返回的結果集合中查詢數據。 例如: SELECT *_fname+*_lname FROM authors a,titleauthor ta (SELECT title_id,title FROM titles WHERE ytd_sales>10000 ) AS t WHERE *_id=*_id AND *_id=*_id 此例中,將SELECT返回的結果集合給予一別名t, 然后再從中檢索數據。
(三) 使用WHERE子句設置查詢條件 WHERE子句設置查詢條件,過濾掉不需要的數據行。 例如下面語句查詢年齡大于20的數據: SELECT * FROM usertable WHERE age>20 WHERE子句可包括各種條件運算符: 比較運算符(大小比較):>、>=、=、<、<=、<>、!>、 !< 范圍運算符(表達式值是否在指定的范圍):BETWEEN… AND… NOT BETWEEN…AND… 列表運算符(判斷表達式是否為列表中的指定項):IN (項1,項2……) NOT IN (項1,項2……) 模式匹配符(判斷值是否與指定的字符通配格式相符):LIKE、 NOT LIKE 空值判斷符(判斷表達式是否為空):IS NULL、NOT IS NULL 邏輯運算符(用于多條件的邏輯連接):NOT、AND、OR 1、范圍運算符例:age BETWEEN 10 AND 30相當于age>=10 AND age<=30 2、列表運算符例:country IN ('Germany','China') 3、模式匹配符例:常用于模糊查找, 它判斷列值是否與指定的字符串格式相匹配。
可用于char、 varchar、text、ntext、 datetime和smalldatetime等類型查詢。 可使用以下通配字符: 百分號%:可匹配任意類型和長度的字符,如果是中文, 請使用兩個百分號即%%。
下劃線_:匹配單個任意字符,它常用來限制表達式的字符長度。 方括號[]:指定一個字符、字符串或范圍, 要求所匹配對象為它們中的任一個。
[^]:其取值也[] 相同,但它要求所匹配對象為指定字符以外的任一個字符。 例如: 限制以Publishing結尾,使用LIKE '%Publishing' 限制以A開頭:LIKE '[A]%' 限制以A開頭外:LIKE '[^A]%' 4、空值判斷符例WHERE age IS NULL 5、邏輯運算符:優先級為NOT、AND、OR (四)查詢。
什么是SQL注入
SQL注入:利用現有應用程序,將(惡意)的SQL命令注入到后臺數據庫引擎執行的能力,這是SQL注入的標準釋義。
隨著B/S模式被廣泛的應用,用這種模式編寫應用程序的程序員也越來越多,但由于開發人員的水平和經驗參差不齊,相當一部分的開發人員在編寫代碼的時候,沒有對用戶的輸入數據或者是頁面中所攜帶的信息(如Cookie)進行必要的合法性判斷,導致了攻擊者可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得一些他想得到的數據。SQL注入利用的是正常的HTTP服務端口,表面上看來和正常的web訪問沒有區別,隱蔽性極強,不易被發現。
SQL注入攻擊過程分為五個步驟:第一步:判斷Web環境是否可以SQL注入。如果URL僅是對網頁的訪問,不存在SQL注入問題,如:http://www。
/*就是普通的網頁訪問。只有對數據庫進行動態查詢的業務才可能存在SQL注入,如:http://www。
../webhp?id=39,其中?id=39表示數據庫查詢變量,這種語句會在數據庫中執行,因此可能會給數據庫帶來威脅。第二步:尋找SQL注入點。
完成上一步的片斷后,就要尋找可利用的注入漏洞,通過輸入一些特殊語句,可以根據瀏覽器返回信息,判斷數據庫類型,從而構建數據庫查詢語句找到注入點。第三步:猜解用戶名和密碼。
數據庫中存放的表名、字段名都是有規律可言的。通過構建特殊數據庫語句在數據庫中依次查找表名、字段名、用戶名和密碼的長度,以及內容。
這個猜測過程可以通過網上大量注入工具快速實現,并借助破解網站輕易破譯用戶密碼。第四步:尋找WEB管理后臺入口。
通常WEB后臺管理的界面不面向普通用戶開放,要尋找到后臺的登陸路徑,可以利用掃描工具快速搜索到可能的登陸地址,依次進行嘗試,就可以試出管理臺的入口地址。第五步:入侵和破壞。
成功登陸后臺管理后,接下來就可以任意進行破壞行為,如篡改網頁、上傳木馬、修改、泄漏用戶信息等,并進一步入侵數據庫服務器。SQL注入攻擊的特點:變種極多,有經驗的攻擊者會手動調整攻擊參數,致使攻擊數據的變種是不可枚舉的,這導致傳統的特征匹配檢測方法僅能識別相當少的攻擊,難以防范。
攻擊過程簡單,目前互聯網上流行眾多的SQL注入攻擊工具,攻擊者借助這些工具可很快對目標WEB系統實施攻擊和破壞。危害大,由于WEB編程語言自身的缺陷以及具有安全編程能力的開發人員少之又少,大多數WEB業務系統均具有被SQL注入攻擊的可能。
而攻擊者一旦攻擊成功,可以對控制整個WEB業務系統,對數據做任意的修改,破壞力達到及至。SQL注入的危害和現狀SQL注入的主要危害包括:未經授權狀況下操作數據庫中的數據惡意篡改網頁內容私自添加系統帳號或者是數據庫使用者帳號網頁掛木馬如何防止SQL參數:1,檢查上傳的數據,并過濾2. 禁止拼接SQL字符串3.使用SQL參數化處理4.加載防入侵等硬件設施。
最近網上流行的XSS是什么意思
就個人而言,我把XSS攻擊分成兩類,一類是來自內部的攻擊,主要指的是利用程序自身的漏洞,構造跨站語句,如:dvbbs的*存在的跨站漏洞。
另一類則是來來自外部的攻擊,主要指的自己構造XSS跨站漏洞網頁或者尋找非目標機以外的有跨站漏洞的網頁。如當我們要滲透一個站點,我們自己構造一個有跨站漏洞的網頁,然后構造跨站語句,通過結合其它技術,如社會工程學等,欺騙目標服務器的管理員打開。
然后利用下面的技術得到一個shell. [編輯本段]如何利用 傳統的跨站利用方式一般都是攻擊者先構造一個跨站網頁,然后在另一空間里放一個收集cookie的頁面,接著結合其它技術讓用戶打開跨站頁面以盜取用戶的cookie,以便進一步的攻擊。個人認為這種方式太過于落后,對于弊端大家可能都知道,因為即便你收集到了cookie你也未必能進一步滲透進去,多數的cookie里面的密碼都是經過加密的,如果想要cookie欺騙的話,同樣也要受到其它的條件的限約。
而本文提出的另一種思路,則從一定程度上解決上述的問題。對于個人而言,比較成熟的方法是通過跨站構造一個表單,表單的內容則為利用程序的備份功能或者加管理員等功能得到一個高權限。
下面我將詳細的介紹這種技術。 [編輯本段]來自內部的跨站攻擊 尋找跨站漏洞 如果有代碼的話比較好辦,我們主要看代碼里對用戶輸入的地方和變量有沒有做長度和對”〈”,”〉”,”;”,”'”等字符是否做過濾。
還有要注意的是對于標簽的閉合,像測試QQ群跨站漏洞的時候,你在標題處輸入〈script〉alert('test')〈/script〉,代碼是不會被執行的,因為在源代碼里,有其它的標簽未閉合,如少了一個〈/script〉,這個時候,你只要閉合一個〈/script〉,代碼就會執行,如:你在標題處輸入〈/script〉〈script〉alert('test')〈/script〉,這樣就可以彈出一個test的框。 如何利用 我先以BBSXP為例,過程已做成動畫,詳情可見光盤中的動畫。
我舉BBSXP中其中兩個比較好用的跨站漏洞點為例. a.先注冊一個普通用戶,我這里注冊的用戶是linzi.然后我們在個人簽名里寫入: c.然后發個貼子,可以結合其它技術欺騙管理員瀏覽發的貼子。 d.因為是測試,所以我們以管理員身份登陸,然后打開貼子,我們會發現,linzi已經變成了社區區長工,如圖一所示 除此之外我們只要在個人簽名里輸入 同樣發個貼子等,只要管理員打開了,就會加了一個擴展名為asp (有空格)的上傳擴展,這個時候,你只要上傳一個* (有空格)就可以得到一個shell. 上面的攻擊多多少少有點局限性,雖然可以得到shell,但是隱蔽性不太好,因為簽名 處受到了長度的限制,不能超過255個字符。
我們可以結合flash跨站實現更為隱蔽的 攻擊,對于flash木馬的制作,下面見哥們豐初的介紹。 再利用如下: 修改一下個人頭像的url,輸入代碼如下: 再接著欺騙管理員打開你的資料或者瀏覽你的貼子,當管理員打開后,會在后臺自動加個php擴展名的后輟,因為bbsxp在個人頭像url里過濾了空格,%,所以我們只能加個不包括空格的其它擴展,當然你也可以加個shtml的擴展,有了它你就可以用來查看源代碼,然后進一步攻擊。
[編輯本段]來自外部的跨站攻擊 有的時候,當我們對于目標程序找不到可以利用的跨站點,這個時候我們可以利用可以從外部入手,利用我們要拿下的是它的論談,論談的安全性做的很好,但其留言板卻存在跨站漏洞,這個時候我們可以在留言板里寫入跨站語句,跨站語句為以表單的方式向論談提交提升權限的語句,如上面的bbsxp加asp 擴展的語句。當然我們可利用后臺的備份功能直接得到一個shell。
例:先上傳一個文件*,內容如下: 〈body onl oad="javascript:*[0].submit()"〉〈form action=" http://127.0.0.1/bbsxp/admin_*?menu=bakbf" method="post"〉〈input value="database/*" name="yl" 〉〈input value="database/*" name="bf" 〉〈/body〉〈/html〉 上面的代碼是把論談的數據庫備份為*,留言板存在跨站點如下: http://127.0.0.1/bbsxp/*?username= 我們構造備份跨站語句如下: http://127.0.0.1/bbsxp/*?username=%3C%62%6F%64%79%20%6F%6E%6C%6F%61%64%3D%22%6A%61%76%61%73%63%72%69%70%74%3A%64%6F%63%75%6D%65%6E%74%2E%66%6F%72%6D%73%5B%30%5D%2E%73%75%62%6D%69%74%28%29%22%3E%3C%66%6F%72%6D%20%61%63%74%69%6F%6E%3D%22%68%74%74%70%3A%2F%2F%31%32%37%2E%30%2E%30%2E%31%2F%62%62%73%78%70%2F%61%64%6D%69%6E%5F%66%73%6F%2E%61%73%70%3F%6D%65%6E%75%3D%62%61%6B%62%66%22%20%6D%65%74%68%6F%64%3D%22%70%6F%73%74%22%3E%3C%69%6E%70%75%74%20%76%61%6C%75%65%3D%22%64%61%74%61%62%61%73%65%2F%62%62%73%78%70%2E%6D%64%62%22%20%6E%61%6D%65%3D%22。
sql語句求詳細解釋
確認是DATALENGTH而不是LEN?其實你只要明白了每一個函數的含義,語句你就明白了。
DATALENGTH('我123') 返回值是5 函數返回的是字符串的字節數SUBSTRING('abcdefg',2,3) 返回值是'bcd' 截取字符串,從字符串中第2個字符開始,截取長度為3的字符串LEFT('abcdefg',4) 返回值是'abcd' 截取字符串,從左側第1個字符開始截取長度為4的字符串PATINDEX 模糊查找第一次出現該模式的位置,稍復雜,其實和CHARINDEX功能一樣,只不過CHARINDEX查找指定的字符串,PATINDEX可以加入通配符,簡單可以這么理解語句理解首先語句可以精簡為Update springerset 內容提要= LEFT(內容提要,PATINDEX('%copyright%',內容提要)) WHERE (內容提要 LIKE '%copyright%')本人實在是沒看出來SUBSTRING(內容提要, 1, DATALENGTH(內容提要))和 內容提要 本身有什么區別(如果不同,請賜教,真心沒看出來)其實PATINDEX('%copyright%',內容提要)也完全可以用CHARINDEX('copyright',內容提要)替代。精簡完后,樓主應該可以看懂了吧。
sql注入、xss攻擊
隨著B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也越來越多。
但是由于這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
SQL注入是從正常的WWW端口訪問,而且表面看起來跟一般的Web頁面訪問沒什么區別,所以目前市面的防火墻都不會對SQL注入發出警報,如果管理員沒查看IIS日志的習慣,可能被入侵很長時間都不會發覺。 但是,SQL注入的手法相當靈活,在注入的時候會碰到很多意外的情況。
能不能根據具體情況進行分析,構造巧妙的SQL語句,從而成功獲取想要的數據,是高手與“菜鳥”的根本區別。 根據國情,國內的網站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。
在本文,我們從分入門、進階至高級講解一下ASP注入的方法及技巧,PHP注入的文章由NB聯盟的另一位朋友zwell撰寫,希望對安全工作者和程序員都有用處。了解ASP注入的朋友也請不要跳過入門篇,因為部分人對注入的基本判斷方法還存在誤區。
大家準備好了嗎?Let's Go。 入門篇 如果你以前沒試過SQL注入的話,那么第一步先把IE菜單=>工具=>Internet選項=>高級=>顯示友好 HTTP 錯誤信息前面的勾去掉。
否則,不論服務器返回什么錯誤,IE都只顯示為HTTP 500服務器錯誤,不能獲得更多的提示信息。 第一節、SQL注入原理 以下我們從一個網站 * 開始(注:本文發表前已征得該站站長同意,大部分都是真實數據)。
在網站首頁上,有名為“IE不能打開新窗口的多種解決方法”的鏈接,地址為: http://***?id=49 ,我們在這個地址后面加上單引號',服務器會返回下面的錯誤提示: Microsoft JET Database Engine 錯誤 '80040e14' 字符串的語法錯誤 在查詢表達式 'ID=49'' 中。 /*,行8 從這個錯誤提示我們能看出下面幾點: 1.網站使用的是Access數據庫,通過JET引擎連接數據庫,而不是通過ODBC。
2.程序沒有判斷客戶端提交的數據是否符合程序要求。 3.該SQL語句所查詢的表中有一名為ID的字段。
從上面的例子我們可以知道,SQL注入的原理,就是從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取你想到得到的資料。 第二節、判斷能否進行SQL注入 看完第一節,有一些人會覺得:我也是經常這樣測試能否注入的,這不是很簡單嗎? 其實,這并不是最好的方法,為什么呢? 首先,不一定每臺服務器的IIS都返回具體錯誤提示給客戶端,如果程序中加了cint(參數)之類語句的話,SQL注入是不會成功的,但服務器同樣會報錯,具體提示信息為處理 URL 時服務器上出錯。
請和系統管理員聯絡。 其次,部分對SQL注入有一點了解的程序員,認為只要把單引號過濾掉就安全了,這種情況不為少數,如果你用單引號測試,是測不到注入點的 那么,什么樣的測試方法才是比較準確呢?答案如下: ① http://***?id=49 ② http://***?id=49 and 1=1 ③ http://***?id=49 and 1=2 這就是經典的1=1、1=2測試法了,怎么判斷呢?看看上面三個網址返回的結果就知道了: 可以注入的表現: ① 正常顯示(這是必然的,不然就是程序有錯誤了) ② 正常顯示,內容基本與①相同 ③ 提示BOF或EOF(程序沒做任何判斷時)、或提示找不到記錄(判斷了*時)、或顯示內容為空(程序加了on error resume next) 不可以注入就比較容易判斷了,①同樣正常顯示,②和③一般都會有程序定義的錯誤提示,或提示類型轉換時出錯。
當然,這只是傳入參數是數字型的時候用的判斷方法,實際應用的時候會有字符型和搜索型參數,我將在中級篇的“SQL注入一般步驟”再做分析。 第三節、判斷數據庫類型及注入方法 不同的數據庫的函數、注入方法都是有差異的,所以在注入之前,我們還要判斷一下數據庫的類型。
一般ASP最常搭配的數據庫是Access和SQLServer,網上超過99%的網站都是其中之一。 怎么讓程序告訴你它使用的什么數據庫呢?來看看: SQLServer有一些系統變量,如果服務器IIS提示沒關閉,并且SQLServer返回錯誤提示的話,那可以直接從出錯信息獲取,方法如下: http://***?id=49 and user>0 這句語句很簡單,但卻包含了SQLServer特有注入方法的精髓,我自己也是在一次無意的測試中發現這種效率極高的猜解方法。
讓我看來看看它的含義:首先,前面的語句是正常的,重點在and user>0,我們知道,user是SQLServer的一個內置變量,它的值是當前連接的用戶名,類型為nvarchar。拿一個nvarchar的值跟int的數0比較,系統會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,SQLServer的出錯提示是:將nvarchar值 ”abc” 轉換數據類型為 int 的列時發生語法錯誤,呵呵,abc正是變量。