# CVE-2022-32444

> Je vous propose mon analyse de la **CVE-2022-32444**, qui est une vulnérabilité de type Open Redirect dans le système de gestion de contenu (CMS) nommé u5CMS.

## Description

* **Vendeur :** Yuba (<https://yuba.ch/>)
* **Produit :** u5CMS (<https://yuba.ch/index.php?c=u5cms&l=en>)
* **Version(s) impactée(s) :** 8.3.5
* **Type de vulnérabilité :** Open Redirect ([CWE-601 - URL Redirection to Untrusted Site ('Open Redirect')](https://cwe.mitre.org/data/definitions/601.html))

La version 8.3.5 d'u5CMS est vulnérable à une faille de type Open Redirect via le paramètre d'URL `u` de la page `/loginsave.php`.

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXA-aPG-dBFXBTzP1DC%2Fuploads%2FJiv6pk7n3wiY3lDaeBvI%2Fimage.png?alt=media\&token=bc7d74a8-d8cf-4987-9eb3-9c5fbbbb7b89)

## Analyse de la vulnérabilité

La page `loginsave.php` est appelée suite à la soumission du formulaire d'authentification disponible à l'URL `/u5admin/` :&#x20;

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXA-aPG-dBFXBTzP1DC%2Fuploads%2FejSPy7fg00b7JBmLwTvU%2Fimage.png?alt=media\&token=751cf18e-1002-4e66-97a6-afcb2aec26f0)

La présence du paramètre `u` est visible directement dans la cible du formulaire et a pour valeur `u5admin` :&#x20;

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXA-aPG-dBFXBTzP1DC%2Fuploads%2FHjVBlaj5HDEKgJZryjcs%2Fimage.png?alt=media\&token=369efc8e-aaae-4ffa-8df7-63633da1e3fe)

La requête est la suivante :&#x20;

```http
POST /u5cms-8.3.5/loginsave.php?u=u5admin HTTP/1.1
Host: 192.168.56.101
Content-Length: 42
Origin: http://192.168.56.101
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.56.101/u5cms-8.3.5/u5admin/
Cookie: i1_l=P; i2_l=d; pidvesa=a; aclan=fr
Connection: close

u=sh4rpforc0rc3%40gmail.com&p=password
```

La réponse est une 302 redirigeant l'utilisateur vers la page d'administration du CMS :

```http
HTTP/1.1 302 Found
Date: Wed, 22 Jun 2022 22:37:16 GMT
Server: Apache/2.4.38 (Debian)
X-XSS-Protection: 0
Set-Cookie: u=sh4rpforc0rc3%40gmail.com; path=/; HttpOnly
Set-Cookie: p=2e6b6cdb26604865418a4814561a43d99ba549e3; path=/; HttpOnly
Location: u5admin?1655937436
Content-Length: 0
Connection: close
Content-Type: text/html; charset=latin1
```

Une fois la redirection effectuée, l'utilisateur se retrouve sur la page d'administration du CMS `/u5admin/` :

![](https://1502624390-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXA-aPG-dBFXBTzP1DC%2Fuploads%2FuZHXd7tYtwuwhwX7sfYN%2Fimage.png?alt=media\&token=6633739e-5aee-47be-b97c-9263e7280fed)

En général, une faille de type OpenRedirect sur une mire de connexion peut s'exploiter de la façon suivante :&#x20;

1. L'URL de la mire est semblable à `http://exemple.com/auth?redirect=openredirectvulnerability`
2. L'attaquant soumet cette URL, en adaptant la valeur désirée au paramètre `redirect`, à sa victime
3. La victime renseigne ses identifiants et se retrouve redirigée vers l'URL renseignée par l'attaquant

Dans le cadre de u5cms, l'exploitation de la vulnérabilité est possible directement en soumettant l'URL `http://u5cms-host/u5cms-8.3.5/loginsave.php?u=openredirectvulnerability`, qu'importe que la victime soit authentifiée ou non :&#x20;

```http
GET /u5cms-8.3.5/loginsave.php?u=https://google.fr HTTP/1.1
Host: 192.168.56.101
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
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
```

```http
HTTP/1.1 302 Found
Date: Wed, 22 Jun 2022 22:54:42 GMT
Server: Apache/2.4.38 (Debian)
X-XSS-Protection: 0
Location: https://google.fr?1655938482
Content-Length: 0
Connection: close
Content-Type: text/html; charset=latin1
```

## Code vulnérable

Le fichier `loginsave.php` va récupérer la valeur du paramètre `u` et y effectuer un léger traitement :&#x20;

* récupérer la valeur dans `$u[0]` et des possibles fragments d'URL dans `$u[1]`
* rediriger l'utilisateur vers `index.php` si la valeur `$u[0]` est une chaine vide
* concaténer un timestamp dans l'URL grâce à la méthode `time()`
* rediriger l'utilisateur vers la valeur contenu dans `$u[0]`

{% code title="loginsave.php" %}

```php
$u=explode('#',$_GET['u']);
if(isset($u[1]))
  $u[1]='#'.$u[1];
else 
  $u[1]='';

if(trim($u[0])=='')
  $u[0]='index.php';
if(strpos($u[0],'?')>1)
  $u[0].='&'.time().$u[1];
else 
  $u[0].='?'.time().$u[1];

header("Location: ".$u[0]);
```

{% endcode %}

## Ressources

* <https://github.com/u5cms/u5cms/issues/50>
