Maison >développement back-end >tutoriel php >Explication complète des vulnérabilités PHP (8) - Fractionnement des réponses HTTP

Explication complète des vulnérabilités PHP (8) - Fractionnement des réponses HTTP

黄舟
黄舟original
2016-12-22 09:44:441519parcourir

Format de requête HTTP

1) Demander des informations : par exemple, "Get /index.php HTTP/1.1", demander le fichier index.php

2) En-tête : Par exemple, " Hôte : localhost", indiquant l'adresse du serveur

3) Ligne vierge

4) Texte d'information

"Demande d'informations" et "en-tête" doivent utiliser des caractères de nouvelle ligne (CRLF ) À la fin, une ligne vide ne peut contenir que des nouvelles lignes et aucun autre espace.

L'exemple suivant envoie une requête HTTP au serveur www.yhsafe.com

GET /index.php HTTP/1.1↙ //Demande d'informations

Hôte :www. yhsafe.com ↙ //En-tête

↙ //Ligne vide

↙Le symbole représente la touche Entrée. Après la ligne vide, vous devez appuyer sur un espace pour. envoyer une requête HTTP, parmi les en-têtes de requête HTTP, seul l'en-tête Host est nécessaire, et le reste des en-têtes HTTP est déterminé en fonction du contenu de la requête HTTP.

Méthode de requête HTTP

1) GET : Réponse à la demande

2) HEAD : La même réponse que GET, seul l'en-tête de réponse est requis

3) POST : envoyer les données au serveur pour traitement, les données sont incluses dans le corps du message HTTP

4) PUT : télécharger des fichiers

5) DELETE : supprimer des fichiers

6) TRACE : suivre les requêtes reçues

7) OPTIONS : renvoyer les méthodes de requête HTTP prises en charge par le serveur

8) CONNECT : convertir les connexions de requête HTTP en TCP/IP transparent canal

Format de réponse HTTP

Une fois que le serveur a traité la requête HTTP faite par le client, il enverra la réponse suivante.

1) La première ligne est le code d'état

2) La deuxième ligne commence par d'autres informations

Le code d'état contient un numéro qui identifie le statut et un mot qui décrit le statut. Par exemple :

HTTP/1.1 200 OK

200 est un numéro qui identifie le statut, et OK est un mot qui décrit le statut. Ce code d'état indique que la demande est réussie.

Exemples de requêtes et de réponses HTTP

Ouvrez cmd et entrez telnet, entrez open www.00aq.com 80

Ouvrez la connexion et entrez

GET /index .php HTTP/1.1↙

Hôte :www.00aq.com↙

Explication complète des vulnérabilités PHP (8) - Fractionnement des réponses HTTP

Renvoyer l'en-tête de réponse HTTP

Explication complète des vulnérabilités PHP (8) - Fractionnement des réponses HTTP

Contenu de la page d'accueil renvoyé

Utiliser PHP pour envoyer des requêtes HTTP

La fonction d'en-tête peut être utilisée pour envoyer du HTTP requêtes Et l'en-tête de réponse

Prototype de fonction

void header(string string [, bool replace [, int http_response_code]])

string est la chaîne de l'en-tête HTTP

Si replace est TRUE, cela signifie remplacer l'en-tête similaire précédent par l'en-tête actuel ; si replace est FALSE, cela signifie utiliser plusieurs en-têtes similaires. La valeur par défaut est TRUE

http_response_code Utilisé pour. forcer le code de réponse HTTP à utiliser la valeur de http_response_code

Exemple :

// Ouvrir la connexion par socket Internet
$fp = fsockopen(www.00aq.com, 80); > // Écrire l'en-tête de la requête HTTP
fputs($fp, "GET / HTTP/1.1rn");
fputs($fp, "Host: www.00aq.comrnrn"); chaîne de réponse
$http_response = "";
while (!feof($fp))
{
// Lire la chaîne de réponse HTTP de 256 bits
$http_response = fgets($. fp, );
}
// Ferme la connexion au socket Internet
fclose($fp);
// Affiche les informations de réponse HTTP
echo nl2br(htmlentities($http_response) ; , permettant le L'utilisateur cible doit utiliser une requête pour générer deux réponses, la première réponse est la réponse du serveur et la seconde est la réponse conçue par l'attaquant. Cette attaque se produit parce que le programme WEB place les données utilisateur dans l'en-tête de réponse HTTP, et ces données utilisateur sont soigneusement conçues par l'attaquant.

Les fonctions qui peuvent souffrir du fractionnement des réponses aux requêtes HTTP sont les suivantes :

header(); setcookie(); se produit généralement dans : Explication complète des vulnérabilités PHP (8) - Fractionnement des réponses HTTP
En-tête de localisation : écrit les données de l'utilisateur dans l'adresse URL redirigée

En-tête Set-Cookie : écrit les données de l'utilisateur dans les cookies

Exemple :

header("Emplacement : " . $_GET['page']);

?>

Demande

GET /location.php? page=http://www.00aq.com HTTP/1.1↙

Hôte : localhost↙


Retour

HTTP/1.1 302 trouvé

Date : mercredi 13 janvier 2010 03:44:24 GMT

Serveur : Apache/2.2.8 (Win32) PHP/5.2.6

X-Powered-By : PHP /5.2.6

Emplacement : http://www.00aq.com

Content-Length : 0

Keep-Alive : timeout=5, max=100

Connexion : Keep-Alive

Content-Type : text/html

Accédez au lien ci-dessous, une fenêtre de connexion apparaîtra directement

http:// localhost/location.php?page= Type de contenu : texte/html HTTP/1.1 200 OK Type de contenu : texte/html Longueur du contenu : 158 Le mot de passe du compte

est converti en une chaîne lisible :

Content-Type : text/html

HTTP/1.1 200 OK

Content-Type : text/html

Content-Length : 158


Compte
Mot de passe

Une requête HTTP a produit deux réponses

Méthodes pour éviter :

1) Remplacez le caractère de nouvelle ligne CRLF

header("Location: " . strtr($_GET['page'], array("r"=> ; "", "n"=>"")));
?>


2) Utiliser la dernière version de PHP

Dans la dernière version de PHP, les caractères de nouvelle ligne ne sont plus autorisés dans les en-têtes HTTP

Explication complète des vulnérabilités PHP (8) - Fractionnement des réponses HTTP

Masquer les en-têtes de réponse HTTP

httpd.conf dans Apache, option ServerTokens = Prod, ServerSignature = Off

php dans php.ini, option expose_php = Off

Ce qui précède est la solution complète aux vulnérabilités PHP (8) - Fractionnement des réponses HTTP Pour plus de contenu connexe, veuillez. Suivez le site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn