編寫“灌水機”

一、“灌水機”簡介:
    在論壇裏面大量的貼出沒有任何意義的文章,這種做法在網絡上叫做“灌水”,實際上這是一種信息垃圾,
    大量的垃圾發送到論壇上面就形成了信息炸彈,所以灌水機具有一定的攻擊性,它的基本編程思路和
    上面的內容類似,是一種演變出來的工具。不過於上面的漏洞掃描器不同的是:灌水機需要使用POST方法、
    而不是GET方法向服務器發送請求。
    有關POST的定義如下:
    當瀏覽器將數據從一個填寫表單傳給服務器時,發生POST操作。對於POST,QUERY一STRING可能爲空或不空,
    這有賴於服務器。如果有信息,則其如GET的情況一樣被格式化和傳遞。
    來自POST查詢的數據使用STDIN從服務器傳到腳本。由於STDIN是一個源,腳本需要知道有多少有效數據。
    於是服務器還提供了另一個變量,CONTENT_LENGTH,以指出到來數據的字節數。而POST的數據格式爲:
    variable1=value1&variable2=value2&etc
    你的程序必須檢查REQUEST_METHOD環境變量以知道是否要讀取STDIN。CONTENT_LENGTH變量一般只在
    REOUEST_METHOD爲POST時有用。

    當腳本被服務器引發時,服務器常常以兩種途徑之一向腳本傳遞信息:GET或POST。這兩種方法被稱爲請求
    方法。所使用的請求方法是通過環境變量傳給腳本,該環境變量叫作REQUEST_METHOD(還定義了另外兩
    種請求方法一HEAD和PUT)。

二、灌水機源代碼:
    利用POST製作灌水機必須要先了解論壇的CGI應該獲得一個什麼樣的string,這要依靠sniffer或者直接
    使用cgi編寫攔截string流的小程序,不過因爲POST的格式非常簡單,所以經過簡單的推測就可以獲得它
    的具體形式,例如對某個論壇我使用的灌水機源代碼如下:

   //* 灌水機 源代碼
   *//* PostForum.cpp                           
 #include
 #include
 #include
 main(int argc,char *argv[])
 { 
  char   buff[4096]; 
  SOCKET sock; 
  SOCKADDR_IN   addr; 
  WSADATA       wsa; 
  WORD          wVersionRequested; 
  struct hostent       *hs; 
  int    count, len; 
  char *url="www.sample.com";
  if (argc!=4)
  {
   printf("Error!/n");
   return -1;
  }

  len=(strlen(argv[1])+strlen(argv[2])+strlen(argv[3])+49); 
  wVersionRequested = MAKEWORD( 2, 0 ); 
  if (WSAStartup(wVersionRequested , &wsa)!=0)
  {   
   printf("Winsock Initialization failed./n");
   return -1; 
  } 
  if ((sock=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
  {   
   printf("Can not create socket./n");
   return -1; 
  } 
  addr.sin_family     = AF_INET; 
  addr.sin_port       = htons(80); 
  _snprintf(buff, 4096, "POST /cgi-bin/forum.cgi HTTP/1.1/r/n" "Host: %s/r/n""Content-Type:
  application/x-www-form-urlencoded/r/n" "Content-Length: %d/r/n" "/r/n""action=add&Title=%s&
  URL=http://%s&yuzi=1&Description=%s/r/n", url,len,argv[1],argv[2],argv[3]); 
      if ((addr.sin_addr.s_addr=inet_addr(url))==-1)
      {   
           if ((hs=gethostbyname(url))==NULL)
           {     
                printf("Can not resolve specified host./n");
                return -1;   
           }   
           addr.sin_family = hs->h_addrtype;   
           memcpy((void *)&addr.sin_addr.s_addr,hs->h_addr,hs->h_length); 
      } 
      if (connect(sock,(LPSOCKADDR)&addr,sizeof(addr))==SOCKET_ERROR)
      {   
           printf("Can not connect to specified host./n"); return -1; 
      }   
      send(sock,buff,strlen(buff),0);   
      recv(sock,buff,sizeof(buff),0);   
      closesocket(sock); 
      return 0;
   }
   因爲程序涉及攻擊性,所以將原地址用www.sample.com替代,程序使用起來是這樣的“postforum <標題>
   <作者主頁> <文章正文>”,這樣運行程序之後,在論壇內就會出現一條灌水內容,因爲www.sample.com已經在
   源代碼中進行了定義,所以這個灌水機只能夠在一個論壇內進行操作,對程序進行修改可以得到更完善的灌水
   機,例如可以對不同的論壇進行灌水;設置循環操作對論壇進行批量灌水等,功能的實現方法設計有關編程操
   作,在這裏不再給出源代碼,請讀者自行修改。
   學會了上面的三個基本程序編寫,讀者便可以進而考慮ping、ftp、telnet等程序是如何完成的,ping和上面
   的程序一樣比較容易,
   因爲他們所涉及的都是TCP/IP的基本協議,很容易理解,其他的網絡應用程序要依靠不同的協議,所以在編寫
   程序之前應該先熟悉各種不同的協議 .

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章