一、“灌水機”簡介:
在論壇裏面大量的貼出沒有任何意義的文章,這種做法在網絡上叫做“灌水”,實際上這是一種信息垃圾,
大量的垃圾發送到論壇上面就形成了信息炸彈,所以灌水機具有一定的攻擊性,它的基本編程思路和
上面的內容類似,是一種演變出來的工具。不過於上面的漏洞掃描器不同的是:灌水機需要使用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的基本協議,很容易理解,其他的網絡應用程序要依靠不同的協議,所以在編寫
程序之前應該先熟悉各種不同的協議 .