【滲透課程】第五篇-SQL注入的原理


哈哈哈,講到注入了。我想給大家講注入的原理。這個我們前面的前言篇就說過,所謂的SQL注入就是,繞過數據庫驗證機制直接執行SQL語句。怎么說呢,我們先講一個概念吧!

網站和網頁的區別

單純的網頁是靜態的,html就是靜態的,一些簡單的網站(如某些引導頁)只有網頁和網頁之間的跳轉。而網站是動態的,是一個整體性的web應用程序,幾乎所有的網站都要用到數據庫。數據庫我們怎么利用呢?例如某些博客站,cms站點。它的文章並不是存在網站目錄里的,而是存在數據庫里的,例如某些cms是通過后綴?id=321來調用數據庫內的文章內容。此時便是向數據庫傳遞變量為ID值為321請求,而數據庫會響應並查詢我們的請求。

總體來說原理就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到后台數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。

例子

比方說我們在某網站后台登錄界面,有兩條輸入框,一條是帳號一條是密碼。那么我們可以猜測數據庫中有一個admin表,表里面有兩個字段username和password 。這樣我們輸入用戶(比如123)密碼(比如456)並提交之后,數據庫就會執行一段查詢語句:

select id from users where username = '123 and password = '123'

並判斷用戶名123是錯誤的(為假)

之后返回帳號密碼錯誤信息。

那么如果我們在用戶名處輸入'or 1=1-- 而密碼隨便輸入個456呢? 我們來看看數據庫中的查詢語句:

select id from users where username = '' or 1=1--  and password = '456'

'又 這里呢1=1永遠為真,后面 and password = '456'被注釋掉了。數據庫不需要考慮,這里我們就跳過了驗證。

這就是幾年前的萬能密碼,這里只是說說邏輯。我們再來看看下面另一個例子。

整型參數的判斷

SQL注入一般存在於形如:

HTTP://www.xxx.xxx/text.asp?id=XX

這種帶有參數的asp或者動態網頁中,注入又分為整形注入和字符串注入。總之只要是帶有參數的動態網頁且此網頁訪問了數據庫,那么就有可能存在SQL注入。下以HTTP://www.xxx.xxx/test.asp?p=xx為例進行分析,xx此處設為整型。

當輸入的參數xx為整型時,通常test.asp中SQL語句原貌大致如下:

select * from 表名 where 字段=xx

所以可以用以下步驟測試SQL注入是否存在。

①HTTP://www.xxx.xxx/text.asp?p=xx’(附加一個單引號)此時abc.ASP中的SQL語句變成了

select * from 表名 where 字段=YY’

數據庫無法處理,返回異常;

②HTTP://www.xxx.xxx/test.asp?p=xx and 1=1。1=1為真 test.asp運行正常,而且與沒加語句之前的test.asp?p=xx運行結果一樣正常顯示;

③HTTP://www.xxx.xxx/test.asp?p=YY and 1=2,語句為假,因為1≠2  test.asp運行異常;如果以上三步全面滿足,test.asp中一定存在SQL注入漏洞

小技巧:有時管理員會在后台設置過濾掉單引號等字符,以防止SQL注入。此時可以用以下幾種試一試。

大小定混合法:VBS並不區分大小寫,而網站程序可能區分。然后程序員在過濾時通常要么全部過濾大寫字符串,要么全部過濾小寫字符串,而大小寫混合往往會被忽視。如用SelecT代替select,SELECT等;

UNICODE法:在IIS中,以UNICODE字符集實現國際化,我們完全可以IE中輸入的字符串化成UNICODE字符串進行輸入。如+ =%2B,空格=%20 等;URLEncode信息可以參加百度;

ASCII碼法:可以把輸入的部分或全部字符全部用ASCII碼代替,如U=chr(85),a=chr(97)等,ASCII信息參見百度。

猜解內容

用過明小子、啊D的都知道,存在注入肯定要猜密碼了哈哈哈,可是軟件是怎樣一個工作過程呢?

猜解表名: and exists (select * from 表名)

猜解列名: and exists (select 字段 from 表

爆指定表名內容: and 1=1 union select 1,2,3,4,5 from 表名

猜解列長度 猜解語句: and (select top 1 len(列名)from 表名)>N and (select top 1 len(列名)from 表名)=N 其中N是數字

變換這個N的值猜解列長度,

例如: and (select top 1 len(列名)from 表名)>1 and (select top 1 len(列名)from 表名)>6

如果一直猜到6都顯示正常頁面,猜到7的時候返回錯誤(大於6並且小於等於7),那么該列的長度為7。

阿西巴,我好困~~好了這次注入淺談就說到這里~ 其實網上的注入工具還是挺多的, 如批量注入的明小子、啊D注入工具、椰樹、御劍等等。現在不會語法也沒太大關系,以后再補上也行啊。SQL 存在注入的站點小編在博客里也送過了,大家可以找幾個練練手(不要干壞事)。

手機一個一個字打,賊幾把累(其實抄了一部分)~要是你們還不懂,明天來問我吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM