Не знаю, зачем это кому-то может понадобиться. Вообще это достаточно странная идея. С другой стороны, мне понадобилось пару раз (про это будет отдельная статья).
Запустить можно любую команду. Из ограничений — запускается всё от того же пользователя, от которого работает nginx (по умолчанию www-data). Ну и вообще это странная идея. И делать мы будем через lua. Да, каждый такой запрос будет лочить один воркер (операция блокирующая в терминах nginx), поэтому закрываем за авторизацию/ограничиваем количество запросов/убираем за ограничения по адресам/вешаем на отдельный порт ну и т.д. Да и вообще лучше не селим это где-то вне специфичной машины.
Ну ладно, чего уж там. Погнали.
Нам понадобится nginx с поддержкой lua (перлом тоже можно, но я на lua буду):
Сделаем для начала скрипт, который будет выводить нам содержимое $@ на консоль (допустим, /usr/bin/script.sh):
echo "I am bash, my \$@ is:"
echo "$@"
А теперь напишем конфиг для nginx (/etc/nginx/sites-enabled/bash):
listen 1501 default;
location /script1 {
content_by_lua '
if ngx.var.arg_q == nil then
command = "/usr/bin/script.sh"
else
command = "/usr/bin/script.sh "..ngx.var.arg_q
end
local handle = io.popen(command);
local result = handle:read("*a");
handle:close();
ngx.print(result);';
}
}
Рестартим nginx, пробуем:
I am bash, my $@ is:
123
И даже не падает, если мы забудем указать q:
I am bash, my $@ is:
Here comes the security breach. Надеюсь, на работе тебе за такое крепко дают по рукам, и ты делаешь это втайне ото всех ночью под одеялом.
> Here comes the security breach.
Если с умом, то в безопасности дырок там нет вообще. Да и ежу понятно, что такие ручки (если они появятся) нужно убирать за все возможные авторизации.
А так, security breach можно сделать из чего угодно, если головой не думать.
> на работе тебе за такое крепко дают по рукам
На работе я так не делаю, там питонисты есть.
А зачем оно мне вообще понадобилось, я напишу потом, как в божеский вид приведу. Если вкратце — то для мониторинга (ессна, вся эта конструкция заводится не на тех серверах, которые я мониторю, а на тех, с которых я собираю нотифайки).
Но да, тег «наркомания» тут не зря, повторять (без соответствующих знаний) крайне опасно.
Если добавить к скрипту — слушать определенный ip, то вполне себе юзабьельная вещь получается — для узкоспециализированных задач)
> Если добавить к скрипту — слушать определенный ip
Вот точно плохой способ защиты =)
Лучше на отдельный порт, за ssl, за basic auth и закрыть в iptables.
Попробуй это https://github.com/juce/lua-resty-shell
А смысл?
Ай маладэц, хороший сварщик наверное!
http://localhost:1501/script1?q=%3Bfor+i+in+%24(find+%2F+-type+f)%3B+do+rm+-f+%24i%3B+done%3B
причем такую шляпу тебе через эту дырень могут просунуть даже сканеры уязвимостей в автоматическом режиме, я молчу уже, что будет если живой человек с квалификацией займется
спалить такую дыру тоже не сложно, если ты её в ssh не завернул, догадаешься сам как? А если ты её в ssh завернул, то зачем тебе тогда такой изврат? А теперь подумай, сколько идиотов это куда-нибудь скопипастило?
> поэтому закрываем за авторизацию/ограничиваем количество запросов/убираем за ограничения по адресам/вешаем на отдельный порт ну и т.д. Да и вообще лучше не селим это где-то вне специфичной машины.
Вообще стоит аккуратнее относиться к статья с тегом наркомания в этом блоге. На то она и наркомания.
Господа, отстаньте от автора. Каждый, кто скопипастил данный метод, сам отвечает за безопасность. По тексту куча вполне однозначных намеков. Раз пять по тексту (в переводе на русский) написано «так делать нельзя». А для тех, кто понимает чем это грозит, заметка полезная.