2010-10-01 7 views
16

मैं एक PHP डेवलपर नहीं हूं लेकिन मैं PHP5 एप्लिकेशन की सुरक्षा का आकलन कर रहा हूं।

लेखक extract($_POST) और extract($_GET) पर कुछ स्थानों पर कार्यों के बाहर निर्भर था।

मेरा सुझाव extract($_POST, EXTR_PREFIX_ALL, 'form') पर कॉल करना है और तदनुसार कोड बदलना है, लेकिन उनका रुख यह है कि बाद में किसी भी चर को फिर से परिभाषित किया जा रहा है।

मैं पोस्ट मूल्यों के अंदर _ENV=something प्रदान करके सुपरग्लोबल्स को आसानी से बदल सकता हूं, लेकिन सुपरग्लोबल्स सरणी हैं और मैं उन्हें तारों में बदल रहा हूं, मुझे यकीन नहीं है कि इसका बुरा प्रभाव हो सकता है।

मैं कई isset() उपयोगों पर एक नज़र देख सकता हूं और वहां से पीछे की ओर जाता हूं .. लेकिन मुझे लगता है कि इस तरह के हमले हैं जिनके स्रोत के ज्ञान या प्रवीणता की आवश्यकता नहीं है।

क्या कुछ दिलचस्प चर सेट/बदला जा सकता है, शायद PHP के अंदरूनी हिस्सों में?

धन्यवाद

+3

एकमात्र चीज जो दिमाग में आती है, इस तरह एक सुपरग्लोबल ओवरराइट कर रही है (यानी '_SERVER' नामक सरणी को '$ _POST' के अंदर परिभाषित करना और उसे वैश्विक स्थान में निकालना)। क्या यह संभव है? क्या यह '$ _SERVER' ओवरराइट करेगा? शायद नहीं (मुझे उम्मीद है)। मुझे कुछ समय निकालना होगा। –

+1

हां, यह कम से कम _ENV के साथ काम किया। EXTR_SKIP प्रदान करना ठीक करेगा। –

+1

* (सुझाव) * [सुहोसिन] का उपयोग करना (http://www.hardened-php.net/suhosin/a_feature_list.html) सुपरग्लोबल्स की ओवरराइटिंग को रोकता है और संभावित हमले वैक्टरों को कम करने में मदद करता है। – Gordon

उत्तर

14

आकलन करने के लिए यह कोशिश "हो सकता है":

फ़ाइल: htdocs/मिश्रण/निष्कर्षण।php

<?php 
extract($_GET); 
var_dump($_SERVER);//after extract 
?> 

और ऐसा कहते हैं:

http://localhost/mix/extraction.php?_SERVER=test

मेरी Xampp पर निकालने के बाद उत्पादन कि तरह दिखता है:

स्ट्रिंग (4) "परीक्षण"

यदि कोई आपके परिवर्तनीय नामकरण के बारे में कुछ जानता है और आप $ _POST या $ _GET ग्लोबल्स पर निकालने का उपयोग करते हैं, तो आपको एक गंभीर समस्या है। कुछ समय और काम के साथ प्रयास और त्रुटि से कुछ अर्थों को ढूंढना संभव होगा।

अपने स्रोत को जानने के बिना एक घुसपैठिया $ _SESSION जैसे किसी भी वैश्विक चर को हाइजैक करने का प्रयास कर सकता है (लेकिन यहां अगर आप session_start() करते हैं, तो निकालने से पहले ($ _ GET), $ _COOKIE या $ _SERVER और यहां तक ​​कि इस तरह उनके लिए विशिष्ट मूल्यों को निर्धारित:

//localhost/mix/extraction.php?_SERVER[HTTP_USER_AGENT]=Iphone

आप ऐसा निकालने का उपयोग करते हैं:

निकालें ($ var, EXTR_SKIP);

निकालें ($ var, EXTR_PREFIX_SAME, 'उपसर्ग');

निकालें ($ var, EXTR_PREFIX_ALL, 'उपसर्ग');

तो आप पूरी तरह से सुरक्षित रहेंगे।

+0

पहले मैंने सोचा था कि आपका उत्तर बस जो कुछ भी हमने पहले ही कहा है उसे बहाल कर रहा था। फिर मैंने इस तरह के विशिष्ट सरणी आइटम सेट करने की कोशिश की, और हे भगवान! –

1

मुझे किसी भी सार्वभौमिक शोषण की जानकारी नहीं है।

वैसे भी, यह निश्चित रूप से बहुत खराब अभ्यास है।

स्क्रिप्ट का लेखक क्या कह रहा है कि स्क्रिप्ट की सुरक्षा उस पर निर्भर करती है कि बाद में कुछ भी नहीं भूलना, जो भयानक है।

वैश्विक निकालने के खिलाफ मजबूत सामान्य तर्क के लिए() आईएनजी, What is so wrong with extract()?

+1

दुर्भाग्य से, मेरे पास यह कहने का अधिकार नहीं है कि "यह बुरा है", या मैंने यह नहीं पूछा होगा :-( –

+0

@ मार्कोमेनियन, जितना अधिक आपको पूछना चाहिए और * पता *, यदि आपके पास * है सिर्फ यह कहना है कि "यह बुरा है"। – Pacerier

9

देखने डेटाबेस कनेक्शन के लिए एक आम नाम $ db है, लेकिन है कि बस प्रणाली को उड़ाने हैं, तो आप $ _SESSION चर अधिलेखित कर सकते हैं।

session_start(); 

$_SESSION['test'] ='test'; 
var_dump($_SESSION); 
$vars = array("_SESSION" => 'awww'); 
extract($vars); 
var_dump($_SESSION); 

उत्पादन

array(1) { 
    ["test"]=> 
    string(4) "test" 
} 
string(4) "awww" 

ओवरराइट चर $idUser या अन्य मज़ेदार चीज़ों, गंदगी iterables करना चाहते हैं? निकालने के लिए array('i' => 5) पास करें, स्कोप के आधार पर आपके पास सभी प्रकार के मज़ेदार हो सकते हैं।

संपादित करें:

मैं सिर्फ एक और के बारे में सोचा, अगर प्रपत्र फ़ाइल अपलोड handeling है, $fileName, $fileExtention कोशिश क्यों नहीं और $file नामित चरों के ऊपर लिख, और आप इसे बाहर फ़ाइलों को पढ़ने में प्राप्त कर सकते हैं देखने के अपने अनुमति स्तर

+0

तो यह * * किया जा सकता है? हे भगवान –

+0

अन्य सुपरग्लोबल्स की तरह, _SESSION एक सरणी है। मैं इसे एक स्ट्रिंग में बदल सकता हूं, लेकिन उस से _SESSION का कोई भी उपयोग बिंदु सिर्फ एक त्रुटि का कारण बनता है। अब मैं विशिष्ट चर देख रहा हूं, धन्यवाद। –

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