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
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