Pruebas de penetración a través de la gestión de auditoría de código

Prefacio

Durante las pruebas de penetración, a menudo nos encontramos con situaciones en las que las vulnerabilidades públicas se han solucionado y solo hay un cuadro de inicio de sesión. En este momento, si puede obtener el código para la auditoría, a menudo puede abrir una nueva puerta.

Code Audit, como su nombre indica, es descubrir los defectos o los peligros ocultos para la seguridad en el código fuente del programa leyendo el código fuente, y encontrar y resolver los riesgos por adelantado. Esta es una parte muy importante de la construcción de SDL de la Parte A . En las pruebas de penetración, las vulnerabilidades del programa se pueden descubrir a través de auditorías de código, y las vulnerabilidades se pueden explotar rápidamente para atacar y lograr el objetivo.

Ideas de auditoría

Las ideas comunes de auditoría son:

1. Busque puntos de función sensibles y lea los códigos de puntos de función;

Ventajas: minería direccional precisa, alta utilización;

Desventajas: el código con nombres irregulares es fácil de ignorar, lo que conduce a la pérdida de oportunidades;

2. Retroceda el proceso de transferencia de parámetros basándose en palabras clave sensibles;

Ventajas: las posibles vulnerabilidades se pueden localizar rápidamente mediante la búsqueda de palabras clave sensibles, minería dirigida, eficiente y de alta calidad;

Desventajas: comprensión insuficiente de la estructura general del programa, ubicación de vulnerabilidades que requieren mucho tiempo, las vulnerabilidades lógicas no se pueden cubrir

3. Lea el código de texto completo directamente;

Ventajas: estar familiarizado con la arquitectura general, comprender el procesamiento del flujo de datos del programa, los archivos de configuración, las funciones de filtrado, etc .;

Desventajas: se necesita mucho tiempo y se necesita suficiente tiempo para familiarizarse con la estructura general;

Método de auditoría

Según si se utilizan herramientas (semiautomatizadas), existen herramientas de escaneo, auditoría manual y varios métodos de auditoría que combinan los dos. El autor prefiere el trabajo duro. Después de todo, no es tan complicado cavar las vulnerabilidades de nivel empresarial normalmente. Las características son muy claras.

Según la dirección del flujo de datos, se puede dividir en auditoría directa y auditoría inversa. La auditoría directa consiste en realizar un seguimiento desde el punto de entrada de la función hasta el final del procesamiento del flujo de datos; la auditoría inversa consiste en buscar en función de algunas palabras clave y ubicar las palabras clave que pueden ser de riesgo Función, y luego vuelva a colocarla en la entrada de la función para ver si hay lagunas en todo el procesamiento.

caso de exito

Caso 1: una auditoría de código provocada por una vulnerabilidad de descarga de archivos arbitraria

En una prueba de autorización, se encontró una vulnerabilidad de descarga de archivos arbitrarios. La idea normal es descargar primero el archivo de configuración del sitio web para ver si la base de datos se puede conectar externamente

Desafortunadamente, el alcance no está permitido (de hecho, muy pocos pueden ser salientes ahora) Afortunadamente, se recopiló un usuario de dominio en el archivo de configuración, lo cual es una sorpresa.

Luego descargue el archivo Download.aspx para ver el contenido

Sabemos que .net es un lenguaje compilado, y generalmente no hay código de servicio en aspx. Aquí vemos que las herencias se usan para heredar el código back-end.

¿Qué son las herencias?

Explicación oficial de MSDN: defina clases de código subyacente para la herencia de páginas. Puede ser cualquier clase derivada de la clase Page. Esta función se utiliza junto con la función CodeFile, que contiene la ruta al archivo fuente de la clase de código subyacente.

El punto popular es que el código está en el dll al que apunta esto hereda, luego descargamos el archivo dll y podemos tener una ola de espionaje en el código de back-end.

