2013-05-03 6 views
7

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

भाग:

session_start(); 

    if(isset($_POST['foo'])) 
    { 
    $_SESSION['foo'] = $_POST['foo']; 
    } 

    if(isset($_SESSION['foo'])) 
    { 
    $foo['foo'] = $_SESSION['foo']; 
    } 

    if(is_file("inc/". $foo['foo'] . "/bar.php")) { 
    // code 
    } 
    else { 
    // code 
    } 

नोट: फ़ाइल (इंक/परीक्षण/bar.php) मौजूद है,

मैं उसका कोड का परीक्षण करना चाहता था, और मैं निम्नलिखित अनुरोध भेजे:

पोस्ट :: foo => परीक्षा/bar.php% 00

पोस्ट :: foo => परीक्षा/bar.php \ 0

curl_setopt (। $ ch, CURLOPT_POSTFIELDS, 'foo = परीक्षा/bar.php' chr (0x00));

लेकिन इनमें से कोई भी तरीका काम नहीं करता है। क्या वह कोड वास्तव में सुरक्षित है? और किसी की सुरक्षा को बाईपास करने के लिए कोई नल बाइट कैसे भेज सकता है। मैं अपने दोस्त को दिखाना चाहता हूं कि उसका कोड सुरक्षित नहीं है।

+0

मैं एक php विशेषज्ञ नहीं हूं इसलिए मैं इसे एक टिप्पणी के रूप में छोड़ दूंगा, लेकिन आप "../../ जैसे कुछ पास नहीं कर सके। ./../ "और फाइल सिस्टम के लिए मनमाने ढंग से पहुंच प्राप्त करें? –

+0

@ChrisThompson के अंत में "/bar.php" है, इसलिए यह सभी मामलों में ../../../bar.php की जांच करेगा – John

+0

ठीक है तो यह केवल एक खतरा है यदि आप संभावित रूप से _some other_ ' बार।php' फ़ाइल जिसे आपको –

उत्तर

5

मैं this समाधान मिल गया है संक्षेप में, ऐसा लगता है अपने कोड कुछ हद तक असुरक्षित है, और sanitizing विधि यह है:

भीतर जहर अशक्त बाइट इंजेक्शन को रोकने के लिए तरीके का एक संख्या में हैं पीएचपी।

$foo['foo']= str_replace(chr(0), '', $foo['foo']); 

मैं भी में एक विशेषज्ञ नहीं हूँ: ये बैकस्लैश शून्य बाइट भागने शामिल है, तथापि, ऐसा करने के लिए सबसे सिफारिश की जिस तरह से पूरी तरह से निम्न के समान कोड का उपयोग करके बाइट दूर करने के लिए है नल-बाइट हमले, लेकिन यह समझ में आता है। और भी विवरण here

+1

ओपी को सत्र में '$ _POST' से मूल्य सहेजते समय नल-बाइट वर्ण को भी प्रतिस्थापित करना चाहिए! यह '$ _SESSION ['foo']' के संभावित बाद में और असुरक्षित पुन: उपयोग को रोकता है। – ComFreek

-3

पीएचपी नल बाइट्स के लिए बहुत ही उपयुक्त है .... क्योंकि php c पर बना है। सी में एक नल बाइट स्ट्रिंग का अंत है।

आपको अपने द्वारा उपयोग की जाने वाली प्रत्येक स्ट्रिंग पर नल बाइट्स को हटा देना चाहिए .. आईओ आधारित कार्यों पर यह और भी महत्वपूर्ण है जैसे en move_uploaded_file।

यहां तक ​​कि (int) "1 \ 01" vurnable है क्योंकि यह 1

Php कार्यों कि अशक्त बाइट्स संभाल कर सकते हैं int करने के लिए डाले उदाहरण के लिए कर रहे हैं

str_replace strpos पर भी

strlen डेटाबेस क्वेरीज माईस्कल चार, वर्कर और टेक्स्ट कॉलम पर नल बाइट्स के लिए उपयुक्त है

+1

यह PHP 5.3.4 और उसके बाद के लिए अब सत्य नहीं है। (जो सभी मौजूदा संस्करण हैं।) – duskwuff

+0

दरअसल, यहां फॉलोअप सामग्री का एक गुच्छा सिर्फ झूठा है। PHP के स्ट्रिंग हैंडलिंग फ़ंक्शंस (जैसे 'strlen() ') नल बाइट्स सहित तारों पर पूरी तरह से ठीक काम करते हैं, जैसा कि MySQL करता है। – duskwuff

+0

धन्यवाद -1 के लिए भी php 5.4 पर शामिल है जिसमें फ़ंक्शन एक नल बाइट के साथ टूट जाएगा और "हेलो \ 0there" चुनें, फिर आप देखेंगे .. –

संबंधित मुद्दे