Zurück   BuHa-Security Board > Programmierung und Software-Entwicklung > C / C++
Registrieren Hilfe Benutzerliste Kalender Suchen Heutige Beiträge Alle Foren als gelesen markieren


Antwort
 
Themen-Optionen Ansicht
Alt 08.02.2010, 20:02   #1
DarkEagle
Registered User

 
Registriert seit: Oct 2008
Karma: 1 DarkEagle liegt in der Wertung
sos Datei uploaden

Hallo leute

Weiß jemand, wie man mit C/C++ eine Datei an ein php upload script übergeben kann und welche Funktionen man dafür braucht?

ich habe schon versucht, einen manuell bearbeiteten Http Header zu senden, aber das geht irgendwie nicht (und google will auch nicht helfen):

Code:
#include <stdio.h>
#include <winsock.h>
#include <io.h>

unsigned long WinsockStart()
{
    WSADATA wsa;
    struct hostent *host;
    unsigned long ulong;
    
    if((WSAStartup(MAKEWORD(2,0), &wsa))<0)
    {
          printf("Fehler WSAStartup()");
          return 1;
          }
    
    if((host = gethostbyname("beispiel.be.funpic.de"))<0)
    {
              printf("Fehler gethostbyname %d", WSAGetLastError());
              return 2;
              }
              
    ulong  = *(unsigned long*) host->h_addr;
     
     return ulong;
}

int main()
{
  SOCKET sock_c;
  struct sockaddr_in addr;
  int win = 0, send_back = 0, con=0;
  char *to_send = "POST /upload.php HTTP/1.1\r\n"
                  "Host: beispiel.be.funpic.de\r\n"
                  "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)\r\n"
                  "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
                  "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
                  "Accept-Encoding: gzip,deflate\r\n"
                  "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
                  "Keep-Alive: 300\r\n"
                  "Connection: keep-alive\r\n"
                  "Referer: http://beispiel.be.funpic.de/upload.php\r\n"
                  "Cookie: cken=1265637962\r\n"
                  "Content-Type: multipart/form-data; boundary=---------------------------12292603824179\r\n"
                  "Content-Length: 400\r\n"
                  "\r\n"
                  "-----------------------------12292603824179\r\n"
                  "Content-Disposition: form-data; name=\"upfile\"; filename=\"test.txt\"\r\n"
                  "Content-Type: text/plain\r\n"
                  "\r\n"
                  "test test\r\n"
                  "-----------------------------12292603824179\r\n"
                  "Content-Disposition: form-data; name=\"post\"\r\n"
                  "\r\n"
                  "hochladen\r\n"
                  "-----------------------------12292603824179--\r\n";
                  //"\0";
  
win = WinsockStart();
  
  if(win == 1 || win == 2)
  {
         printf("Fehler WinsockStart()\n");
         WSACleanup();
         return EXIT_FAILURE;
         }
         
  addr.sin_family = AF_INET;
  addr.sin_port = htons(80);
  addr.sin_addr.s_addr = win;
  
  printf("IP Adresse vom Server: %s", inet_ntoa(addr.sin_addr));
  
  sock_c = socket(AF_INET, SOCK_STREAM, 0);
  
  con=connect(sock_c, (struct sockaddr*)&addr, sizeof(addr));
  
  if(con<0)
  {
         printf("Fehler connect()con: %d WSA: %s", con, WSAGetLastError());
         WSACleanup();
         return EXIT_FAILURE;
         }
  
  if(send_back=send(sock_c, to_send, strlen(to_send), 0) < 0)
  {
         printf("Fehler send()");
         WSACleanup();
         return EXIT_FAILURE;
         }
         
  printf("Nicht gesendete Daten: %d", (sizeof(to_send)-send_back));
     
  closesocket(sock_c);
  WSACleanup();	
  return EXIT_SUCCESS;
}
Den Header hab ich mir mit Wireshark ausgeben lassen, als ich gerade eine Datei geuploadet habe und da stand dann:
-bei Protocol: HTTP
-bei Info : POST /upload.php HTTP/1.1 (text/plain)

Aber wenn ich das Programm dann ausführe, sehe ich in Wireshark nur hinten dran stehen:
-bei Protocol: TCP
-bei Info : [TCP segment of a reassemble PDU]

wenn ich dann bei dem Header aber alle \r weglasse, erscheint dann das:
-bei Protocol: HTTP
-bei Info : POST /upload.php HTTP/1.1 Continuation or non-Http traffic

Hat vielleicht jemand eine Idee, worin die Ursache liegt und wie man es besser machen kann?

DarkEagle
__________________
Ich bin nur dafür verantwortlich was ich sage - nicht dafür, was andere verstehen.

Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral
DarkEagle ist offline   Mit Zitat antworten
Alt 08.02.2010, 21:50   #2
Shakademus
Member

 
Registriert seit: May 2004
Karma: 831 Shakademus ist eine Bereicherung fuer die Gemeinschaft.
Re: Datei uploaden

Zitat:
Zitat von DarkEagle Beitrag anzeigen
Hat vielleicht jemand eine Idee, worin die Ursache liegt
Mir fällt auf die Schnelle auf, dass der Content-Length-Header vorne und hinten nicht stimmt. Wunder mich zwar, dass Wireshark dass dann nicht als HTTP taggt, aber werden eben noch andere Fehler drin sein.
Zitat:
Zitat von DarkEagle Beitrag anzeigen
und wie man es besser machen kann?
Das Protokoll lernen, welches du anwenden möchtest (das ist HTTP) oder eine Bibliothek nutzen.
Shakademus ist offline   Mit Zitat antworten
Alt 22.02.2010, 10:39   #3
cyber-over
Registered User

 
Registriert seit: Jan 2009
Karma: 1 cyber-over liegt in der Wertung
Re: Datei uploaden

also was mir auffällt ist dass am ende ein "\r\n" fehlt
also es muss zweimal dastehen

Code:
-----------------------------12292603824179--\r\n\r\n
mfg

cyber_overrun
cyber-over ist offline   Mit Zitat antworten
Alt 29.03.2010, 17:43   #4
DarkEagle
Registered User

 
Registriert seit: Oct 2008
Karma: 1 DarkEagle liegt in der Wertung
Re: Datei uploaden

mittlerweile habe ich es hinbekommen, den header mit send() zu versenden und eine Datei zu uploaden

jetzt versuche ich, eine übergroße datei (bzw. String) z.B. eine 1 kb Datei bzw string fragmentiert mit der WinHttp API zu uploaden, bin aber jedesmal gescheitert

hier ist der Code:

Code:
#include <stdio.h>
#include <windows.h>
#include <Winhttp.h>
#include <string.h>

