Analyse du site

On se se log au site par le /register et ensuite par le /login , pour arriver sur l’index du site. Rien d’intéressant nous s’y trouve.

On a juste notre simple cookie qui peut être utile plus tard

image.png


Analyse code source

On lit donc le code source et on s’aperçoit, que le database du site est en MongoDB. Il y a deux fichiers qui vont nous intéresser: tasks.route.js et constant.js

Il y a 3 “collections” (ou “tables” en SQL): on a config , tasks et users , mais cette dernière ne nous sera pas utile. La collection config est celle ou se trouve le flag:

db.config.insertOne({
    value: '{{FLAG}}',
    type: 'flag'
})

tasks.route.js

La partie vulnérable du code nous permet d’utiliser l’opérateur aggregate avec un filtre, que nous, client, pouvons choisir. On pourrait donc utiliser par exemple en filtre, l’opérateur $lookup pour JOIN ou UNION la collection tasks avec config .

Task.aggregate([updatedFilter, { $limit: 1 }]) 
      .then((t) => {
        res.json(t);
      })

Ainsi, la stratégie serait de JOIN tasks , la table on l’on est avec la table config , mais, c’est bien plus complexe, car certains opérateurs sont blacklistés. Allons donc voir ça de plus près.

constant.js

Voici la liste des opérateurs Mongo bannis:

DISABLED_OPERATION_MONGO: [
    "$listLocalSessions",
    "$listSessions",
    "$listSearchIndexes",
    "$listSampledQueries",
    "$indexStats",
    "$limit",
    "$documents",
    "$regex",
    "$func",
    "$lookup", // Oh non :c
    "$where",
    "$currentOp",
    "$changeStream",
    "$vectorSearch",
    "$unwind",
    "$unset",
    "$setWindowFields",
    "$search",
    "$searchMeta",
    "$queryStats",
    "$planCacheStats",
    "$collStats",
    "$graphLookup",
    "$replaceRoot",
    "$mergeObjects",
    "$setUnion",
    "$setIntersection",
    "$meta",
    "$zip",
    "$unionWith",
    "$match",
    "$out",
    "$merge",
    "$accumulator",
    "$function",
    "$set"
  ]

Comme on peut le voir ci-dessus, $lookup est banni. Il faut donc réfléchir à une approche différente.

Dans tous ces opérateurs, il y en a un qui n’est pas banni, $facet . Il va nous permettre de $lookup en bypassant le filtre, qui ne vérifie que le premier opérateur donné. Comme $facet fonctionne ? C’est très simple,

$facet permet de créer des agrégations multi-facettes qui caractérisent les données à travers plusieurs dimensions, ou facettes, au sein d'une seule étape d'agrégation. Les agrégations à facettes multiples fournissent plusieurs filtres et catégorisations pour guider la navigation et l'analyse des données. Les détaillants utilisent couramment les facettes pour restreindre les résultats de recherche en créant des filtres sur le prix du produit, le fabricant, la taille, etc.

Exemple