Petit client + ajax + php

Soyez le premier à donner votre avis sur cette source.

Vue 8 813 fois - Téléchargée 892 fois

Description

Permet d'executer des commandes via la commande shell_exec(), Les requettes qui sont envoyer via la page html au script php.

Pour le fonctionnement, deux fichiers.
shell.php qui execute $_GET['shell']; et affiche le resultat.
et le fichier shell.html qui permet d'envoyer la requette au script php qui permet l'affiche du resultat de la commande, via XMLHttpRequest.

Source / Exemple :


shell.html :

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<style type="text/css">
body 	{ background-color:black; color:white; font-size:10px;				}
pre  	{ padding-top:2px; 								}
#input_ { border:1px solid black; width:70%; background-color:black; color:white; 	}
#status { display:block; position:fixed; right:1px; bottom:1px;  background-color:red;  }
</style>
<script type="text/javascript">
//AJAX
var FILE_SCRIPT="shell.php"

function status_write(txt)
{
	document.getElementById('status').innerHTML=txt;
}

function getXhr()
{
	var xhr = null; 
	if(window.XMLHttpRequest) // Firefox et autres
		xhr = new XMLHttpRequest(); 
	else if(window.ActiveXObject){ // Internet Explorer 
		try {
			xhr = new ActiveXObject("Msxml2.XMLHTTP");
		 } catch (e) {
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	else { 
		status_write("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
		xhr = false; 
	} 
return xhr;
}

function ajax_load() //quand ca charge
{ 
	status_write("Chargement en cours ...");
} 
function ajax_end(){ // quand ca a fini
	status_write("Chargement terminé");
}
function wget(get)
{ 
	var xhr_object=getXhr();
	ajax_load();
	xhr_object.open("GET", get, false);
	xhr_object.setRequestHeader("Content-type","text/html ; charset=utf-8");
	xhr_object.send(null);
	ajax_end();
	if(xhr_object.readyState == 4) 
		return (xhr_object.responseText);    
}

//FIN AJAX

function submit_f()
{
	document.getElementById('txt').innerHTML=root+input+"\n"+wget(FILE_SCRIPT+"?shell="+encodeURIComponent(document.getElementById("input_").value)+"");
	document.getElementById('input_').focus();

	return false;
}

var root="<span style='color:red'>root@kiki67100</span>:<span style='color:blue'>~</span># ";
var input="<input name='s' type='text' id='input_'>";

window.onload=function()
{	
	document.getElementById("txt").innerHTML=root+input;
	document.getElementById("input_").focus();
}

</script>
</head>
<body>
<div id="status"></div>
<form name="form" onsubmit="return submit_f()" >
<pre id="txt"></pre>
</form>
</body>
</html>

shell.php :

<?php
if(isset($_GET['shell']))
	echo shell_exec($_GET['shell']);
?>

Conclusion :


Le script ne gère pas tous ce qui est "intéractif" ( nano, vi, dialog ...).

Si vous voulez changer le nom du script php changer juste la variable "FILE_SCRIPT" par ce que vous voulez.

À vos clavier.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
654
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
10 février 2009
1
Il suffit de rajouter un htaccess dans le dossier et voilà, plus de problème de sécurité.. Par contre j'aurais plutot mis ce code sur javascriptfr (vu le peu de php).

Sinon quelques idées d'amélirations :

- var root="root@kiki67100:~# ";
T'as des commandes unix pour recuperer le vrai utilisateur (whoami) et le vrai host (hostname), ça pourrait être sympa qu'il le récupere dynamiquement au chargement du script..

- Pareil pour le nom du dossier, "~" c'est le dossier utilisateur, ça pourrait être sympa qu'il indique le dossier courant (pwd), comme un vrai shell

- Pareil pour le "#" qui indique que l'utilisateur est root.. Ca parrait peu probable pour un serveur web, je pense que dans 99,9% des cas, un "$" serait plus convenable

- Pourquoi avoir créé les fonctions ajax_load() et ajax_end() comme elles sont appellées qu'a un seul endroit (une fois) ?

- Tant qu'à faire, pourquoi ne pas se passer de shell.php et rester sur la meme page, genre en haut de la page: "if(isset($_GET['shell'])) { echo shell_exec($_GET['shell']); die(); }"

- Un dernier truc sympa (et l'interet que ça aurait eu de le faire en ajax plutot qu'avec une banale iframe), ça aurait été de garder un historique des commandes passées

Bon courage,
@+
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
A mon avis, ton code aurait plus ses chances (j'ai pas dit TOUTES ses chances), du côté Javascript de Codes-Sources.
Car sur Phpcs, si l'on ne regarde que le côté PHP, il n'y a qu'une condition et une fonction appelée.

Si l'on veux pousser le vice, il n'y a aucun tests effecutés sur le retour de la fonction, aucune action effectuée si la condition n'est pas remplie, aucuns tests de sécurité (même si ce n'était pas à l'ordre du jour, je te l'accorde).

Je (on) ne veux pas te décourager de ton travail. Je sais que lorsque l'on publie une de ces sources, c'est parce que l'on en est fier. Mais imagine toi crée une petite bête toute mignone, tu as raison d'être fier de toi, tellement que tu veux la déposer dans la savane. Je te laisse imaginer la suite ? ;)

Il ne faut pas te décourager !
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Salut,

Penser sécurité c'est OBLIGATOIRE, INDISPENSABLE et CAPITAL quand on exécute directement une commande shell qui vient d'une entrée utilisateur !!
Ne pas le faire, c'est mettre son serveur ENTIER en danger !
Avertissement donc : cette source est dangereuse en l'état, ne l'utiliser qu'en local à des fins didactiques !

Du coup, j'ai même pas regardé tellement shell.php est une monstruosité, l'exemple type de ce qu'il ne FAUT PAS faire... Désolé...
Messages postés
318
Date d'inscription
samedi 6 mai 2006
Statut
Membre
Dernière intervention
10 août 2013
1
CODEFALSE, je n'ai pas penser à le securité dans ce code ( encore heureux ..). J'ai trouver le résultat assez sympa, alors je l'ai partager.
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
En fait, j'aurai une seule question : pourquoi faire ?? Non, vraiment, je suis curieux ! :)

Parce qu'en lisant ta source, j'ai tous mes capteurs orientés sécurité qui clignotent rouge dans tous les sens :p

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.