Vorwort
Hallo an alle. Ich bin 20 Jahre alt. Bis vor kurzem habe ich am Lyceum studiert und mich auf den Eintritt in eine medizinische Universität vorbereitet. Jetzt bin ich ein Full-Stack-Entwickler in einem amerikanischen Unternehmen. Tatsächlich bin ich sehr froh, dass ich mit Medizin keinen Erfolg hatte - Programmieren war mein Hobby, und jetzt kann ich es die ganze Zeit tun. Jetzt möchte ich lieber nicht über den Erfolg in der IT schreiben. Im Moment möchte ich darüber sprechen, wie ich ein paar Bücher über Schwachstellen gelesen habe (um meine Projekte zu schützen), und ich habe es geschafft, dieses Wissen in die Praxis umzusetzen.
Haftungsausschluss
Alle Materialien, Screenshots sowie Links zu Ressourcen Dritter werden zu Bildungszwecken veröffentlicht. Der Autor ist nicht verantwortlich für die Verwendung durch andere Besucher des Habr. Das Unternehmen wurde im Voraus über 48 Stunden über die Sicherheitsanfälligkeit informiert und erhielt genügend Daten, um diese zu beheben.
Wie alles begann
Es war ein sehr gewöhnlicher Tag. Ich erledigte mehrere Aufgaben bei der Arbeit und kochte eine Tasse Kaffee. Gleichzeitig habe ich beschlossen,
einen Artikel über die Bereitstellung der Anwendung in AWS zu lesen, den ich einmal in VK für mich selbst neu gepostet habe (den Artikel habe ich übrigens nie gelesen). In der Spalte rechts neben dem Artikel werden mehrere andere Artikel und ein
Partnerbanner für den Hosting-Anbieter angezeigt.

Ich kann mich nicht erinnern, warum ich genau auf die Website gegangen bin, aber während des Übergangs habe ich eine interessante Funktion bemerkt: Der Link führt zur Registrierungsseite und füllte sofort ein Feld aus - einen Aktionscode.
Wenn wir den Aktionscode vergleichen, der sich im Eingabefeld und in der Adressleiste befindet, sehen wir, dass sie vollständig übereinstimmen.

Was können wir dagegen tun?
Es ist üblich, zu versuchen, sich zu ändern. Wenn der Aktionscode mit dem Wert in der Datenbank verglichen wird, erhalten wir mit hoher Wahrscheinlichkeit einen Fehler. Beim Ändern der Eingabe erfolgt jedoch keine Anforderung an den Server, und es stellt sich heraus, dass die Eingabe nur überprüft wird, wenn Sie auf die Registrierungsschaltfläche klicken.
Ich denke, hier können Sie bereits etwas Interessanteres tun: Ändern Sie unseren Aktionscode direkt in der Adressleiste und sehen Sie, was passiert. Wenn sie keinen Promotion-Code speziell für den Habr haben, den ich sofort erraten habe,
sowie hundert verschiedene Zeichensätze , können wir die Werte des Eingabefelds definitiv über den Adresslink ändern.

Der nächste Schritt besteht darin, den HTML-Code zu beobachten. RMB im Eingabefeld -> Artikelcode anzeigen.

Hier sehen Sie sofort, dass wir den Wert des Eingabefeldes ändern. Versuchen wir es zu beenden und zum Beispiel einen Link hinzuzufügen. Dazu müssen wir nur den Link ändern und können den Inhalt der Seite ändern:

Ergebnis: Wir haben gerade eine xss-Sicherheitslücke auf der Website des Hosting-Anbieters gefunden.
Und was dann?
Ich denke, es lohnt sich, tiefer zu gehen. Der Link ist irgendwie flach und nicht interessant. Wir möchten dies alles den Eigentümern des Dienstes mitteilen und im Idealfall eine Belohnung erhalten (das Unternehmen hat übrigens keine Bug Bounty, was bedeutet, dass all dies nicht bezahlt wird, aber dann wusste ich nichts davon). Versuchen wir, den Block zu platzieren, zu stabilisieren und das Bild einzufügen. Was wird dafür benötigt? egal - URL ändern.
Ich denke, dass es sich nicht lohnt, HTML und CSS zu beschreiben, also habe ich hier nur angegeben, was passiert ist. Habr blockiert einen Teil von Tags, verwirft andere - ich kann den Linkcode hier nicht einfügen.
Ich werde hier einen Link posten. Ich weiß nicht, ob sie im Moment arbeitet, aber als sie den Beitrag gepostet hat, hat sie gearbeitet. Wer es braucht - zieht den Link heraus und analysiert.Vergütung
Denken Sie nicht, dass upCloud sich vollständig geweigert hat zu zahlen. Stattdessen boten sie ihre Dienste kostenlos an. Aber ich habe diese Art der Zahlung abgelehnt, da ich jetzt nicht daran interessiert bin, einen Server zu mieten.
Wie kann diese Sicherheitsanfälligkeit ausgenutzt werden?
Hier ist alles einfach: Sie können zunächst Daten von allen neuen Benutzern sammeln, mit Phishing-Sites enden und das Hosting eines anderen als Ihr eigenes verwenden. Sie können alle Links auf der Seite durch Ihre eigenen ersetzen oder das Formular durch Benutzer ersetzen. Es reicht aus, sie als Empfehlungen zu senden. Natürlich können Sie eine Anfrage aus dem Formular an den Server ersetzen, damit der Aktionscode nicht überprüft wird (bei der Registrierung wird der Aktionscode überprüft und die Antwort wird mit einem Fehler an den Client zurückgegeben, dies wird jedoch durch Aktivieren von zhs behoben).
Was die Entwickler vergessen haben:
Es ist ganz einfach: Benutzereingaben validieren. SQL-Inj funktioniert dort nicht - der Dienst hängt an WordPress und verarbeitet wiederum eingehende Zeilen.
Deshalb können wir:
- Überprüfen Sie den Promo-Code mit der Basis, wenn Sie die Seite rendern
Es ist langsam und nicht gerechtfertigt. Die Datenbank wird nicht zusätzlich belastet, und dies hat keinen Sinn, wenn sie bei der Registrierung noch überprüft wird.
- Fahren Sie den Aktionscode durch die reguläre Saison
/ ^ [A-Z0-9] + $ / - reicht aus, um Werte zu validieren und vor Schwachstellen zu schützen. Und es funktioniert schneller als das Abfragen der Datenbank, und der Effekt ist nicht schlechter - XSS wird entfernt.
Fazit
Die Eigentümer des Dienstes wurden 48 Stunden + 2 Tage zuvor darüber informiert, dass ich per E-Mail und LinkedIn mit denen verhandelte, die zumindest irgendwie mit der Entwicklung zu tun hatten. Alle Gespräche kamen zu: "Bitte sagen Sie uns, wie Sie es gemacht haben, aber wir werden natürlich nicht für Schwachstellen bezahlen." Ich möchte auch hinzufügen, dass die Website auf die gleiche Weise JS-Skripte von Drittanbietern akzeptiert: sowohl über eine Quelle von Drittanbietern als auch durch direktes Schreiben von Code. Im zweiten Fall erkennt Google Chrome jedoch automatisch xss und rendert eine Fehlerseite anstelle einer Serviceseite.
Ich hoffe, jeder Programmierer wird alle Eingabedaten validieren und das Querystring nicht vergessen. Und ich bin mir auch sicher, dass der Artikel jemandem helfen wird, dies im Voraus zu bemerken und dieses Problem zu Hause zu beheben.
Vielen Dank für Ihre Aufmerksamkeit.