Por lo tanto, está diseñado para descargar XXXXXX.Web.dll, después de que el archivo se descarga en el local, IL Spy se abre como una observación visual

Eché un vistazo al catálogo, y ahí está la palabra Subir, y la prioridad ha aumentado considerablemente.

public void uploadFile () 

        { 

            string formStringParamValue = SWFUrlOper.GetFormStringParamValue ("ruta"); 

            string formStringParamValue2 = SWFUrlOper.GetFormStringParamValue ("fn"); 

            bool flag = SWFUrlOper.GetFormStringParamValue ("pequeño"). ToLower () == "verdadero"; 

            …… 

            cadena [] matriz = nueva cadena [] 

            { 

                "jpg", 

                "gif", 

                "png", 

                "bmp" 

            }; 

            string formStringParamValue3 = SWFUrlOper.GetFormStringParamValue ("datos"); 

            prueba 

            {

                System.Web.HttpPostedFile httpPostedFile = base.Request.Files ["Filedata"]; 

                cadena b = cadena.Vacío; 

                string text = string.Empty; 

                if (httpPostedFile.ContentLength> 0) 

                { 

                    text = httpPostedFile.FileName; 

                    if (text.IndexOf (".")! = -1) 

                    { 

                        b = text.Substring (text.LastIndexOf (".") + 1, text.Length - text.LastIndexOf (".") - 1) .ToLower (); 

                    } 

                    SWFUploadFile sWFUploadFile = nuevo SWFUploadFile (); 

                    if (bandera) 

                    {

                        sWFUploadFile.set_SmallPic (verdadero); 

                        sWFUploadFile.set_MaxWith ((formIntParamValue == 0)? sWFUploadFile.get_MaxWith (): formIntParamValue); 

                        sWFUploadFile.set_MaxHeight ((formIntParamValue2 == 0)? sWFUploadFile.get_MaxHeight (): formIntParamValue2); 

                    } 

                    sWFUploadFile.set_IsWaterMark (isWaterMark); 

                    int num = 0; 

                    string text2 = sWFUploadFile.SaveFile (httpPostedFile, formStringParamValue, formStringParamValue2, ref num); 

                    …… 

        }

El archivo se guarda en la línea 38, y no hay filtrado en el contenido, sufijo, etc. del archivo antes, así que puedo profundizar en cualquier archivo y subirlo felizmente. No hables de construcción local, sube un caparazón

<form name = "form" method = "post" action = "http://xxxx.com/cms/SWFUpload.aspx" enctype = "multipart / form-data"> 

<input type = "file" name = "Filedata "> 

<input type =" submit "name =" Submit "value =" upload "> </form>

Si el código aquí está ofuscado, puede usar de4dot para la desofuscación, de4dot admite 10 tipos de métodos de ofuscación:

Dotfuscator 

.NET Reactor 

Xenocode 

CryptoObfuscator 

SmartAssembly 

......

Por ejemplo, la DLL ofuscada con Dotfuscator se ve así:

Utilice de4dot para desofuscar:

Ejecución de la línea de comandos de CMD: de4dot.exe ADD.dll

Mira el efecto:

Básicamente, el código se ha restaurado a un estado legible. Para otro uso avanzado, consulte la introducción en github.

Caso 2: Auditoría de código de un sistema de código abierto

Al autorizar la penetración, se descubrió que solo había un cuadro de inicio de sesión. En este caso, por lo general, solo puede deletrear el diccionario para explosiones. Afortunadamente, el cliente está usando un sistema de código abierto para el desarrollo secundario, y puede bajar al código para análisis.

Obtuve el código y miré la estructura. Es la segunda apertura de thinkphp. Sigue el código del modelo MVC que es una jerarquía.

Debido a que el objetivo es solo el cuadro de inicio de sesión, el foco de mi atención aquí es la carga de archivos, la inyección de SQL y otra idea para omitir el inicio de sesión, sin código ni pitido ~~

La subida es demasiado evidente, no puedo evitar analizarla


            devolver nulo; 
        }



















        if (! in_array ($ archivo ["tipo"], $ uptypes)) { 

            echo "文件 类型 不符!". $ archivo ["tipo"]; 

            devolver nulo; 

        } 

        if (! file_exists ($ carpeta_de_destino)) { 

            mkdir ($ carpeta_de_destino ); 

        } 

        $ nombre de archivo = $ archivo ["tmp_name"]; 

        $ tamaño_imagen = getimagesize ($ nombre de archivo); 

        $ pinfo = pathinfo ($ archivo ["nombre"]); 

        $ ftype = $ pinfo ['extensión']; 

        $ destino = $ carpeta_destino.hora (). ".". $ ftype; 

        if (archivo_existe ($ destino) && $ sobrescribir! = verdadero) { 

            echo "同名 文件 已经 存在 了"; 

            devolver nulo; 

        } 

        si (!

            devolver nulo; 

        } 

        volver "/".$destination; 

    } 

   ......

