关于本站
管理团队
  
胡杨林-吉林IT·互动主题区  [登录] [注册] [发表新文章]  

作者: wanglihui 收藏:0 回复:0 点击:3085 发表时间: 2003.07.03 08:43:34

CGI扫描器的原理和实现过程[转载]


  
   CGI扫描器的原理和实现过程
  
  
  
   有很多网站为了安全起见,在WEB Server前面架了防火墙,或者做了TCP/IP过滤,对外只开放TCP 80 端口。从入侵者角度来看,要入侵那么从80上跑的CGI入手是比较可行的,当然也可以用别的办法,例如旁敲侧击,呵呵。从网管角度来看,一是要保证CGI的安全性,另外网络的整体安全性也是很重要的。针对基于80端口入侵、防范而出的CGI扫描器数不胜数,但基本上原理都一样。
    CGI扫描器原理说起来其实非常简单,可以用四句话来概括:连接目标WEB SERVER;发送一个特殊的请求;接收目标服务器返回数据;根据返回数据判断目标服务器是否有此CGI漏洞。
   当管理的服务器达到一定数量的时候,手工检测自己的服务器是否存在各种各样的CGI漏洞,那就太消耗时间和精力了,所以一个网管手上有个比较好用的CGI漏洞扫描器还是必要的。OK!今天我们就自己来动手用C写一个简单的CGI扫描器,帮助自己在日常工作中检测服务器:))
  
   源代码如下,很多地方我都加了注释,别嫌我烦哦:))编译好的程序可以从http://eyas.3322.net/program/cgicheck.exe下载。
  
  /*************************************************************************
  
  
  说明:这是一个Console下多线程,带有进度显示的CGI扫描器的模板,更改一下szSign和SendBuff就可以扫描其他CGI漏洞,设置了连接、发送、接收超时,速度还可以哦。希望可以帮助到admins检测自己的服务器:))
  
  
  *************************************************************************/
  
  #include
  
  #include
  
  #include
  
  #define iPort 80//目标Web Server端口
  
  #define szSign "500 13rnServer: Microsoft-IIS/5.0"//根据此标志来检查目标是否有漏洞
  
  #pragma comment(lib,"ws2_32.lib")
  
  ///////////////////////////////////////////////////////////////////////////
  
  //
  
  file://定义&初始化全局变量
  
  
  //
  
  
  char *SendBuff="GET /NULL.printern",//发送的请求buff
  
  
  
    CurrentTarget[52]={0},//存放最后一个线程将扫描的目标
  
  
  
    turn[4][2]={"-","\","|","/"};//显示进度时的字符
  
  
  
  int SendBuffLen=strlen(SendBuff),//发送的buff长度
  
  
  
    iConnTimeout,//TCP Connect TimeOut
  
  
  
    ii=0,//扫描进度
  
  
  
    iTotal;//服务器总数
  
  
  
  HANDLE hSemaphore=NULL,//信标内核对象句柄,用来控制线程数量
  
  
  
   hStdout;//console标准输出句柄,做进度显示的时候用的
  
  
  
  struct timeval timeout;//连接、发送和接收的超时值
  
  
  
  DWORD SleepTime;//每个一个线程后等待的时间
  
  
  
    /*
  
  
  
    SleepTime值根据用户输入的线程数量[ThreadNum]和TCP ConnectTimeOut[CONNTIMEO]来计算。确保在CONNTIMEO时间左右开  ThreadNum个线程。这样在CONNTIMEO时间后,所开的线程开始陆续超时退出,可以继续稳定的开线程,可以有效的保证同时有  ThreadNum个线程在运行。
  
  
  
    */
  
  
  
  ///////////////////////////////////////////////////////////////////////////
  
  
  
  void ShowError(char *);//显示出错信息函数,可以写完善一些,偶偷懒了:)
  
  
  
  BOOL ResetCursor(void);//重置光标位置,线程输出的时候调用的
  
  
  
  DWORD WINAPI ShowProInfo(LPVOID);//显示进度信息
  
  
  
  DWORD WINAPI scan(LPVOID);//扫描函数
  
  
  
  void usage(char *);//帮助函数
  
  
  
  ///////////////////////////////////////////////////////////////////////////
  
  
  
  int main(int argc,char **argv)
  
  
  
  {
  
  
  
    HANDLE hThread=NULL;//线程句柄
  
  
  
    DWORD dwThreadID;//线程ID
  
  
  
    struct sockaddr_in sa;
  
  
  
    int i,
  
  
  
   MaxThread;//最大线程数量
  
  
  
    WSADATA  wsd;
  
  
  
    long PreviousCount;
  
  
  
    clock_t start,end;//程序运行的起始和结束时间
  
  
  
    double duration;
  
  
  
  
  
  
    file://检查用户输入参数
  
  
  
    if(argc!=5)
  
  
  
    {
  
  
  
   usage(argv[0]);
  
  
  
   return 1;
  
  
  
    }
  
  
  
    file://get target range
  
  
  
    int StartNet=inet_addr(argv[1]);
  
  
  
    int StopNet=inet_addr(argv[2]);
  
  
  
    int StartHost=ntohl(StartNet);
  
  
  
    int StopHost=ntohl(StopNet);
  
  
  
    file://取得线程数量
  
  
  
    MaxThread=atoi(argv[3]);
  
  
  
    file://取得conn超时时间
  
  
  
    iConnTimeout=atoi(argv[4]);
  
  
  
    file://检查参数合法性
  
  
  
    if((iConnTimeout>6) || (iConnTimeout500) || (StopHost 2001.5.20"
  
  
  
   "nhttp://www.patching.net"
  
  
  
   "nnUsage:%s "
  
  
  
   "nnNotice"
  
  
  
   "nStartIP StopIP ==>Don‘t forgot StopIP must large than StartIP "
  
  
  
   "nThreadNum ==>Thread number,please input between 1-500"
  
  
  
   "nCONNTIMEO ==>TCP connect timeout,please input between 2-6"
  
  
  
   "nnExample"
  
  
  
   "n%s 192.168.0.0 192.168.255.255 200 2",proname,proname,proname);
  
  
  
  }
  
  
  
   程序在VC++6.0上编译通过,在windows2000上运行良好:)
  
  
  
  
  
  


转载    收   藏  

回复


回复主题: 回复在论坛 回复到信箱
回复内容:
附加签名:
上传贴图:
图片要求:长宽建议不超过:650×650。大小:300K 以内,文件后缀名必须为:.gif 或.jpg 或.png
      
版主推荐:
编辑推荐:
作者其它文章:

Copyright 2002-2008 版权所有
胡杨林© All rights reserved.
服务支持拓商网