dimanche 4 janvier 2009

phpsploitclass.php

Télécharger phpsploitclass.php

Je vais commencer en douceur avec un article qui étudiera la classe "phpsploit", codée par darkfig. Il m'a dit, en effet, que seulement trois personnes utilisaient cette classe pour programmer leurs exploits, leurs outils web, etc... Dire qu'avant, je me tapais l'algo à la main pour récupérer la réponse d'un serveur web... Tout ça, c'est terminé. Bien qu'une description anglaise soit inscrite dans le contenu du fichier (car il faut permettre la compréhension aisée à tous), autant expliquer de nouveau quelques notions en français, et de sorte à convaincre les lecteurs !

Je ferai comme si vous possédez PHP 5 en CLI - Commande Line Interface - car c'est avec cet outil que je fais tourner mes scripts. Si vous avez un serveur web, tant mieux, mais je trouve la console plus pratique.

Allez, on commence par inclure la classe (jusque là, rien de compliqué) :
<?php
require_once('./phpsploitclass.php');
?>



Jusqu'ici, rien de compliqué. En explorant le fichier, on voit cette ligne :
class phpsploit {


On fera donc dans notre script :
<?php
require_once('./phpsploitclass.php');
$objet = new phpsploit();
?>


J'imagine que, pour la plupart d'entre vous, vous ayez déjà fait un peu de POO - Programmation Orientée Objet. Par conséquent, vous saurez donc que notre objet possède :
- des attributs : des sortes de variables internes à l'objet. Ces attributs sont généralement privés, et n'ont pas à être modifiés par l'utilisateur ;
- des méthodes : des sous-outils de manipulation de l'objet. Elles sont généralement publiques, mais peuvent être privées (et il y en a, dans la phpsploitclass !).


get()


La première méthode que nous devrions utiliser n'est autre que la méthode get(). Cette méthode ne prend en compte qu'un seul et unique argument : l'adresse source de la page dont on doit récupérer les informations, j'entends par là les en-têtes de réponses ainsi que le contenu HTML. La méthode retourne la réponse du serveur complète.
<?php
require_once('./phpsploitclass.php');
$objet = new phpsploit();
echo $objet->get("http://geo0w.blogspot.com/");
?>

On teste !

C:\php>php phpsploit1.php
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Last-Modified: Sun, 04 Jan 2009 15:05:21 GMT
Cache-Control: max-age=0 private
ETag: "5b0762bd-de9c-4df7-830f-8fe7e1b4f4ef"
Transfer-Encoding: chunked
Date: Sun, 04 Jan 2009 15:07:09 GMT
X-Content-Type-Options: nosniff
Server: GFE/1.3
Connection: Close

7006
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html dir='ltr' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>

[...]


Faites attention, ça risque de défiler à mort dans la console. Utilisez l'opérateur de redirection de flux > pour enregistrer l'echo du script dans un fichier, afin de le consulter. Chez moi, la réponse fait 37Ko et des poussières !

Bref, on a la réponse du serveur.

Codons-nous un outil qui va permettre de récupérer la source d'une page quelconque, l'argument étant fourni en ligne de commande et correspondant à l'URL.

<?php
require_once('./phpsploitclass.php');
if(!empty($_SERVER['argv'][1])) {
    $objet = new phpsploit();
    echo $objet->get($_SERVER['argv'][1]);
} else {
    echo "Utilisation : ".$argv[0]." [url]\n";
}
?>


Et testons.
C:\php>php phpsploit2.php http://www.google.fr/
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Date: Sun, 04 Jan 2009 15:20:40 GMT
Expires: -1
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=584abc4a64322246:TM=1231082440:LM=1231082440:S=Zvx70flgh8_ZY
o5V; expires=Tue, 04-Jan-2011 15:20:40 GMT; path=/; domain=.google.fr
Server: gws
Transfer-Encoding: chunked
Connection: Close

1785
<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859
-1"><title>Google</title><style>body,td,a,p,.h{font-family:arial,sans-serif}.h{c
olor:#36c;font-size:20px}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:coll
apse}#gbar{height:22px;padding-left:2px}.gbh,.gbd{border-top:1px solid #c9d7f1;f
ont-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}#gbi,#gbs{backg
[...]


On peut désormais récupérer le couple en-têtes de réponses + source de n'importe quelle page, à condition que celle-ci soit disponible. Bref, vous m'avez compris.


post()


Quasiment pareille que la méthode get(). Cependant, celle-ci prendra deux arguments :
- La page cible de la requête post - jusqu'ici, rien de différent de get() ;
- Les données à envoyer, codées sous la forme attribut1=valeur1&attribut2=valeur2...

Un exemple vaut mieux qu'un discours à l'arrache. Faisons un script php qui va s'attendre à recevoir des données postées (celui-là, il sera à mettre sur votre serveur web) :

<?php
if(!empty($_POST)) {
    echo "Tu as posté :\n";
    readfile("php://input");
} else {
    echo "Tu n'as rien posté.";
}
?>


On enregistre sous target.php et on suppose qu'on y a accès à l'URL http://localhost/target.php. Voici, par conséquent, un exemple de script à exécuter sous CLI :

<?php
require_once('./phpsploitclass.php');
$objet = new phpsploit();
echo $objet->post("http://localhost/target.php","pseudo=Geo&pass=superpapi");
?>


On teste sur la console !
C:\php>php phpsploit3.php
HTTP/1.1 200 OK
Date: Mon, 05 Jan 2009 12:30:21 GMT
Server: Apache/2.2.6 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Content-Length: 39
Connection: close
Content-Type: text/html

Tu as posté :
pseudo=Geo&pass=superpapi


Magie, magie ! \o/
On passe à la vitesse supérieure.


addcookie(), agent(), addheader()


Deux fonctions très importantes. Elles permettent de bricoler notre requête HTTP.

La fonction addcookie() attend deux paramètres, représentant respectivement la variable et sa valeur. Exemple :
<?php
require_once('./phpsploitclass.php');
$obj = new phpsploit();
$obj->addcookie('admin',1);

// On peut faire nos requêtes...
$reponse = $obj->get("http://localhost/page.php");
// etc...
?>


De ce fait, à chaque fois que l'on visitera des pages via get() ou post(), le cookie sera inséré dans les en-têtes. Vous pouvez, bien sûr, appelez la fonction addcookie() autant de fois que nécessaire.

La fonction agent() spécifie une valeur pour le champ User-Agent de votre requête HTTP. Cela sert à préciser un navigateur avec lequel vous visitez la page. Une sorte de falsification ; il existe, en effet, des sites qui ne répondent aucun code HTML quand le champ User-Agent est vide ou inexistant. La fonction prend un argument : la valeur d'User-Agent que vous souhaitez. Exemple d'utilisation :

<?php
require_once('./phpsploitclass.php');
$obj = new phpsploit();
$obj->agent("Mozilla Firefox");

// On peut faire nos requêtes...
$reponse = $obj->get("http://localhost/page.php");
// etc...
?>


La fonction addheader() permet de rajouter une en-tête dans votre requête. Elle prend deux arguments, qui sont respectivement le titre de l'en-tête et sa valeur.

<?php
require_once('./phpsploitclass.php');
$obj = new phpsploit();
$obj->addheader("X-Forwarded-For","127.0.0.1");
$obj->addheader("Referer","http://www.google.fr");

// On fait nos requêtes, ...
?>


Note : Bien que des méthodes permettant de manipuler les cookies ainsi que l'User-Agent soient implémentées, il ne nous est pas interdit de faire :
$obj->addheader("User-Agent","Mozilla Firefox");
$obj->addheader("Cookie","PHPSESSID=UnSuperPHPSESSIDPasTresCorrect; admin=1; pseudo=Geo");


On se rend compte que la classe est complète, et ce n'est pas fini. Si je devais la présenter entièrement, je n'en finirais pas.


reset()


Il est important de parler de cette méthode. Elle prend soit 0 argument, soit un. Lorsqu'elle n'en reçoit aucun, elle réinitialise les headers, les cookies et d'autres paramètres. L'appeler ? C'est facile :
$obj->reset();



Conclusion ?


Cet article avait pour but de vous sensibiliser. Je reconnais quand même que je suis allé un peu loin en parlant de plusieurs méthodes implémentées dans l'objet phpsploit. Il y en a d'autres :
- Méthode permettant de récupérer le contenu de Set-Cookie dans la réponse du serveur ;
- Méthode permettant d'afficher les en-têtes uniquement ou le contenu HTML uniquement ;
- Méthode permettant d'uploader un fichier ;
- ...

N'hésitez pas à lire dans phpsploitclass.php, tout y est expliqué en anglais, et simplement.

Si vous voulez un exemple d'exploit web implémenté qui utilise phpsploit, je vous redirige sur cette adresse :
http://venom630.free.fr/geo/tutz/securite_informatique/injections_sql_imbriquees/.
Je vous préviens, je n'avais pas de correcteur orthographique, donc le contenu est peut-être un peu caca à certains endroits.

Je vous laisse, je vais réviser mon éco-droit pour demain. :(
J'espère que cela vous a plu.

Geo

Et c'est parti !

Oh, mon dieu. J'ai succombé. J'ai refait un blog, l'ancien ayant subitement disparu avec l'hébergeur. Dommage, j'avais des articles que j'aimais bien. Tant pis, ouais.

Je parlerai ici de ma collection de polly pockets et de mes recettes de boules puantes ; faut faire chier un max de monde, dans la vie ! >:]

Non, plus sérieusement. Au menu, il y aura majoritairement :
- De l'informatique : étant étudiant en BTS Informatique de Gestion 1ère année, il s'agit d'une science que je pratique beaucoup ;
- De l'informatique : conférez-vous au premier tiret, juste au-dessus !

Attention, j'ai bien dit majoritairement. Aucun article n'est à l'abri d'un sujet autre !

Je vous quitte avec le lien de mon dépôt, qui me faisait - et me fait toujours, en fait - office de stockage de fichiers utiles (plus ou moins, hein !) :
http://venom630.free.fr/geo/

Cya. <o/

Geo