web-dev-qa-db-fra.com

Comment déterminer si une chaîne d'agent d'utilisateur a la syntaxe appropriée ou s'il peut s'agir d'une tentative de piratage?

Je vérifiais mon serveur via awstats pour voir qui visitait mon site et j'ai un agent utilisateur de la valeur suivante:

}__test|O:21:\

Certaines recherches m'ont amené à penser que quelqu'un essayait de pirater mon serveur.

Pour empêcher que de telles choses ne se produisent, quelles sont les règles de syntaxe permettant de déterminer qu'une chaîne d'agent d'utilisateur est légitime à 100% et non une chaîne fabriquée par un pirate informatique? Par exemple, quels caractères sont/ne sont pas autorisés dans une chaîne d'agent utilisateur appropriée et certains caractères doivent-ils être dans un certain ordre?

4
Mike

Il n'y a pas de règles. Un agent utilisateur peut être n'importe quoi .

Il n’existe aucun moyen raisonnable d’inscrire les agents utilisateurs dans la liste blanche, car il en existe un grand nombre d’agents légitimes et vous ne souhaitez pas bloquer accidentellement un utilisateur légitime. Il n’existe pas non plus de moyen de bloquer les mauvais agents utilisateurs car, encore une fois, il n’existe aucun moyen standard de déterminer si un agent utilisateur représente un mauvais utilisateur.

Si vous voulez essayer de bloquer les robots malveillants, vous pouvez comparer un agent utilisateur à cette base de données et voir de qui il s’agit, puis prendre une décision semi-éduquée sur le point de savoir si vous devez le bloquer ou non. Il y a aussi quelques tentatives pour maintenir des listes de mauvais agents utilisateurs mais je ne sais pas à quel point elles sont actuelles et de nouveaux agents utilisateurs apparaissent tous les jours.

3
John Conde

Étant donné que l'agent utilisateur est entièrement contrôlé par le client, il est conseillé de prêter attention à celui-ci, car il peut être utilisé dans diverses attaques.

Caractères autorisés dans l'agent utilisateur

quels caractères sont/ne sont pas autorisés dans une chaîne d'agent utilisateur appropriée et certains caractères doivent-ils être dans un certain ordre?

@ Stephen Ostermiller déjà lié à la RFC2616. Il a été mis à jour dans RFC7231 , mais rien n'a vraiment changé:

User-Agent = produit * (RWS (produit/commentaire))
[...]
produit = jeton ["/" version du produit]
version du produit = jeton

Cependant, il est lié à RFC72 pour spécifier l’apparence des commentaires:

comment = "(" * (ctext/quoted-pair/comment) "" "
ctext = HTAB/SP /% x21-27 /% x2A-5B /% x5D-7E/obs-text
[...]
quoted-pair = "\" (HTAB/SP/VCHAR/obs-text)

C'est une manière élégante de dire que pratiquement tous les caractères sont autorisés dans la partie commentaire de l'agent utilisateur. ()\ sont les seuls qui ne peuvent pas être placés librement.

token est un peu plus restrictif, comme on peut le voir dans RFC72 . Il n'autorise pas (),/:;<=>?@[\]{}.

Comment filtrer les agents utilisateurs

quelles sont les règles de syntaxe permettant de déterminer qu'une chaîne d'agent d'utilisateur est légitime à 100% et non une chaîne fabriquée par un pirate informatique?

Comme les agents utilisateurs peuvent contenir à peu près n'importe quel caractère, un filtrage raisonnable est impossible. Et cela ne veut même pas dire que tous les clients ne suivront pas le RFC (le filtrage ne devrait pas être très restrictif, pour des raisons de convivialité).

Filtrer les entrées de l'utilisateur est une bonne première ligne de défense, mais ce ne devrait jamais être votre seul, car il est extrêmement difficile d'empêcher toutes les attaques avec le filtrage des entrées.

Vous avez besoin de pratiques de codage sécurisées et de mettre en place des défenses appropriées contre les attaques courantes. Donc, si l'agent utilisateur est répercuté, vous devez l'encoder pour empêcher XSS. Si l'agent utilisateur est stocké dans la base de données, vous devez utiliser des instructions préparées pour vous défendre contre l'injection SQL. Si vous transmettez quelque chose à la fonction PHP non sérialisée, vous devez garder à l'esprit l'injection d'objet (je le mentionne car le O:21 a l'air un peu comme s'il s'agissait d'un test). Etc.

Si vous souhaitez une ligne de défense supplémentaire, vous pouvez utiliser un WAF tel que mod_security.

2
tim

L'en-tête _User-Agent_ fait partie de RFC2616 , qui est une version améliorée de RFC1945 , où il est indiqué ce qui suit:

Le champ d'en-tête de demande de l'agent utilisateur contient des informations sur l'agent d'utilisateur à l'origine de la demande. Ceci à des fins statistiques, pour le suivi des violations de protocole et la reconnaissance automatique des agents utilisateurs afin de personnaliser les réponses afin d'éviter les limitations particulières des agents d'utilisateur. Les agents d'utilisateur DEVRAIENT inclure ce champ avec les demandes. Le champ peut contenir plusieurs jetons de produit (section 3.8) et des commentaires identifiant l'agent et tous les sous-produits qui constituent une partie importante de l'agent utilisateur. Par convention, les jetons de produit sont répertoriés par ordre d'importance pour identifier l'application.

_   User-Agent     = "User-Agent" ":" 1*( product | comment )
_

product est défini comme:

_   product         = token ["/" product-version]
   product-version = token
   token           = 1*<any CHAR except CTLs or separators>
_

Et comment comme:

_   comment        = "(" *( ctext | quoted-pair | comment ) ")"
   ctext          = <any TEXT excluding "(" and ")">
_

Source: Paulo Santos la réponse de Quel est le format standard pour la chaîne User-Agent du navigateur?

1
Stephen Ostermiller