Maison >développement back-end >tutoriel php >Explication complète des vulnérabilités PHP (8) - Fractionnement des réponses HTTP
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↙
↙
↙
Renvoyer l'en-tête de réponse 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 :
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']);?>
DemandeGET /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
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) !