int main()
{
  HINTERNET hopen, hconnect, hhttp;
  char buffer[200];
  DWORD read;
  BOOL r, retsend, bResults; 
  char header[1024], head[512];;
  char *to_send="testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttestvtest"
  "testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest"
  "testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest"
  "testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest";
  char *speichername = "test31.txt";
  
  int gr = strlen(to_send)+strlen(speichername)+287;
  
  memset(head, 0, 10);
  memset(header, 0, 10);
  printf("%s", header);
  
  sprintf(header, "%sHost: testbeispiel.funpic.de\r\n", header);
  sprintf(header, "%sConnection: Keep-Alive\r\n", header);
  sprintf(header, "%sContent-Type: multipart/form-data; boundary=---------------------------90721038027008\r\n", header); 
  sprintf(header, "%sContent-Length: %d\r\n", header, gr);
  sprintf(header, "%s\r\n", header);
  sprintf(header, "%s-----------------------------90721038027008\r\n", header);
  sprintf(header, "%sContent-Disposition: form-data; name=\"upfile\"; filename=\"%s\"\r\n", header, speichername);
  sprintf(header, "%sContent-Type: text/plain\r\n", header);
  sprintf(header, "%s\r\n", header);
  sprintf(head, "%s%s\r\n", head, to_send);
  sprintf(head, "%s-----------------------------90721038027008\r\n", head);
  sprintf(head, "%sContent-Disposition: form-data; name=\"post\"\r\n", head);
  sprintf(head, "%s\r\n", head);
  sprintf(head, "%shochladen\r\n\r\n", head);
  sprintf(head, "%s-----------------------------90721038027008--\r\n\r\n", head);
  
 
  
  hopen = WinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
  if(hopen == NULL)
     printf("Fehler InternetOpen()");
     
  hconnect = WinHttpConnect(hopen, L"testbeispiel.funpic.de", 
                                   INTERNET_DEFAULT_HTTP_PORT,0);
  if(hconnect == NULL)
     printf("Fehler InternetConnect()");
   
  hhttp = WinHttpOpenRequest(hconnect, L"POST", L"/upload.php", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES,0);
  if(hhttp == NULL)
     printf("Fehler HttpOpenRequest()"); 
    
  BOOL ret = WinHttpAddRequestHeaders(hhttp, L"Content-Type: multipart/form-data; boundary=---------------------------90721038027008\r\n"
                                             /*(LPVOID)(LPCSTR)header*/,-1L,
                                              WINHTTP_ADDREQ_FLAG_ADD);
  if(!ret)
     printf("Fehler WinHttpAddRequestHeaders()-1");
  
  ret = WinHttpAddRequestHeaders(hhttp, L"Content-Disposition: form-data; name=\"upfile\"; filename=\"test31.txt\"\r\n"
                                             /*(LPVOID)(LPCSTR)header*/,-1L,
                                              WINHTTP_ADDREQ_FLAG_ADD);
  if(!ret)
     printf("Fehler WinHttpAddRequestHeaders()-2");  
     
  gr = strlen(header)+strlen(head);
  
  retsend = WinHttpSendRequest(hhttp, L"Content-Type: text/plain\r\n\r\n",-1L,NULL, 0, 0, 0); 
  if(!retsend)
    printf("Fehler HttpSendRequest()"); 
  
  bResults = WinHttpWriteData( hhttp, header, strlen(header), &read);
  if(!bResults)
     printf("Fehler WinHttpWriteData()"); 
  
  WinHttpCloseHandle(hopen);
  WinHttpCloseHandle(hconnect);  
  WinHttpCloseHandle(hhttp); 
  free(header);
  return EXIT_SUCCESS;
}
ich habe es mit WinHttpAddRequestHeaders(), WinHttpWriteData(), usw versucht, aber es geht irgendwie alles nicht richtig

Hat vielleicht jemand Erfahrung damit und kann mir weiterhelfen?

DarkEagle
__________________
Ich bin nur dafür verantwortlich was ich sage - nicht dafür, was andere verstehen.

Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral
DarkEagle ist offline   Mit Zitat antworten
Alt 29.03.2010, 22:06   #5
gruena
Registered User

 
Registriert seit: Sep 2008
Karma: 44 gruena liegt in der Wertung
Re: Datei uploaden

Hat vielleicht jemand Erfahrung damit und kann mir weiterhelfen?

Versuchs mal mit einer Lib die dafür geschaffen ist. ;-)
gruena ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge anzufügen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind Aus.
[IMG] Code ist An.
HTML-Code ist Aus.
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dateien Uploaden über die php.exe dasheld2k (In)Security allgemein 2 06.10.2002 16:49
Homepage uploaden schnauzi Web Development 2 23.11.2001 16:42
File Uploaden & Bewerten Thorium PHP, Perl und ASP 0 18.04.2001 19:08
Site uploaden mycroft Web Development 6 06.01.2001 16:10
Uploaden mit Frontpage Sam-mc Technisches Off-Topic 0 01.10.2000 20:32


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:03 Uhr.


[BuHa Edition]

Partnerboard:
mcseboard.de