Pular para o conteúdo
Todos os conceitos

Injeção de argumento

Mesmo sem shell, um valor que começa com hífen pode virar uma OPÇÃO do programa, mudando o que ele faz.

Passar os argumentos como lista (subprocess.run(["gust", name]), sem shell=True) fecha a injeção pelo shell: um ; no name seria só parte do nome, porque não há shell para lê-lo. Mas há uma injeção que sobra, mais sutil.

Quase todo programa de linha de comando lê os argumentos que começam com - como opções, não como dados. Se o seu valor é um argumento por conta própria e você consegue fazê-lo começar com -, ele pode virar uma opção que você não deveria controlar. Um programa que imprime arquivos com --read FILE, ou que tem um --token, passa a obedecer você.

O exemplo clássico é o programa chamar tool <valor> sem o separador --. Se valor é --token, a linha vira tool --token, e a opção dispara. Isso é injeção de argumento: você não injetou um comando novo, injetou uma flag de linha de comando no comando que já existia.

A defesa tem duas partes: pôr -- antes do valor do usuário (["tool", "--", valor]), que diz "daqui pra frente é dado, não opção", e validar o valor para ele nunca começar com -.

sem shell: argumentos como lista sem o separador -- gust --token lido como OPCAO com -- antes do valor gust -- --token lido como um nome
Sem o separador, o nome que começa com hífen é lido como a opção token; com o separador antes do valor, o mesmo texto vira só um nome.

Aparece nestes desafios