Categories
.NET ASP.NET Web

Comentarios de lado del servidor en ASP.NET 2

Existen ocasiones en que para corregir determinados problemas es necesario deshabilitar ciertas partes de una página ASP.NET, esto en algunos casos puede conseguirse usando sólo los comentarios HTML, pero para otros casos en que cierta funcionalidad no está implementada o los nombres de los controles entran en conflicto, se produce un error porque la página sigue su flujo de ejecución.

En el siguiente ejemplo se produce un error porque el identificador texto se repite:

html:

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <!--<asp:Label ID="texto" runat="server">

</asp:Label>-->

        <asp:TextBox ID="texto" runat="server"></asp:TextBox>

    </div>
    </form>
</body>
</html>

Para solucionar este problema, se debe usar comentarios del lado del servidor (<%-- comentario --%>).

html:

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <%--<asp:Label ID="texto" runat="server"></asp:Label>--%>

        <asp:TextBox ID="texto" runat="server"></asp:TextBox>
    </div>
    </form>
</body>
</html>

Al usar este tipo de comentarios, el texto contenido dentro de <%-- --%> no será enviado al navegador.

Referencia: Tip/Trick: Using Server Side Comments with ASP.NET 2.0

Categories
Firefox Internet Explorer Seguridad Web XSS

XSS y las peculiaridades de los navegadores

Hay ocasiones en que la forma como interpreta HTML un navegador puede producir algunos problemas de seguridad, esto normalmente se debe a descuidos de un programador que asume cierta funcionalidad.

Veamos el siguiente ejemplo — basado en una aplicación del mundo real ™ — que muestra un caso de estos:

php:

<?php

if (empty($_GET['el'])) {
        die;
}
/* Función genérica que sirve para eliminar ciertos caracteres */
function clean_input_string($string) {
        return preg_replace('/[ <>\'"\r\n\t\\()]/', '', stripslashes($string));
}

$elemento = clean_input_string($_GET['el']);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <title>Demo</title>
        <script type="text/javascript">
            //<![CDATA[
            function ponerFoco(id){
                        var elemento = document.getElementById(id);
                        if (!elemento) return;
                        elemento.focus();
                }
            //]]>
        </script>
</head>

<body onload="ponerFoco('<?php echo $elemento; ?>')">   

        <form method="post" action="foo.php">
            <input type="text" name="usuario" id="usuario" />
                <input type="text" name="contrasena" id="contrasena" />
               
                <input type="submit" name="postback" value="Entrar »" />
        </form>
</body>

</html>

Como se puede observar, el código lo único que hace es intentar poner el foco en el elemento que se especifique en el parámetro el, éste valor antes es filtrado (elimina los caracteres espacio, <, >, ', ", \r, \n, \t, (, ) y \ ) por la función de propósito general clean_input_string — la aplicación de donde se tomó el código hace uso de esa función en varias partes.

Puesto que se eliminan los caracteres \, (, ) y ', en circunstancias normales no debería ser posible ejecutar javascript en el ejemplo mostrado; si el contiene ');alert(document.cookie)// entonces lo que llega al navegador es <body onload="ponerFoco(';alertdocument.cookie//')">, valor completamente inofensivo para nuestros propósitos.

Haciendo unas pruebas con un valor parecido al anterior, pero esta vez usando entidades HTML en lugar de los caracteres que son eliminados por la función clean_input_string, se consiguen resultados interesantes. Por ejemplo, para el = &#39;&#41;;alert&#40;document.cookie&#41;//, el HTML generado es:

html:

<body onload="ponerFoco('');alert(document.cookie)//')">

A simple vista, parece igual de inofensivo que el anterior caso, sin embargo si esa página carga en Firefox o Internet Explorer (no probé con otros navegadores), además de ejecutarse la función ponerFoco, se mostrará un mensaje mostrando las cookies almacenadas.

Este tipo de problemas se pueden solucionar evitando en lo posible enviar directamente los valores que dependen del cliente, definiendo filtros más específicos (formatos de identificadores válidos) o separando la generación de javascript y HTML en documentos distintos.

Categories
.NET Utilidades Windows Forms

Habilitar la corrección de ortografía en Windows Live Writer

Si algunos usan la versión en inglés de Windows Live Writer y un sistema operativo en español para escribir textos (en inglés obviamente), se habrán dado cuenta que la corrección de ortografía no funciona bajo estas condiciones.

Para solucionar este problema, lo único que tienen que hacer es crear una pequeña aplicación que ejecute Windows Live Writer en un dominio de aplicación personalizado:

csharp:

using System.Globalization;
using System.Threading;

class Program
{
        static void Main()
        {
                string exe = @"C:\Archivos de programa\Windows Live Writer\WindowsLiveWriter.exe";
               
                System.AppDomain app = System.AppDomain.CreateDomain(exe);
                Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
               
                app.ExecuteAssembly(exe);
        }
}

Si alguien quiere ahorrarse un poco de tiempo, puede descargar el ejecutable que preparó Roy Osherove.

Categories
Humor

Soy programador…

Soy programador
Fuente

Categories
ASP Sql Injection

Programadores despistados y la seguridad

Ayer recibí el siguiente correo de un preocupado programador (lo de programador despistado no va dirigido a la persona que me escribió el mail 😉 ):

A pesar de haber leido mucho sobre inyección de SQL, aun son incapaz de realizar ataques decentes. Mis ataques son tan malos que hacen que mis webs parezcan seguras cuando no lo son.

Siguiendo tus consejos suelo usar autenticas paranoias en el filtrado de cadenas de entrada. Ademas de validar los tipos de todas aquellas variables que vayan a una consulta.

Ultimamente me he encontrado con un programador que me ridiculiza diciendo que él lo arregla asi de facil:

asp:

<%
function sanear(original)
        texto=""
        cadena="abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789,.':;ÁÉÍÓÚÀÈÌÒÙáéíóúàèìòùïüÏÜçÇ¡!¿?-_*+-/=)(@%ºª{[]} "
        origen=original&""
        if len(origen)>0  then
        for i=1 to len(origen)
                letra=mid(origen,i,1)
                if instr(cadena,letra)>0 then
                        texto=texto&letra
                end if
        next
        end if
        sanear=texto
end function

usuario=replace(sanear(request.Form("usr")),"'","")
contrasena=replace(sanear(request.Form("pass")),"'","")

set rs=con.execute("select * from usuario where usuario='"&usuario&"' and contrasena='"&contrasena&"'")

%>

La base de datos está en una intranet y es un SQL Server 2000

A mi me parece que eso es tan inseguro como no poner login. Pero no he sido capaz de crear una cadena que se salte ese filtro 🙁

Me atasco con el espacio en blanco que no esta permitido. Probé el %00, el char(32)... pero algo hago mal porque no lo logro 🙁

Necesito demostrar que eso es inseguro o seguiran usando esa mierda de validaciones en toda la aplicacion.

Puedes usar mi pregunta para un articulo si te parece oportuno, de hecho seguro que tus lectores sabrian darme una respuesta.

No hay que ser experto en ASP para darse cuenta que ese código es bastante ineficiente y le dá una falsa sensación de seguridad al que lo programó, así mismo, me parece que también demuestra su falta de experiencia en programación.

Viendo el ejemplo particular que pone, creo que no es vulnerable a inyección de SQL. ¿Ustedes qué opinan?