Pular para o conteúdo
Todos os conceitos

Injeção de comando

Quando o programa monta uma linha de shell com o que você digita, o seu texto vira um comando do sistema.

Muitos programas chamam uma ferramenta do sistema para o trabalho pesado: dar um ping, compactar com tar, converter uma imagem com convert. O jeito mais curto (e mais perigoso) de fazer isso é montar uma linha de texto e entregá-la ao shell, com os.system(...) em Python ou exec(...) em Node.

O problema aparece quando parte dessa linha é texto que você escolheu. O shell não sabe o que é dado e o que é comando: ele lê a linha inteira. Então, se o programa faz os.system("ping -c1 " + host) e você manda host = 192.0.2.5; id, o shell recebe:

ping -c1 192.0.2.5; id

e executa dois comandos: o ping e o seu id. O seu texto deixou de ser um argumento e virou um comando novo. É a injeção de comando: a mesma falha da injeção de SQL, só que o interpretador agora é o shell do sistema, não o banco.

Repare que o 192.0.2.5 nem precisa funcionar. Ele só ocupa o lugar do host; o que importa é o ; e o que vem depois.

o que voce digita no host 192.0.2.5; id o shell le a linha inteira ping -c1 192.0.2.5 ; id comando 1: o ping do app comando 2: o seu, injetado
O host colado na linha de ping carrega um ponto e vírgula e um segundo comando, que o shell executa logo depois do ping.

Aparece nestes desafios