Предотвращение нападений инжекции командной строки

Не может быть самым пифоническим, но

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]
9
задан AstroCB 30 August 2014 в 02:11
поделиться

7 ответов

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

Править: DrFloyd, оболочка ответственна за оценку вещей как обратная галочка. Никакая оболочка, никакая оценка оболочки. Очевидно, Вы все еще добрались для знания о любых потенциальных глюках безопасности в программах, которые Вы называете - но я не думаю, что этот вопрос об этом.

5
ответ дан 4 December 2019 в 21:13
поделиться

Не используйте черный список для предотвращения инжекций. Если будут n способы ввести код, то Вы будете думать о n - m где m> 0.

Используйте белый список принятых параметров (или шаблоны). Это намного более строго по своей природе, но это - природа безопасности.

1
ответ дан 4 December 2019 в 21:13
поделиться

Когда Вы Процесс. Запустите новый процесс, предоставьте параметры в его аргументе Параметров вместо того, чтобы создать целую командную строку сами.

Не имейте времени для надлежащего теста, но я думаю, что это должно помочь охранять его к некоторому уровню.

Проверит это завтра.

Править: А-ч, кто-то избил меня к нему снова. Но вот другая точка: Попытайтесь использовать Консоль. InputStream (не может помнить точное имя) к данным по запасам вместо передающих параметров, который является возможным решением? как фиксация команда, таким образом, это читает из ОБМАННОГО устройства, и Вы затем снабжаете данными через входной поток вместо этого.

2
ответ дан 4 December 2019 в 21:13
поделиться

В C++ в Windows Вы просто выходите \и "при необходимости, заключаете в кавычки аргумент и ShellExecute это. Затем все в кавычках нужно рассматривать как текст.

Это должно проиллюстрировать:


#include <iostream>
#include <string>
#include <windows.h>
#include <cstdlib>
using namespace std;

// Escape and quote string for use as Windows command line argument
string qEscape(const string& s) {
    string result("\"");
    for (string::const_iterator i = s.begin(); i != s.end(); ++i) {
        const char c = *i;
        const string::const_iterator next = i + 1;
        if (c == '"' || (c == '\\' && (next == s.end() || *next == '"'))) {
            result += '\\';
        }
        result += c;
    }
    result += '"';
    return result;
}

int main() {
    // Argument value to pass: c:\program files\test\test.exe
    const string safe_program = qEscape("c:\\program files\\test\\test.exe");
    cout << safe_program << " ";

    // Argument value to pass: You're the "best" around.
    const string safe_arg0 = qEscape("You're the \"best\" around.");

    // Argument value to pass: "Nothing's" gonna ever keep you down.
    const string safe_arg1 = qEscape("\"Nothing's\" gonna ever keep you down.");

    const string safe_args = safe_arg0 + " " + safe_arg1;
    cout << safe_args << "\n\n";

    // c:\program files\test\  to pass.
    const string bs_at_end_example = qEscape("c:\\program files\\test\\");
    cout << bs_at_end_example << "\n\n";

    const int result = reinterpret_cast<int>(ShellExecute(NULL, "open", safe_program.c_str(), safe_args.c_str(), NULL, SW_SHOWNORMAL));
    if (result < 33) {
        cout << "ShellExecute failed with Error code " << result << "\n";
        return EXIT_FAILURE;
    }
}

Но, с любым методом Вы используете, необходимо протестировать ад из него, чтобы видеть, что он действительно предотвращает инжекцию.

2
ответ дан 4 December 2019 в 21:13
поделиться

Ну, если бы можно вызвать инструменты программно без командной строки, которая, вероятно, была бы наилучшим вариантом. Иначе Вы могли потенциально выполнить инструмент командной строки через пользователя, который не имеет абсолютно никакого доступа, чтобы сделать что-либо (кроме, возможно, единственного каталога, которому они не могут делать ничего плохого с)..., хотя это может закончить тем, что повредило инструмент, в зависимости от того, что делает инструмент.

Просто отметьте, я никогда не должен был сталкиваться с этой проблемой, потому что я никогда не должен был на самом деле вызывать инструмент командной строки из внешне стоящего приложения, где инструмент требует входа от пользователя.

0
ответ дан 4 December 2019 в 21:13
поделиться

Хм...

Это кажется, что у Вас есть список допустимых команд, которые пользователи могут выполнить. Но Вы не хотите, чтобы они выполнили их всех.

Вы могли попытаться взять фактическую командную строку и проверить, что файл существует в "безопасном" месте, по крайней мере.

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

0
ответ дан 4 December 2019 в 21:13
поделиться

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

@Curt Hagenlocher обратная галочка может уничтожить Вас. Если Windows System является установкой "неправильно", или система Unix позволяет его, dir &bt; del *&bt; сначала выполнит del *, команда затем использует вывод вместо del *, который в этом случае, не будет иметь значения, потому что нет ничего к dir (или ls)

0
ответ дан 4 December 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: