2014-11-22 32 views
0

我試圖從文件使用GET請求(換行符刪除)逐行發送數據。問題是當我檢查我的apache訪問日誌時,請求與行在哪裏三個單詞由空格分隔在一起,即使我網址編碼它也不會發送(也是2x編碼)。文本文件的C - 試圖發送()數據,但有錯誤

例子:

asd 

asd asd 

asd asd asd <- not sent 

代碼:

asprintf(&httpget, 
     "GET /%s HTTP/1.1\r\n" 
     "Host: 127.0.0.1\r\n" 
     "User-Agent: \r\n" 
     "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,;q=0.5\r\n" 
     "Accept-Language: en-us,en;q=0.5\r\n" 
     "Accept-Encoding: gzip,deflate\r\n" 
     "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" 
     "Cache-Control: max-age=\r\n" 
     "\r\n", line_buffer); 

send(socket_handle, httpget, strlen(httpget), 0); 

請求應該是有效的,因爲我嘗試使用其他腳本複製請求。

所以,我發現了一些東西......

當您發送a a它會做的請求,但之後另一條線不被髮送。但我仍然不認爲這就是網絡服務器或無效的頭,造成例如在BurpSuite的問題,我可以把這些URL未編碼的數據沒有任何問題和日誌的模樣

127.0.0.1 - - [22/Nov/2014:13:37:04 +0100] "GET /test test test HTTP/1.1" 200 54 

完整代碼:

socket_handle = socket(AF_INET, SOCK_STREAM, 0) ; 
    socket_detials.sin_family = AF_INET ; 
    socket_detials.sin_addr.s_addr = inet_addr(host); 
    socket_detials.sin_port = htons(80); 
    input_buffer = malloc(20000); 
    line_number = 0; 
    while (fgets(line_buffer, sizeof(line_buffer), infile)) { 
    ++line_number; 
    strtok(line_buffer, "\n"); 
    printf("\n\n%s\n\n", line_buffer); 
    asprintf(&httpget, 
     "GET /%s HTTP/1.1\r\n" 
     "Host: 127.0.0.1\r\n" 
     "User-Agent: \r\n" 
     "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,;q=0.5\r\n" 
     "Accept-Language: en-us,en;q=0.5\r\n" 
     "Accept-Encoding: gzip,deflate\r\n" 
     "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n" 
     "Cache-Control: max-age=\r\n" 
     "\r\n", line_buffer); 
    bzero(&(socket_detials.sin_zero), 8); 
    connect(socket_handle,(struct sockaddr*)&socket_detials, sizeof(struct sockaddr)); 
    if(send(socket_handle, httpget, strlen(httpget), 0) < 0) { 
    printf("\n\n\n ERROR send() \n\n\n"); 
    } 
    int recieved = recv(socket_handle, input_buffer, 20000, 0); 
if(recieved != 0) { 
     printf ("\rRecieved %d bytes | Requests made: %d  ", recieved, req++); 
     printf("\n%s\n", httpget); 
    printf("%s%s\n%s\n", gray, input_buffer, normal); 
} else { 
    printf ("\rRecieved %d bytes | Requests made: %d  ", recieved, req++); 
    printf("\n%sRequest not sent.%s \n\nResponse:\n\n", red, normal); 
    printf("\n%s\n", httpget); 
    printf("%s%s\n%s\n", gray, input_buffer, normal); 
    } 
    } 

爲什麼在可能無效的請求後套接字關閉?

+0

你是否有機會使用非阻塞套接字發送數據? – alk 2014-11-22 12:57:39

+0

你到底在想什麼? :) – picker 2014-11-22 12:58:46

+0

你真的代碼檢查'send()'返回什麼嗎? – alk 2014-11-22 13:02:13

回答

1

您應該在HTTP RFC中查找URL編碼。空格需要編碼爲'%20',但還有很多其他字符也需要編碼。與將文本文件發佈到服務器相比,這看起來效率極低。

+0

我知道它應該是URL編碼,但爲什麼它以某種方式使用其他程序工作?我正在嘗試模糊webserver。我不想發送任何文件到服務器:) – picker 2014-11-22 12:41:20

相關問題