Solo se detecta el tipo MIME del archivo. Me encantan estos ingenieros de desarrollo para estar seguros.

Sin embargo, ComController se hereda aquí, y hay autenticación de identidad en él. No puede obtener el shell directamente ... Oh, todavía tiene que romper el fondo de inicio de sesión.

Siga ComController para ver el proceso de inspección de certificación

class ComController extiende BaseController { 

    public $ USER; 

    función pública _initialize () { 

        C (ajuste ()); 

        $ usuario = cookie ('usuario'); 

        $ this-> USER = $ usuario; 

        $ url = U ("inicio de sesión / índice"); 

        if (! $ usuario) { 

            encabezado ("Ubicación: {$ url}"); 

            salir (0); 

        } 

        $ Auth = new Auth (); 

        $ allow_controller_name = array ('Subir'); // 放行 控制器 名称

        $ allow_action_name = array (); // 放行 函数 名称

        if (! $ Auth-> check (CONTROLLER_NAME. '/'. ACTION_NAME, $ this-> USER ['uid']) &&! in_array (CONTROLLER_NAME, $ allow_controller_name) &&! in_array (ACTION_NAME,           

            $ this-> error ('¡Sin permiso para acceder a esta página!'); 

        } 

 

        $ user = member (intval ($ user ['uid'])); 

        $ this-> assign ('usuario', $ usuario);

Hmm ... Puede que esté profundamente enamorado de este ingeniero de desarrollo. Obtenga la información de autenticación de la cookie y asígnela al objeto $ user, luego podremos controlar el inicio de sesión del usuario y cargar cualquier archivo en segundo plano.

Caso de falla

para resumir

En comparación con la Parte A, las auditorías de código en las pruebas de penetración tienen más que ver con descubrir vulnerabilidades explotables o explotar cadenas para atacar, con el objetivo de obtener permisos más altos tanto como sea posible.

Siento personalmente que la prioridad de las vulnerabilidades en cuestión durante las pruebas de penetración:

Ejecución de comandos> ejecución de código> carga de archivos> inclusión de archivos> inyección SQL> descarga de archivos> vulnerabilidad lógica> SSRF> XSS ...

Además de comprender los principios de las vulnerabilidades, estar familiarizado con lenguajes de programación comunes, funciones peligrosas comunes, protocolos comunes y técnicas de penetración, la auditoría de código requiere algunas herramientas de desarrollo y depuración (IDEA, PHPStrom, PyCharm ...). El contenido anterior no es correcto. Departamento, por favor sea correcto.

Nota:

Dirección del proyecto de4dot: https://github.com/0xd4d/de4dot/

Autor: tropas de Jiuxianqiao VI, reproducido por favor especifique de FreeBuf.COM

https://www.freebuf.com/articles/web/253104.html

Supongo que te gusta

Origin blog.csdn.net/Vdieoo/article/details/109841997
Recomendado
Clasificación