SQL語句注入
簡單舉例,某登錄界面用 select 1 from tabUser where username = @val1 and password = @val2 來驗證輸入的用戶名密碼是否有效,只有兩者都正確才會返回 1.
如果你在密碼輸入框(@val2 )輸入 abc or 1 = 1,那么整個語句就變成 。 where .. and 。 or 1=1,很明顯,這條語句總是會返回 1 的。
結果就是雖然沒有正確的用戶名密碼,但成功登錄了。
跪求SQL手工注入語句及原理
先舉個例子,你要登錄一個網站,上面讓你輸入用戶名字和密碼。
那么,假如你輸入的用戶名是 admin ,但是你不知道密碼,你就輸入了一個 1' OR '1' = '1 ,那么,你就提交了兩個參數給服務器。假如,服務器拿這兩個參數拼SQL語句:SELECT T.* FROM XXX_TABLE TWHERE *_ID = '/*param1*/'AND *RD = '/*param2*/'那么,你提交的兩個參數就使SQL文變成了:SELECT T.* FROM XXX_TABLE TWHERE *_ID = 'admin'AND *RD = '1' OR '1' = '1'那么,這個SQL原來的校驗功能就被你繞過去了,你的這種行為就稱之為SQL注入。
sql 注入是什么
注入的一般步驟首先,判斷環境,尋找注入點,判斷數據庫類型其次,根據注入參數類型,在腦海中重構SQL語句的原貌,按參數類型主要分為下面三種:(A) ID=49 這類注入的參數是數字型,SQL語句原貌大致如下:Select * from 表名 where 字段=49注入的參數為ID=49 And [查詢條件],即是生成語句:Select * from 表名 where 字段=49 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 '%25'=', 即是生成語句:Select * from 表名 where字段like '%' and [查詢條件] and '%'='%'接著,將查詢條件替換成SQL語句,猜解表名,例如:ID=49 And (Select Count(*) from Admin)>=0如果頁面就與ID=49的相同,說明附加條件成立,即表Admin存在,反之,即不存在(請牢記這種方法)。
如此循環,直至猜到表名為止。表名猜出來后,將Count(*)替換成Count(字段名),用同樣的原理猜解字段名。
我們舉個例子,已知表Admin中存在username字段,首先,我們取第一條記錄,測試長度: http://***?id=49 and (select top 1 len(username) from Admin)>0先說明原理:如果top 1的username長度大于0,則條件成立;接著就是>1、>2、>3這樣測試下去,一直到條件不成立為止,比如>7成立,>8不成立,就是len(username)=8當然沒人會笨得從0,1,2,3一個個測試,怎么樣才比較快就看各自發揮了。在得到username的長度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII碼,比如:id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0同樣也是用逐步縮小范圍的方法得到第1位字符的ASCII碼,注意的是英文和數字的ASCII碼在1-128之間,可以用折半法加速猜解,如果寫成程序測試,效率會有極大的提高。
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 between B And C SQLServer:A between B And C作用:判斷A是否界于B與C之間中文處理方法在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其實只要對中文的編碼有所了解,“中文恐懼癥”很快可以克服。
先說一點常識:Access中,中文的ASCII碼可能會出現負數,取出該負數后用abs()取絕對值,漢字字符不變。SQLServer中,中文的ASCII為正數,但由于是UNICODE的雙位編碼,不能用函數ascii()取得ASCII碼,必須用函數unicode ()返回unicode值,再用nchar函數取得對應的中文字符。
簡述什么是SQL注入,寫出簡單的SQL注入語句
一般開發,肯定是在前臺有兩個輸入框,一個用戶名,一個密碼,會在后臺里,讀取前臺傳入的這兩個參數,拼成一段SQL,例如: select count(1) from tab where usesr=userinput and pass = passinput,把這段SQL連接數據后,看這個用戶名/密碼是否存在,如果存在的話,就可以登陸成功了,如果不存在,就報一個登陸失敗的錯誤。對吧。
但是有這樣的情況,這段SQL是根據用戶輸入拼出來,如果用戶故意輸入可以讓后臺解析失敗的字符串,這就是SQL注入,例如,用戶在輸入密碼的時候,輸入 '''' ' or 1=1'', 這樣,后臺的程序在解析的時候,拼成的SQL語句,可能是這樣的: select count(1) from tab where user=userinput and pass='' or 1=1; 看這條語句,可以知道,在解析之后,用戶沒有輸入密碼,加了一個恒等的條件 1=1,這樣,這段SQL執行的時候,返回的 count值肯定大于1的,如果程序的邏輯沒加過多的判斷,這樣就能夠使用用戶名 userinput登陸,而不需要密碼。
防止SQL注入,首先要對密碼輸入中的單引號進行過濾,再在后面加其它的邏輯判斷,或者不用這樣的動態SQL拼。
安全測試中sql的注入是什么意思
所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到后臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。 比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.
一般來說要阻止sql注入,需要前后端配合表單的內容進行驗證。我是前端的,只要對表單的輸入綁定change事件,對其中的內容進行正則驗證,阻止用戶輸入特殊字符(比如\轉義字符)。
SQL注入攻擊的種類有哪些
1.沒有正確過濾轉義字符 在用戶的輸入沒有為轉義字符過濾時,就會發生這種形式的注入式攻擊,它會被傳遞給一個SQL語句。
這樣就會導致應用程序的終端用戶對數據庫上的語句實施操縱。比方說,下面的這行代碼就會演示這種漏洞: statement := "SELECT * FROM users WHERE name ='" userName "';" 這種代碼的設計目的是將一個特定的用戶從其用戶表中取出,但是,如果用戶名被一個惡意的用戶用一種特定的方式偽造,這個語句所執行的操作可能就不僅僅是代碼的作者所期望的那樣了。
例如,將用戶名變量(即username)設置為: a' or 't'='t,此時原始語句發生了變化: SELECT * FROM users WHERE name = 'a' OR 't'='t'; 如果這種代碼被用于一個認證過程,那么這個例子就能夠強迫選擇一個合法的用戶名,因為賦值't'='t永遠是正確的。 在一些SQL服務器上,如在SQL Server中,任何一個SQL命令都可以通過這種方法被注入,包括執行多個語句。
下面語句中的username的值將會導致刪除“users”表,又可以從“data”表中選擇所有的數據(實際上就是透露了每一個用戶的信息)。 a';DROP TABLE users; SELECT * FROM data WHERE name LIKE'% 這就將最終的SQL語句變成下面這個樣子: SELECT * FROM users WHERE name = 'a';DROP TABLE users;SELECT * FROM DATA WHERE name LIKE '%'; 其它的SQL執行不會將執行同樣查詢中的多個命令作為一項安全措施。
這會防止攻擊者注入完全獨立的查詢,不過卻不會阻止攻擊者修改查詢。 *ecttype handling 如果一個用戶提供的字段并非一個強類型,或者沒有實施類型強制,就會發生這種形式的攻擊。
當在一個SQL語句中使用一個數字字段時,如果程序員沒有檢查用戶輸入的合法性(是否為數字型)就會發生這種攻擊。例如: statement := "SELECT * FROM data WHERE id = " a_variable ";" 從這個語句可以看出,作者希望a_variable是一個與“id”字段有關的數字。
不過,如果終端用戶選擇一個字符串,就繞過了對轉義字符的需要。例如,將a_variable設置為:1;DROP TABLEusers,它會將“users”表從數據庫中刪除,SQL語句變成:SELECT * FROM DATA WHERE id = 1;DROP TABLE users; 3.數據庫服務器中的漏洞 有時,數據庫服務器軟件中也存在著漏洞,如MYSQL服務器中mysql_real_escape_string()函數漏洞。
這種漏洞允許一個攻擊者根據錯誤的統一字符編碼執行一次成功的SQL注入式攻擊。 4.盲目SQL注入式攻擊 當一個Web應用程序易于遭受攻擊而其結果對攻擊者卻不見時,就會發生所謂的盲目SQL注入式攻擊。
有漏洞的網頁可能并不會顯示數據,而是根據 注入到合法語句中的邏輯語句的結果顯示不同的內容。這種攻擊相當耗時,因為必須為每一個獲得的字節而精心構造一個新的語句。
但是一旦漏洞的位置和目標信息的位置被確立以后,一種稱為Absinthe的工具就可以使這種攻擊自動化。5.條件響應 注意,有一種SQL注入迫使數據庫在一個普通的應用程序屏幕上計算一個邏輯語句的值: SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd'AND 1=1 這會導致一個標準的面面,而語句 SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd'AND 1=2在頁面易于受到SQL注入式攻擊時,它有可能給出一個不同的結果。
如此這般的一次注入將會證明盲目的SQL注入是可能的,它會使攻擊者根據另外一個 表中的某字段內容設計可以評判真偽的語句。6.條件性差錯 如果WHERE語句為真,這種類型的盲目SQL注入會迫使數據庫評判一個引起錯誤的語句,從而導致一個SQL錯誤。
例如: SELECT 1/0 FROM users WHERE username='Ralph'。顯然,如果用戶Ralph存在的話,被零除將導致錯誤。
7.時間延誤 時間延誤是一種盲目的SQL注入,根據所注入的邏輯,它可以導致SQL引擎執行一個長隊列或者是一個時間延誤語句。攻擊者可以衡量頁面加載的時間,從而決定所注入的語句是否為真。
以上僅是對SQL攻擊的粗略分類。但從技術上講,如今的SQL注入攻擊者們在如何找出有漏洞的網站方面更加聰明,也更加全面了。
出現了一些新型的SQL攻擊手段。黑客們可以使用各種工具來加速漏洞的利用過程。
我們不妨看看theAsprox Trojan這種木馬,它主要通過一個發布郵件的僵尸網絡來傳播,其整個工作過程可以這樣描述:首先,通過受到控制的主機發送的垃圾郵件將此木馬安裝到電腦上,然后,受到此木馬感染的電腦會下載一段二進制代碼,在其啟動時,它會使用搜索引擎搜索用微軟的 ASP技術建立表單的、有漏洞的網站。搜索的結果就成為SQL注入攻擊的靶子清單。
接著,這個木馬會向這些站點發動SQL注入式攻擊,使有些網站受到控制、破壞。訪問這些受到控制和破壞的網站的用戶將會受到欺騙,從另外一個站點下載一段惡意的JavaScript代碼。
最后,這段代碼將用戶指引到第三個站點,這里有更多的惡意軟件,如竊取口令的木馬。 以前,經常有人警告或建議Web應用程序的程序員們對其代碼進行測試并打補丁,雖然SQL。
什么是SQL注入
引 言 隨著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正是變量user。
什么是sql注入
sql注入定義:
SQL注入是一種利用未過濾/未審核用戶輸入的攻擊方法(“緩存溢出”和這個不同),意思就是讓應用運行本不應該運行的SQL代碼。如果應用毫無防備地創建了SQL字符串并且運行了它們,就會造成一些出人意料的結果。
對于任何SQL化的表單而言,第一步測試,是輸入一個帶有單引號的數據:目的是看看他們是否對構造SQL的字符串進行了過濾。當把單引號作為郵件地址提交以后,我們得到了500錯誤(服務器錯誤),這意味著“有害”輸入實際上是被直接用于SQL語句了。
舉例:
SELECT fieldlist
FROM table
WHERE field = '$EMAIL';
這個數據呈現在WHERE的從句中,讓我們以符合SQL規范的方式改變輸入試試,看看會發生什么。鍵入anything' OR 'x'='x, 結果如下:
SELECT fieldlist
FROM table
WHERE field = 'anything' OR 'x'='x';
sql注入通俗說到底是什么意思
一般開發,肯定是在前臺有兩個輸入框,一個用戶名,一個密碼,會在后臺里,讀取前臺傳入的這兩個參數,拼成一段SQL,例如: select count(1) from tab where usesr=userinput and pass = passinput,把這段SQL連接數據后,看這個用戶名/密碼是否存在,如果存在的話,就可以登陸成功了,如果不存在,就報一個登陸失敗的錯誤。對吧。
但是有這樣的情況,這段SQL是根據用戶輸入拼出來,如果用戶故意輸入可以讓后臺解析失敗的字符串,這就是SQL注入,例如,用戶在輸入密碼的時候,輸入 '''' ' or 1=1'', 這樣,后臺的程序在解析的時候,拼成的SQL語句,可能是這樣的: select count(1) from tab where user=userinput and pass='' or 1=1; 看這條語句,可以知道,在解析之后,用戶沒有輸入密碼,加了一個恒等的條件 1=1,這樣,這段SQL執行的時候,返回的 count值肯定大于1的,如果程序的邏輯沒加過多的判斷,這樣就能夠使用用戶名 userinput登陸,而不需要密碼。
防止SQL注入,首先要對密碼輸入中的單引號進行過濾,再在后面加其它的邏輯判斷,或者不用這樣的動態SQL拼。