История изменений
Исправление shdown, (текущая версия) :
изначально речь о цитате ТС:
ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ
Да. Тут есть несколько уровней, которые нужно распаковать:
1. ТС использует os.execute
и io.popen
из Lua, которые запускают /bin/sh -c string
.
2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).
3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка Lua. Если бы умели, можно было бы писать что-то вроде
os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
{
'/bin/sh',
'-c',
'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
url
}
При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute (https://gist.github.com/shdown/f4d9c832fa9751114cea6354b0a6120f).
3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\''
и обрамить результат в одинарные кавычки:
function shell_escape(x)
return "'" .. x:gsub("'", "'\\''") .. "'"
end
4. Проблемы с экранированием есть в любом языке, где есть строки (если бы они были только в bash, почему мы говорим про SQL-инъекции?). Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:
os.execute2({'"$0" "$@"', 'python3', '-c', string.format('print("%s")', my_str)})
Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.
---
Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.
Исправление shdown, :
изначально речь о цитате ТС:
ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ
Да. Тут есть несколько уровней, которые нужно распаковать:
1. ТС использует os.execute
и io.popen
из Lua, которые запускают /bin/sh -c string
.
2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).
3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка Lua. Если бы умели, можно было бы писать что-то вроде
os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
{
'/bin/sh',
'-c',
'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
url
}
При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute (https://gist.github.com/shdown/f4d9c832fa9751114cea6354b0a6120f).
3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\''
и обрамить результат в одинарные кавычки:
function shell_escape(x)
return "'" .. x:gsub("'", "'\\''") .. "'"
end
4. Проблемы с экранированием никак не зависят от языка (если бы они были только в bash, почему мы говорим про SQL-инъекции?). Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:
os.execute2({'"$0" "$@"', 'python3', '-c', string.format('print("%s")', my_str)})
Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.
---
Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.
Исправление shdown, :
изначально речь о цитате ТС:
ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ
Да. Тут есть несколько уровней, которые нужно распаковать:
1. ТС использует os.execute
и io.popen
из Lua, которые запускают /bin/sh -c string
.
2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).
3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка Lua. Если бы умели, можно было бы писать что-то вроде
os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
{
'/bin/sh',
'-c',
'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
url
}
При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute (https://gist.github.com/shdown/f4d9c832fa9751114cea6354b0a6120f).
3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\''
и обрамить результат в одинарные кавычки:
function shell_escape(x)
return "'" .. x:gsub("'", "'\\''") .. "'"
end
4. Проблемы с экранированием никак не зависят от языка (если бы они были только в bash, почему мы говорим про SQL-инъекции?). Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:
os.execute2({'python3', '-c', string.format('print("%s")', my_str)})
Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.
---
Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.
Исправление shdown, :
изначально речь о цитате ТС:
ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ
Да. Тут есть несколько уровней, которые нужно распаковать:
1. ТС использует os.execute
и io.popen
из Lua, которые запускают /bin/sh -c string
.
2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).
3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка Lua. Если бы умели, можно было бы писать что-то вроде
os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
{
'/bin/sh',
'-c',
'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
url
}
При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute (https://gist.github.com/shdown/f4d9c832fa9751114cea6354b0a6120f).
3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\''
и обрамить результат в одинарные кавычки:
function shell_escape(x)
return "'" .. x:gsub("'", "'\\''") .. "'"
end
4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:
os.execute2({'python3', '-c', string.format('print("%s")', my_str)})
Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.
---
Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.
Исправление shdown, :
изначально речь о цитате ТС:
ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ
Да. Тут есть несколько уровней, которые нужно распаковать:
1. ТС использует os.execute
и io.popen
из Lua, которые запускают /bin/sh -c string
.
2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).
3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка. Если бы умели, можно было бы писать что-то вроде
os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
{
'/bin/sh',
'-c',
'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
url
}
При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute.
3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\''
и обрамить результат в одинарные кавычки:
function shell_escape(x)
return "'" .. x:gsub("'", "'\\''") .. "'"
end
4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:
os.execute2({'python3', '-c', string.format('print("%s")', my_str)})
Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.
---
Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.
Исправление shdown, :
изначально речь о цитате ТС:
ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ
Да. Тут есть несколько уровней, которые нужно распаковать:
1. ТС использует os.execute
и io.popen
из Lua, которые запускают /bin/sh -c string
.
2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).
3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка. Если бы умели, можно было бы писать что-то вроде
os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
{
'/bin/sh',
'-c',
'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
url
}
При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute.
3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\''
и обрамить результат в одинарные кавычки:
function shell_escape(x)
return "'" .. x:gsub("'", "'\\''") .. "'"
end
4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:
os.execute2({'python3', '-c', string.format('print("%s")', my_str)})
Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.
Исправление shdown, :
изначально речь о цитате ТС:
ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ
Да. Тут есть несколько уровней, которые нужно распаковать:
1. ТС использует os.execute
и io.popen
из Lua, которые запускают /bin/sh -c string
.
2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).
3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка. Если бы умели, можно было бы писать что-то вроде
os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
{
'/bin/sh',
'-c',
'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
url
}
При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute.
3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\''
и обрамить результат в одинарные кавычки:
function shell_escape(x)
return "'" .. x:gsub("'", "'\\''") .. "'"
end
4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:
os.execute2({'python3', '-c', string.format('print("%s")', my_str)})
Этот код содержит инъекцию, в my_str можно подсунуть нечно, что исполнит произвольный код на питоне.
Исходная версия shdown, :
[qote] изначально речь о цитате ТС:
ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ
Да. Тут есть несколько уровней, которые нужно распаковать:
1. ТС использует os.execute
и io.popen
из Lua, которые запускают /bin/sh -c string
.
2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).
3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка. Если бы умели, можно было бы писать что-то вроде
os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
{
'/bin/sh',
'-c',
'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
url
}
При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute.
3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\''
и обрамить результат в одинарные кавычки:
function shell_escape(x)
return "'" .. x:gsub("'", "'\\''") .. "'"
end
4. Проблемы с экранированием никак не зависят от языка. Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:
os.execute2({'python3', '-c', string.format('print("%s")', my_str)})
Этот код содержит инъекцию, в my_str можно подсунуть нечно, что исполнит произвольный код на питоне.