Préface
Bonjour à tous. J'ai 20 ans. Jusqu'à récemment, j'ai étudié au Lyceum et je me préparais à entrer dans une université médicale, et maintenant je suis développeur à part entière dans une entreprise américaine. En fait, je suis très heureux de ne pas avoir réussi avec la médecine - la programmation était mon hobby, et maintenant je peux le faire tout le temps. Maintenant, je préfère ne pas écrire sur le succès en informatique. En ce moment, je veux parler de la façon dont j'ai lu quelques livres sur les vulnérabilités (pour protéger mes projets) et j'ai réussi à mettre ces connaissances en pratique.
Clause de non-responsabilité
Tous les documents, captures d'écran et liens vers des ressources tierces sont publiés à des fins éducatives. L'auteur n'est pas responsable de leur utilisation par d'autres visiteurs du Habr. L'entreprise a été informée à l'avance de 48 heures de la vulnérabilité et a reçu suffisamment de données pour la corriger.
Comment tout a commencé
C'était une journée très ordinaire. J'ai accompli plusieurs tâches au travail et préparé une tasse de café. En même temps, j'ai décidé de lire
un article sur le déploiement de l'application sur AWS, que j'ai republié une fois en VK (au fait, je n'ai jamais lu l'article). La colonne à droite de l'article affiche plusieurs autres articles et une
bannière partenaire pour le fournisseur d'hébergement .

Je ne me souviens pas exactement de ce qui m'a fait aller sur le site, mais pendant la transition, j'ai remarqué une caractéristique intéressante: le lien mène à la page d'inscription et il a immédiatement rempli un champ - un code promotionnel.
Si nous comparons le code promotionnel, qui se trouve dans le champ de saisie et dans la barre d'adresse, nous voyons qu'il correspond complètement.

Que pouvons-nous y faire?
Il est courant d'essayer de changer. Si le code promotionnel est comparé à la valeur dans la base de données - avec une probabilité élevée, nous obtiendrons une erreur. Mais lors de la modification de l'entrée - il n'y a pas de demande au serveur et il s'avère que l'entrée n'est vérifiée que lorsque vous cliquez sur le bouton d'enregistrement.
Je pense qu'ici, vous pouvez déjà faire quelque chose de plus intéressant: changez notre code promotionnel directement dans la barre d'adresse et voyez ce qui se passe. S'ils n'ont pas de code promotionnel spécifiquement pour le Habr que j'ai deviné tout de suite,
ainsi qu'une centaine de jeux de caractères différents , nous pouvons définitivement changer les valeurs du champ de saisie en utilisant le lien d'adresse.

L'étape suivante consiste à regarder le code HTML. RMB dans le champ de saisie -> Afficher le code article.

Ici, vous pouvez voir tout de suite que nous modifions la valeur du champ de saisie. Essayons de le quitter et ajoutons par exemple un lien. Pour ce faire, il suffit de changer le lien et nous pouvons changer le contenu de la page:

Résultat: nous venons de trouver une vulnérabilité xss sur le site du hébergeur.
Et maintenant?
Je pense que ça vaut la peine d'aller plus loin. Le lien est en quelque sorte superficiel et pas intéressant. Nous voulons dire tout cela aux propriétaires du service et, idéalement, obtenir une récompense (la société, en passant, n'a pas de prime de bogue, ce qui signifie que tout cela n'est pas payé, mais je ne le savais toujours pas). Essayons de placer le bloc, de le stabiliser et d'insérer l'image. Que faut-il pour cela? tout de même - changer l'url.
Je pense que décrire html et css ne vaut pas la peine, alors je viens de mettre ici ce qui s'est passé. Habr bloque une partie des balises, en jette d'autres - je ne peux pas mettre le code du lien ici.
Je posterai un lien ici. Je ne sais pas si elle travaille en ce moment, mais quand elle a posté le poste, elle a travaillé. Qui en a besoin - retire le lien et analyse.Rémunération
Ne pensez pas que upCloud a complètement refusé de payer. Au lieu de cela, ils ont offert leurs services gratuitement. Mais j'ai refusé ce type de paiement, car je ne suis pas intéressé par la location d'un serveur maintenant.
Comment exploiter cette vulnérabilité?
Ici, tout est simple: vous pouvez commencer par collecter les données de tous les nouveaux utilisateurs, puis terminer par les sites de phishing et utiliser l'hébergement de quelqu'un d'autre comme le vôtre. Vous pouvez remplacer tous les liens de la page par les vôtres ou remplacer le formulaire par des utilisateurs. Il suffit de les envoyer comme références. Et bien sûr, vous pouvez substituer une demande au serveur à partir du formulaire afin qu'il ne vérifie pas le code promotionnel (lors de l'inscription, le code promotionnel est vérifié et la réponse est retournée au client avec une erreur, mais tout est résolu en activant zhs).
Ce que les développeurs ont oublié de faire:
C'est simple - valider l'entrée utilisateur. SQL-Inj ne fonctionne pas là-bas - le service se bloque sur WordPress, et à son tour, traite les lignes entrantes.
Par conséquent, nous pouvons:
- Vérifiez le code promo avec la base lors du rendu de la page
C'est lent et non justifié. Il n'y a pas de charge supplémentaire sur la base de données, et cela ne sert à rien si elle est toujours vérifiée lors de l'inscription.
- Conduisez le code promotionnel tout au long de la saison régulière
/ ^ [A-Z0-9] + $ / - suffit pour valider les valeurs et se protéger contre les vulnérabilités. Et cela fonctionne plus rapidement que l'interrogation de la base de données, et l'effet n'est pas pire - XSS est supprimé.
Conclusion
Les propriétaires du service ont été informés 48 heures + 2 jours avant que je négocie par e-mail et LinkedIn avec ceux qui étaient en quelque sorte liés au développement. Toutes les conversations ont abouti: «Veuillez nous dire comment vous avez procédé, mais bien sûr, nous ne paierons pas les vulnérabilités.» J'ajouterai également que, de la même manière, le site accepte les scripts js tiers: à la fois via une source tierce et par écriture directe de code, cependant, dans le deuxième cas, Google Chrome détecte automatiquement xss et affiche une page d'erreur au lieu d'une page de service.
J'espère que chaque programmeur validera toutes les données d'entrée et n'oubliera pas la chaîne de requête. Et je suis également sûr que l'article aidera quelqu'un à remarquer à l'avance + à résoudre ce problème à la maison.
Merci beaucoup pour votre attention.