|
You last visited: Today at 06:13
Advertisement
Tipps Sicherheit?
Discussion on Tipps Sicherheit? within the Web Development forum part of the Coders Den category.
03/21/2018, 12:27
|
#1
|
elite*gold: 0
Join Date: Mar 2011
Posts: 417
Received Thanks: 17
|
Tipps Sicherheit?
Tag,
war grad auf meiner HP und hab folgendes entdeckt.
Es waren über 500 Kommentare in einem Post und in anderen Post hat jeder ein Kommentar mit der Zeichenkette "1". Keiner macht sich aus Spaß die Mühe sich vorm PC hinzusetzen und überall ne 1 reinzukommentieren.
Ebensfalls habe ich entdeckt, dass einer etwas "kommentiert" hat von der Beitrag_id 127100. Kann ja nicht sein, da es nur bei mir maximal 50-100 Beiträge gibt. Wie konnte er jetzt dahin kommen? Und wie schafft es einer 4x hintereinander was gleiches zu Kommentieren in der gleichen Zeit. Hat jemand Ahnung was da passiert ist & wie man sowas fixxen kann und was ich eventuell beachten sollte?
Paar Bilder:
ID 127100
Datum (4x Hintereinander gleicher Eintrag)
Eventuell noch mein Code falls jemand rüberschauen möchte:
PHP Code:
if(isset($_POST['send_comment'])) { $comment = $_POST['comment'];
$pid = $_POST['pid'];
$sqlAddComment = 'INSERT INTO comments (p_id, u_id, comment) SELECT :p_id, :u_id, :comment FROM u_post WHERE EXISTS( SELECT p_id FROM u_post WHERE p_id = :p_id) LIMIT 1'; $stmts = $pdo->prepare($sqlAddComment); $stmts->BindParam(':p_id', $pid); $stmts->BindParam(':u_id', $_SESSION['id']); $stmts->BindParam(':comment', $comment);
if($stmts->execute()) { echo $pdo->lastInsertId(); die; } else { echo 'Fehler'; } }
// Kurz unten hinzugefügt für euch // <p><input type="submit" name="send_comment"></p> <p><input type="hidden" name="pid"></p>
Falls einer ein Angriff austesten möchte:
|
|
|
03/21/2018, 13:51
|
#2
|
dotCom
elite*gold: 9842
Join Date: Mar 2009
Posts: 16,847
Received Thanks: 4,676
|
Wenn man diesen Code in die PowerShell kopiert, kann man Beiträge bei dir posten.
Code:
Invoke-WebRequest -Uri "http://test.liscon.bplaced.net/beta.php" -Method "POST" -Headers @{"Cookie"="PHPSESSID=440f08e98c7e27bdc7aab019013450a8"; "Origin"="http://test.liscon.bplaced.net"; "Accept-Encoding"="gzip, deflate"; "Accept-Language"="de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"; "User-Agent"="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.33 Safari/537.36"; "Content-Type"="multipart/form-data; boundary=----WebKitFormBoundaryloEIoAiBEjWq7pnj"; "Accept"="*/*"; "Referer"="http://test.liscon.bplaced.net/beta.php"; "X-Requested-With"="XMLHttpRequest"} -Body ([System.Text.Encoding]::UTF8.GetBytes("------WebKitFormBoundaryloEIoAiBEjWq7pnj$([char]13)$([char]10)Content-Disposition: form-data; name=`"post`"$([char]13)$([char]10)$([char]13)$([char]10)kek$([char]13)$([char]10)------WebKitFormBoundaryloEIoAiBEjWq7pnj$([char]13)$([char]10)Content-Disposition: form-data; name=`"send_post`"$([char]13)$([char]10)$([char]13)$([char]10)Posten$([char]13)$([char]10)------WebKitFormBoundaryloEIoAiBEjWq7pnj--$([char]13)$([char]10)"))
Ich würde ein  Token hinzufügen. Damit kannst du schon mal ein bisschen mehr Sicherheit holen.
|
|
|
03/21/2018, 16:01
|
#3
|
elite*gold: 0
Join Date: Apr 2011
Posts: 11,115
Received Thanks: 2,436
|
Wie Devsome bereits erwähnt hat würde ein CRSF-Token schon einmal ein Stückweit helfen, jedoch würde ich gegen Spam einfach ein Captcha einbauen.
Alternativ (oder auch zusätzlich) könntest du einbauen das ein Benutzer jede x Stunden nur 3 Kommentare schreiben kann (ob das sinn macht in deiner Anwendung musst du wissen, habe diese mir nicht angeschaut).
Dein Problem das die Id so hoch ist, ist auch logisch, da du die aus POST holst, somit kann jeder reinschreiben was er will..
Wofür ist die Id den da ?
Aus deiner SQL-Query werde ich nicht ganz schlau wieso das soviel ist/was du damit bezwecken willst.
Mit Curl geht es übrings noch leichter:
Quote:
curl -d "post=DEIN_TEXT&send_post=posten" -X POST
|
|
|
|
03/21/2018, 16:13
|
#4
|
elite*gold: 0
Join Date: Mar 2011
Posts: 417
Received Thanks: 17
|
Quote:
Originally Posted by .ƒaℓsє.
Wie Devsome bereits erwähnt hat würde ein CRSF-Token schon einmal ein Stückweit helfen, jedoch würde ich gegen Spam einfach ein Captcha einbauen.
Alternativ (oder auch zusätzlich) könntest du einbauen das ein Benutzer jede x Stunden nur 3 Kommentare schreiben kann (ob das sinn macht in deiner Anwendung musst du wissen, habe diese mir nicht angeschaut).
Dein Problem das die Id so hoch ist, ist auch logisch, da du die aus POST holst, somit kann jeder reinschreiben was er will..
Wofür ist die Id den da ?
Aus deiner SQL-Query werde ich nicht ganz schlau wieso das soviel ist/was du damit bezwecken willst.
|
@False
Nehmen wir mal an ich habe ein Beitrag, den kann ich kommentieren. Jetzt muss ich ja wissen welchen Beitrag ich kommentiere. Deswegen ist ein Hidden-Feld post_id(p_id) da.
Also:
p_id, :u_id, :comment
Füge die post_id in die DB , damit ich weiß welchen Post ich kommentiere (wie eine Identifikation)
Füge User_id ein
Füge Kommentar ein.
Wie hättest du denn sowas gemacht, wenn du ein Kommentar posten willst? Anders gehts glaub ich doch nicht da man ja wissen muss in welchem Beitrag der Kommentar sich befindet.
€: kann jemand nochmal testen ob es klappt, hab grad ein Token eingefügt, und weiß nicht wo ich diese Zeilen einfügen kann von:
Quote:
curl -d "post=DEIN_TEXT&send_post=posten" -X POST
|
|
|
|
03/21/2018, 16:16
|
#5
|
elite*gold: 0
Join Date: Apr 2011
Posts: 11,115
Received Thanks: 2,436
|
Quote:
Originally Posted by Cc_Cc_Cc
@False
Nehmen wir mal an ich habe ein Beitrag. Den kann ich kommentieren. Jetzt muss ich ja wissen welchen Beitrag ich kommentiere. Deswegen ist ein Hidden-Feld post_id(p_id) da.
Also:
p_id, :u_id, :comment
Füge die post_id in die DB , damit ich weiß welchen Post ich kommentiere (wie eine Identifikation)
Füge User_id ein
Füge Kommentar ein.
Wie hättest du denn sowas gemacht, wenn du ein Kommentar posten willst? Anders gehts glaub ich doch nicht da man ja wissen muss in welchem Beitrag der Kommentar sich befindet.
|
Informiere dich mal über foreign keys, wenn du diesen hast ist es nicht möglich irgendeine Id zu nutzen.
Somit kann nur eine passende (die existiert) genommen werden, je nachdem was deine Anwendung alles hat solltest du dennoch prüfen ob der User dort posten darf(da die Id dennoch geändert werden kann zu einer die existiert).
|
|
|
03/21/2018, 16:19
|
#6
|
dotCom
elite*gold: 9842
Join Date: Mar 2009
Posts: 16,847
Received Thanks: 4,676
|
Kannst doch immer noch Prüfen und die Tabellen mit foreign keys versehen.
Gibt es die p_id (postid?) bei dem Insert oder ist diese frei erfunden?
So kannst du auch schon mal die hohen Zahlen in der Tabelle verhindern, die halt nicht existieren.
|
|
|
03/21/2018, 16:21
|
#7
|
elite*gold: 0
Join Date: Mar 2011
Posts: 417
Received Thanks: 17
|
Nice, noch nie davon gehört. Werde mich direkt mal Informieren. Aber sollte ich noch etwas beachten. Ihr habt mir schonmal geholfen vor CSXF zu schützen. Habt ihr noch ne Lücke entdeckt?
|
|
|
03/21/2018, 16:23
|
#8
|
elite*gold: 0
Join Date: Apr 2011
Posts: 11,115
Received Thanks: 2,436
|
Quote:
Originally Posted by Cc_Cc_Cc
Nice, noch nie davon gehört. Werde mich direkt mal Informieren. Aber sollte ich noch etwas beachten. Ihr habt mir schonmal geholfen vor CSXF zu schützen. Habt ihr noch ne Lücke entdeckt?
|
Sollten es per CURL noch einmal testen, klappt aktuell nicht (Wobei ich auf der Seite selber auch nichts posten kann).
Ich denke du meinst CSRF, solltest du nicht wissen wofür der Token da ist => Lies dich ein!
|
|
|
03/21/2018, 17:38
|
#9
|
elite*gold: 0
Join Date: Mar 2011
Posts: 417
Received Thanks: 17
|
Quote:
Originally Posted by .ƒaℓsє.
Sollten es per CURL noch einmal testen, klappt aktuell nicht (Wobei ich auf der Seite selber auch nichts posten kann).
Ich denke du meinst CSRF, solltest du nicht wissen wofür der Token da ist => Lies dich ein!
|
Hab mir das alles durchgelesen und getestet. Der Zeigt mir sozusagen ganze Zeit Exit an bzw er führt mein Code nicht aus. Hab es genau so eingeführt wie im Link oben vom Devsome.
PHP Code:
<?php if($_SESSION['id']) { $_SESSION['csfr_token'] = uniqid('', true); }
// add comment if(isset($_POST['send_comment'])) {
if($_POST['post_token'] !== $_SESSION['csfr_token']) { exit(""); } $comment = $_POST['comment']; $pid = filter_var($_POST['pid'], FILTER_SANITIZE_NUMBER_INT); $sqlAddComment = 'INSERT INTO comments (p_id, u_id, comment) SELECT :p_id, :u_id, :comment FROM u_post WHERE EXISTS( SELECT p_id FROM u_post WHERE p_id = :p_id) LIMIT 1'; $stmts = $pdo->prepare($sqlAddComment); $stmts->BindParam(':p_id', $pid); $stmts->BindParam(':u_id', $_SESSION['id']); $stmts->BindParam(':comment', $comment);
if($stmts->execute()) { echo $pdo->lastInsertId(); die; } else { echo 'Fehler'; } } <form action="" method="POST"> <p><input type="hidden" name="post_token" value="<?php echo $_SESSION['csfr_token']; ?>"></p> ....
|
|
|
03/21/2018, 17:48
|
#10
|
dotCom
elite*gold: 9842
Join Date: Mar 2009
Posts: 16,847
Received Thanks: 4,676
|
Wenn man logisch denkt, sieht man das
Code:
$_SESSION['csfr_token'] = uniqid('', true);
vor
Code:
if($_POST['post_token'] !== $_SESSION['csfr_token']) {
aufgerufen wird.
Da kann der post_token auch nicht mehr gleich csrf_token sein.
Mach $_SESSION['csfr_token'] = uniqid('', true); einfach nach deiner Abfrage, aber so das der User dennoch einen hat wenn er nicht die POST ausführt.
|
|
|
03/21/2018, 18:55
|
#11
|
elite*gold: 0
Join Date: Mar 2011
Posts: 417
Received Thanks: 17
|
Hab es grad die ganze Zeit ausprobiert, ebenfalls das Bsp auch was eigentlich wesentlich das gleiche ist:
nichts funktoniert, bin einfach zu bescheuert um es richtig zu machen. Kann es jemand für bezahlung kurz machen?
|
|
|
All times are GMT +1. The time now is 06:13.
|
|