Предотвращение внедрения оболочки в Windows - PullRequest
0 голосов
/ 01 марта 2012

Это считается безопасным?

def clipboard(foo):
import sys, subprocess
system = sys.platform

if 'win' in system:
    cmd = 'echo %s | CLIP' % (foo,)
    subprocess.call(cmd, shell=True)

if __name__ == '__main__':
    clipboard('RMDIR /S/Q C:\') #something terrible that actually works.

Не имеет значения, что это просто копирование некоторого ввода в буфер обмена. Я спрашиваю: оборачивая мои аргументы в форматированную строку, ссылаясь на элемент в кортеже, я предотвращаю возможность атаки инъекцией оболочки?

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Нет, инъекция оболочки все еще происходит в вашем случае для этого: буфер обмена ('hello; RMDIR / S / QC: \') это поместит 'hello' в ваш буфер обмена, но выполнит rmdir.может помочь использование кавычек и shlex, например:

import shlex
if 'win' in system:
    safe_arg='"%s"'%foo
    assert len(shlex.split(safe_arg)) == 1, "Injection attempt detected"
    cmd = 'echo %s | CLIP' % (safe_arg,)

РЕДАКТИРОВАТЬ: приведенный выше код все еще не является ни безопасным, ни надежным.Я думаю, что следующее, по крайней мере, лучше, но все же может сообщать о ложных срабатываниях:

foo = str(foo.strip('"').strip())
safe_arg = '"%s"'%foo
if '"' in foo:
    if (len(shlex.split(safe_arg, False, False)) != 1): ...
0 голосов
/ 02 марта 2012

Как вы можете прочитать в руководстве , выполнение команд в оболочке уязвимо для атак с использованием инъекций, если в качестве команды вы используете неанитизированный текст из ненадежного источника.Это проблема только в том случае, если программа работает с большими привилегиями, чем обычно имеет пользователь.

Это полностью отделено от вопроса о неизменяемых объектах.Строки Python неизменны .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...