入門篇
如果你以前沒試過sql注入的話,那麼第一步先把 ie 選單 =>工具 => internet 選項 => 高階 => 顯示友好 http 錯誤資訊 前面的勾去掉。否則,不論伺服器返回什麼錯誤,ie都只顯示為 http 500 伺服器錯誤,不能獲得更多的提示資訊。
第一節、sql注入原理
以下我們從乙個** www.***xx.com 開始。
在**首頁上,有名為「 ie 不能開啟新視窗的多種解決方法」的鏈結,位址為:我們在這個位址後面加上單引號』,伺服器會返回下面的錯誤提示:
microsoft jet database engine 錯誤 80040e14
字串的語法錯誤 在查詢表示式 id=49 中。
/showdetail.asp,行8
從這個錯誤提示我們能看出下面幾點:
**使用的是access資料庫,通過jet引擎連線資料庫,而不是通過odbc。
程式沒有判斷客戶端提交的資料是否符合程式要求。
該sql語句所查詢的表中有一名為id的字段。
從上面的例子我們可以知道,sql注入的原理,就是從客戶端提交特殊的**,從而收集程式及伺服器的資訊,從而獲取你想到得到的資料。
第二節、判斷能否進行sql注入
看完第一節,有一些人會覺得:我也是經常這樣測試能否注入的,這不是很簡單嗎? 其實,這並不是最好的方法,為什麼呢?
首先,不一定每台伺服器的 iis 都返回具體錯誤提示給客戶端,如果程式中加了 cint(引數) 之類語句的話,sql注入是不會成功的,但伺服器同樣會報錯,具體提示資訊為處理 url 時伺服器上出錯。請和系統管理員聯絡。
其次,部分對sql注入有一點了解的程式設計師,認為只要把單引號過濾掉就安全了,這種情況不為少數,如果你用單引號測試,是測不到注入點的
那麼,什麼樣的測試方法才是比較準確呢?答案如下:
;and 1=1
;and 1=2
這就是經典的 1=1、1=2 測試法 了,怎麼判斷呢?看看上面三個**返回的結果就知道了,可以注入的表現:
正常顯示(這是必然的,不然就是程式有錯誤了)
正常顯示,內容基本與 1 相同
提示 bof 或 eof(程式沒做任何判斷時)、或提示找不到記錄(判斷了rs.eof 時)、或顯示內容為空(程式加了on error resume next)
不可以注入就比較容易判斷了,1 同樣正常顯示,2 和 3 一般都會有程式定義的錯誤提示,或提示型別轉換時出錯。
當然,這只是傳入引數是數字型的時候用的判斷方法,實際應用的時候會有字元型和搜尋型引數,我將在中級篇的「sql注入一般步驟」再做分析。
第三節、判斷資料庫型別及注入方法
不同的資料庫的函式、注入方法都是有差異的,所以在注入之前,我們還要判斷一下資料庫的型別。一般 asp 最常搭配的資料庫是 access 和 sqlserver,網上超過 99% 的**都是其中之一。
怎麼讓程式告訴你它使用的什麼資料庫呢?來看看: sqlserver 有一些系統變數,如果伺服器 iis 提示沒關閉,並且 sqlserver 返回錯誤提示的話,那可以直接從出錯資訊獲取,方法如下:
;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 環境下可正常讀取。
在確認可以注入的情況下,使用下面的語句:
;and (select count(*) from sysobjects)>0ytest
;and (select count(*) from msysobjects)>0
如果資料庫是 sqlserver,那麼第乙個**的頁面與原頁面 49 是大致相同的;而第二個**,由於找不到表 msysobjects,會提示出錯,就算程式有容錯處理,頁面也與原頁面完全不同。
如果資料庫用的是 access,那麼情況就有所不同,第乙個**的頁面與原頁面完全不同;第二個**,則視乎資料庫設定是否允許讀該系統表,一般來說是不允許的,所以與原**也是完全不同。大多數情況下,用第乙個**就可以得知系統所用的資料庫型別,第二個**只作為開啟 iis 錯誤提示時的驗證。
基礎Web漏洞 SQL注入入門 手工注入篇
sql是運算元據庫資料的結構化查詢語言,網頁的應用資料和後台資料庫中的資料進行互動時會採用sql。而sql注入是將web頁面的原url 表單域或資料報輸入的引數,修改拼接成sql語句,傳遞給web伺服器,進而傳給資料庫伺服器以執行資料庫命令。如web應用程式的開發人員對使用者所輸入的資料或cooki...
SQL注入原理入門篇 1
asp.net程式設計員要想防止被注入,一定要先把注入的原理弄清楚了.俗話說 最好的防守是進攻,進攻都不知道,何來防守呀?所以我希望管理員不要把這個文章給刪除了,更不要封我的blog了。我不是在教大家壞.刀並沒有錯,錯就錯在拿刀的人呀!再說每乙個聰明的人,有怎麼會無緣無故去破壞別人的 呢?好了,閒話...
SQL注入漏洞全接觸 入門篇
隨著b s模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 根據程式返回的結果,獲得某...