Cómo diseñar la función de carga en el sitio web Cómo diseñar la función de carga en el sitio web Imágenes
Cómo diseñar una función de carga segura de archivos. Nuestro viejo amigo PDP dio una conferencia sobre GIFAR en BlackHat08 estos dos días. Como siempre, el material del PDP es básicamente obsceno, y éste también lo es. El tema trata sobre cómo agrupar un archivo GIF o JPG con un archivo JAR y luego engañar al servidor haciéndole creer que es un archivo GIF o JPG. Resulta que el JAR se ejecuta en la JVM del cliente.
También dio algunos ejemplos de trampas. Por ejemplo, en Office 2007, el archivo doc en realidad está en formato zip y contiene todo xml, por lo que empaquetó el archivo jar en un archivo zip y cambió el sufijo a doc para hacer trampa.
Este es un problema del cliente, pensé en otros problemas, como la carga segura.
Basándonos en experiencias pasadas, podemos diseñar las siguientes reglas de seguridad para la carga de archivos:
1. El directorio para la carga de archivos está configurado como no ejecutable.
2. Determine el tipo de archivo
3. Establezca el nombre de dominio del servidor de archivos por separado.
4. Reescribe el nombre del archivo y la ruta del archivo es impredecible.
La primera regla es obviamente reducir el riesgo de ejecutar scripts en lenguajes dinámicos. Si un webshell se carga con éxito pero no se puede ejecutar, aún puede desempeñar un papel en la defensa en profundidad.
En segundo lugar, al juzgar los tipos de archivos, generalmente requerimos una lista blanca en lugar de una lista negra, porque la lista negra puede estar incompleta y también puede causar algunos riesgos de omisión.
Por ejemplo, la versión anterior de FCKEditor tenía este problema. Simplemente lo pusieron en la lista negra y finalmente lo ignoraron.
Apache tiene una función que analiza el sufijo del archivo después del primer "." como tipo de archivo. Por ejemplo, Apache analizará fvck.php.rar.rar.rar como fvck.php. Hace poco leí el manual de php. En la documentación de instalación, hay una nota especial para este problema:
15. Dígale a Apache que resuelva ciertas extensiones de PHP. Por ejemplo, analicemos
Apache. archivo php. En lugar de simplemente usar la directiva ApacheAddType
, queremos evitar que la carga y creación potencialmente peligrosa de archivos
como exploit.php.jpg se ejecuten como PHP. Con este
ejemplo puedes analizar cualquier extensión de PHP, simplemente agrégala
. Bueno, déjame agregar. phtml para demostrarlo.
IIS6 también tiene esta característica similar, es decir, cuando el nombre de la carpeta es fvck.asp (fvck se puede reemplazar con cualquier valor), cualquier archivo en esta carpeta se ejecutará como asp
Hasta ahora, parece que Microsoft no ha visto ninguna señal de corregir esta característica como un error.
Entonces, si no está familiarizado con las características de estos servidores web, puede pensar que la laguna jurídica es tan mágica: ya he impuesto suficientes restricciones, ¿por qué sigo "haciendo flexiones"?
Al determinar el tipo de archivo, la mayoría de los programas utilizan piratas informáticos para atacar los sufijos de los archivos. Lo principal a tener en cuenta aquí es si algunas funciones de verificación terminan en 0 bytes. Existían vulnerabilidades similares antes de utilizar Internet. Puedes omitir la verificación del tipo de archivo cargando fvck.jpg00.asp
También he visto que solo se verifica el encabezado del archivo. También es fácil hacer trampa. Construya un encabezado de archivo gif legal y luego pegue el webshell detrás de él. Si el sufijo es legal, el navegador también puede analizarlo:
GIF89a?
horsewhip>
Una cosa más avanzada es hacer más comprobaciones de formato de archivo, como comprobar la longitud y el ancho de los píxeles de la imagen, y luego comprimir la imagen nuevamente, y esto es lo que parece. Las imágenes están básicamente distorsionadas y cualquier webshell está roto.
Al comprobar los formatos de archivos, se suelen utilizar algunas clases que se han empaquetado en línea, lo que resulta bastante ventajoso a la hora de escanear formatos de archivos. Sin embargo, la eficiencia es obviamente una consideración a la hora de inspeccionar archivos grandes, y muchos programadores pueden ser reacios a elegir este enfoque por razones de eficiencia.
Pero hoy en día, a juzgar por el método lamentable de vincular archivos en PDP, el formato del archivo debe comprobarse en detalle, porque el atacante no sólo puede apuntar al servidor, sino también al cliente. Si desea garantizar al cliente, asegúrese de verificar el formato del archivo en detalle para que entre en la lista blanca.
En tercer lugar, configurar el nombre de dominio del servidor de archivos por separado también es un tipo de protección para el cliente. Esto puede evitar muchos problemas entre dominios. Si se produce XSS, es posible que el atacante deba romper las restricciones entre dominios para ampliar aún más el éxito. Por ejemplo, cargar archivos en crossdomain.xml puede causar problemas entre dominios en flash. Estos son riesgos reales.
En cuarto lugar, vuelva a escribir el nombre del archivo y la ruta aleatoria del archivo. Esto es para ocultar riesgos. Hoy en día, los programadores concienzudos básicamente lo diseñan de esta manera. También es un medio muy práctico y eficaz para minimizar los riesgos.
Cabe señalar que el algoritmo para construir un nombre de archivo o una ruta aleatorios debe ser lo suficientemente "aleatorio", en lugar de obtener el hash directamente de una cookie o similar. Un mejor enfoque es utilizar una función como random() para generarlo en el servidor. Creo que los programadores todavía tienen esta conciencia, por lo que no entraré en detalles aquí.
¿Cómo conectar un nombre de dominio a tu propio sitio web?
En primer lugar, debe vincular su nombre de dominio al IIS que configuró y luego resolver su nombre de dominio a su IP en el servidor DNS proporcionado por el proveedor de servicios donde solicitó el nombre de dominio. Simplemente publique su propio sitio web en la IP de su servidor:
1. Debe poder crear páginas web y luego crear un sitio web. Si no puede, no importa, siempre y cuando. ya lo tienes.
2. Será muy costoso tener tu propio servidor. Si no tienes mucho dinero, puedes alquilar un servidor virtual en línea y vincular tu nombre de dominio al servidor.
3. Cargue su sitio web en su servidor y luego agregue el nombre de dominio. El proveedor de servicios que solicitó el nombre de dominio le proporcionará el lugar donde se resuelve el nombre de dominio en la IP de su servidor. Puede ingresar su nombre de dominio en el navegador para abrir su propio sitio web. Nota: Si tiene un servidor, el servicio debe tener una IP pública en la red externa. Si es una IP dinámica, otros no pueden acceder a ella. Espero que los puntos anteriores puedan ayudarte.