英雄背景无分隔线
Pautas

注射101

Una de las clases de vulnerabilidades más conocidas suelen ser las vulnerabilidades de inyección, especialmente, y no sorprende a nadie, la indiscutible hija del póster: la inyección SQL. Es difícil evitar oír hablar de la inyección de SQL en el mundo de la tecnología, así que vamos a hablar de ello.

Con SQL Injection, es posible manipular el comportamiento de una consulta SQL para que cumpla las órdenes de un atacante.

También hay muchos otros tipos de inyección que, si bien son diferentes en su superficie, funcionan según el mismo principio.

En resumen, algunos de los tipos de inyección más comunes son:

  • SQL注入
  • Secuencias de comandos entre sitios (HTML/Javascript injection)
  • Ruta transversal (inyección de ruta/URL)
  • 命令注入
  • Inyección de código

A small injection 101

Si nos fijamos en la lista anterior de tipos de inyección, todos tienen una cosa en común: todos implican una cadena, que se ejecuta a través de un intérprete, que luego hace lo que representa la cadena. Hemos marcado la «entrada del usuario» entre corchetes.

类型 输入示例 如何解释
查询语言 SELECT name FROM users WHERE username = '{admin}' Name 从用户表中用户名为 "admin "的所有行中选择 "姓名 "列
超文本标记语言 {约翰-史密斯} 用粗体字显示 "约翰-史密斯 "的名字
路径 /var/www/app/documents/{privacy-policy.pdf} 指向 `/var/www/app/documents/`文件夹中的文件 `privacy-policy.pdf`。
指挥 ping {8.8.8.8} 向 IP "8.8.8.8 "发送一系列 ICMP ping
代码 const name = '{John Smith}'; 将常量变量 `name` 设置为 `John Smith

Entonces, ¿qué pasaría si la inserción de la entrada del usuario fuera insegura? ¿Qué podría hacer un atacante? Una vez más, todo lo que esté entre corchetes se considera «entrada del usuario» en este escenario.

类型 输入示例 如何解释
SQL - 注入 从用户中 SELECT name WHERE username = '{1' UNION 从用户中 SELECT passwordhash WHERE username = 'admin}' 从用户表中用户名为 "admin "的所有行中选择 "姓名",并从用户名为 "admin "的用户中选择密码哈希值
HTML - 注入 {} 用粗体字显示 "约翰-史密斯 "这个名字
路径 - 注射 /var/www/app/documents/{.../.../.../.../etc/shadow}。 指向 `/etc/` 文件夹中的 `shadow` 文件
命令 - 注入 ping {8.8.8.8 && ls .} 向 IP `8.8.8.8` 发送一系列 ICMP ping,并用 `ls` 打印当前目录的内容
代码 - 注入 const name = '{John Smith'; exec('ls .'); # }'; 将常量变量 `name` 设置为 `John Smith` 的值,然后执行系统命令 `ls .

En estos ejemplos, toma nota de cómo se puede usar la entrada para influir en el resultado de la entrada del usuario.

Esta es la esencia de lo que es la inyección. Influye en lo que se pasa al intérprete para que haga algo diferente a lo que pretendía el programador original.

Estos son solo los aspectos básicos a tener en cuenta. Hemos separado algunos de los diferentes tipos de inyección en sus propias páginas porque merecen un poco más de atención.

Puedes encontrarlos aquí:

Inyección de comandos

Recorrido de caminos

Inyección SQL

Secuencias de comandos entre sitios