En décembre 2019, quelques mois après avoir commencé à pirater le programme Google VRP, j'ai tourné mon attention vers YouTube. Je voulais trouver un moyen d'accéder à des
Private
vidéos privées ( ) que je ne possède pas.
Lorsque vous téléchargez une vidéo sur YouTube, vous pouvez choisir l'une des trois options d'accès. Open (
Public
) permet à quiconque de trouver et de visionner la vidéo, Link Access (
Unlisted
) permet uniquement aux utilisateurs qui connaissent l'ID de la vidéo (URL
Private
) de visionner la vidéo , Restricted Access ( ) permet uniquement à vous ou à d'autres comptes qui ont reçu l' autorisation de visionner le vidéo pour cette autorisation.
La première chose que j'ai faite a été de télécharger la vidéo sur ma deuxième chaîne YouTube de test et de basculer les options d'accès de la vidéo
Private
afin que je puisse l'utiliser pour les tests. (N'oubliez pas que les tests doivent toujours être effectués sur les ressources / comptes que vous possédez !) Si je peux trouver un moyen d'accéder à la vidéo à partir du premier compte de test, nous identifierons la présence d'un bogue.
J'ai ouvert YouTube avec mon premier compte, vérifié toutes les fonctionnalités et cliqué sur tous les boutons que j'ai pu trouver. Chaque fois que je voyais une requête HTTP avec un identifiant vidéo, je la remplaçais par une vidéo de test avec accès
Private
, en espérant que certaines informations à son sujet seraient divulguées, mais n'a pas réussi. Il semble que le site Web principal de YouTube (au moins tous ses points de terminaison que j'ai testés) vérifie toujours si la vidéo est dans un état
Private
, et lorsqu'il essaie d'interroger la vidéo cible fermée, il renvoie toujours des erreurs telles que
This video is private!
.
Je dois trouver un autre moyen.
Dans une telle situation, une excellente solution peut être de vérifier d'autres produits / services qui ne sont pas notre objectif principal, mais qui interagissent d'une manière ou d'une autre en interne avec ses ressources. S'ils ont accès aux ressources du site, il est possible qu'ils n'aient pas mis en œuvre tous les niveaux de protection du produit principal.
Une cible intéressante qui répond à ces exigences est Google Ads. Il s'agit d'un produit que les annonceurs utilisent pour créer des annonces sur tous les services Google , y compris YouTube . Autrement dit, les annonces que vous regardez devant la vidéo YouTube sont personnalisées par les annonceurs ici sur la plate-forme Google Ads.
J'ai donc enregistré un compte Google Ads et créé une nouvelle annonce qui devrait lire la vidéo à tous les utilisateurs de YouTube en tant qu'annonce désactivable. Au cours du processus de création de l'annonce, j'ai également essayé d'utiliser l'ID vidéo cible partout, mais sans le moindre succès.
Après avoir créé une annonce, j'ai commencé à explorer les différentes fonctionnalités de Google Ads. Il s'agit d'un produit à très grande échelle et doté de nombreuses options et outils différents. J'essayais de trouver quelque chose en rapport avec YouTube.
Sur la plateforme, j'ai trouvé une page intitulée
Videos
, où j'ai vu une liste de vidéos utilisées pour ma publicité. Cliquer sur la vidéo ouvre la section analytique (
Analytics
) de cette vidéo. J'y ai trouvé un lecteur intégré, des statistiques et une fonction intéressante appelée
Moments
. Cela permettait aux annonceurs de « marquer » des moments spécifiques dans une vidéo afin qu'ils puissent voir quand différentes choses se sont produites (par exemple, l'horodatage du moment où le logo de l'entreprise est apparu). Pour être honnête, je n'ai pas bien compris pourquoi les annonceurs utilisent cette fonctionnalité, mais cela m'a semblé intéressant :
En regardant les journaux du proxy, j'ai remarqué qu'à chaque fois que je « marquais un moment », une
POST
demande était envoyée au point de terminaison
/GetThumbnails
. Le corps de cette demande contenait l'ID de la vidéo :
POST /aw_video/_/rpc/VideoMomentService/GetThumbnails HTTP/1.1
Host: ads.google.com
User-Agent: Internet-Explorer-6
Cookie: []
__ar={"1":"kCTeqs1F4ME","2":"12240","3":"387719230"}
Où dans le paramètre la
__ar
valeur
1
était l'ID vidéo et la valeur
2
était le moment en millisecondes. En réponse, une image encodée en base64 a été renvoyée, qui était une vignette utilisée par la plate-forme Ads.
J'ai répété ce que j'avais déjà fait plusieurs fois : j'ai remplacé l'ID dans la requête par l'identifiant de la vidéo fermée du deuxième compte, et, à ma grande surprise, j'ai reçu une image base64 en réponse !
J'ai googlé "base64 à image" et collé les données base64 dans le premier décodeur que j'ai trouvé. L'image contient une vignette de la vidéo privée ciblée ! Ça a marché! J'ai trouvé un bug IDOR fonctionnel (Référence d'objet direct non sécurisée) , grâce à laquelle je pouvais obtenir une image de n'importe quelle vidéo YouTube avec un accès limité !
Mais j'ai pensé, "Hmm, ce n'est qu'un coup." Nous pouvons faire mieux.
Je voulais écrire un script Python avec une preuve de concept qui génère une véritable "vidéo" émouvante. À la recherche d'informations, je me suis rendu compte que si la vidéo était enregistrée à 24 FPS, alors une image s'affiche à l'écran pendant quelques
33
millisecondes. C'est-à-dire qu'il me suffit de télécharger chaque image, en commençant par
0
et en effectuant un incrément de
33
, puis de collecter une sorte de vidéo à partir de toutes les images reçues.
J'ai rapidement écrit un POC qui télécharge les images pendant les trois premières secondes d'une vidéo, les décode, puis génère un GIF. Pour tester le code, je l'ai exécuté avec mon ancienne vidéo, à laquelle j'avais auparavant restreint l'accès car j'en avais honte :
Ainsi, en utilisant ce bug, un attaquant peut télécharger n'importe quelle vidéo fermée sur YouTube, ce qui, à mon avis, est une menace assez sérieuse. Mais, bien sûr, il a quelques limitations que je n'ai pas pu surmonter :
- Dans la vraie vie, vous devez connaître l'ID de la vidéo cible. Une fuite massive d'entre eux serait considérée comme un bug en soi.
- Comme nous ne recevons que des images, nous ne pouvons pas accéder au son.
- La résolution est très faible (mais c'est suffisant pour comprendre ce qui se passe dans la vidéo).
On peut en conclure qu'il vaut toujours la peine de prêter attention aux situations dans lesquelles deux produits différents ont une interaction interne, car les équipes de développement des deux produits connaissent mieux leur système et peuvent manquer des détails importants lorsqu'elles travaillent avec les ressources d'un autre produit.
Trouver des IDOR comme des IDOR peut être un travail très monotone et laborieux, et maintenant j'essaie d'éviter de simples substitutions d'ID aveugles dans l'espoir du meilleur. Si vous testez le produit pendant un certain temps et comprenez sa structure interne, il sera plus efficace (et plus intéressant) d'essayer de réfléchir à diverses actions inattendues auxquelles les développeurs n'auraient peut-être pas pensé, ou de vous concentrer sur des fonctionnalités récemment implémentées, ou faites simplement quelque chose qui nécessite des actions réfléchies. Vous pouvez trouver cela plus agréable à long terme. À mon avis, plus vous comprenez le système, plus les idées sur le piratage vous viennent naturellement à l'esprit.
Mais même dans les systèmes les plus fiables et les plus testés, il est possible que le simple remplacement de l'ID dans la demande entraîne un bogue critique.
Comment la situation a évolué
[11 déc. 2019] - Rapport de
bug envoyé [12 déc. 2019] - Triage initial
[ 20 déc . 2019] - Bug accepté (P4 -> P1)
[08 janv. 2020] - Mesures prises pour corriger le bug avec un désactivation de la fonctionnalité
Moments
[17 janvier 2020] - récompense de 5 000 $ émise
[??? ?? 2020] - la fonction
Moments
est réactivée, elle vérifie maintenant l'accès à la vidéo.
Publicité
VDSina propose VDS avec paiement quotidien, la possibilité de créer votre propre configuration de serveur en quelques clics, d'installer n'importe quel système d'exploitation. Chaque serveur est connecté à un canal Internet de 500 Mégabits et est protégé gratuitement des attaques DDoS !
Abonnez-vous à notre chat sur Telegram .