
CVE-2024-32830 के साथ फ़ाइलें डाउनलोड करने के लिए PoC कोड
CVE-2024-32830 के साथ फ़ाइलें डाउनलोड करने के लिए PoC कोड
getimagesize बायपासgetimagesize प्रतिबंध को बायपास करने के लिए, हम PHP के लिए एक सरल image/vnd.wap.wbmp इमेज बना सकते हैं।
फ़ाइल प्रकार की जाँच बहुत सरल है:
// https://github.com/php/php-src/blob/0029d2b08bbd3cb3aa293d9c8d55bf31faa9e203/ext/standard/image.c#L917
static int php_get_wbmp(php_stream *stream, struct gfxinfo **result, int check)
{
int i, width = 0, height = 0;
if (php_stream_rewind(stream)) {
return 0;
}
/* get type */
if (php_stream_getc(stream) != 0) {
return 0;
}
/* skip header */
do {
i = php_stream_getc(stream);
if (i < 0) {
return 0;
}
} while (i & 0x80);
/* get width */
do {
i = php_stream_getc(stream);
if (i < 0) {
return 0;
}
width = (width << 7) | (i & 0x7f);
/* maximum valid width for wbmp (although 127 may be a more accurate one) */
if (width > 2048) {
return 0;
}
} while (i & 0x80);
/* get height */
do {
i = php_stream_getc(stream);
if (i < 0) {
return 0;
}
height = (height << 7) | (i & 0x7f);
/* maximum valid height for wbmp (although 127 may be a more accurate one) */
if (height > 2048) {
return 0;
}
} while (i & 0x80);
if (!height || !width) {
return 0;
}
if (!check) {
(*result)->width = width;
(*result)->height = height;
}
return IMAGE_FILETYPE_WBMP;
}
एक मान्य इमेज बनाने का सबसे सरल तरीका होगा दो NUL बाइट्स, उसके बाद चौड़ाई और ऊंचाई के लिए दो < 0x80 बाइट्स।
किसी भी फ़ाइल के लिए ऐसा करना संभव है, php://filter का उपयोग करके।
पहली परत को base64 एन्कोडिंग लागू करने की आवश्यकता होगी ताकि सभी डेटा ASCII हो, जिससे < 0x80 बाधा संतुष्ट हो।
दूसरे फ़िल्टर को पहले दो NUL बाइट्स जोड़ने की आवश्यकता होगी। यह UTF-16BE से UTF-32BE में रूपांतरण को मजबूर करके संभव है। यह iconv को मजबूर करेगा कि वह दो बाइट्स के प्रत्येक हिस्से को एक मान्य UTF-16BE वर्ण के रूप में व्याख्या करे, और फिर UTF-32BE बनाने के लिए उसके पहले दो NUL बाइट्स जोड़े। उपयोग करने के लिए वास्तविक फ़िल्टर है: convert.iconv.utf-16be.utf-32be।
हमारा अंतिम पेलोड है php://filter/convert.base64-encode/convert.iconv.utf-16be.utf-32be/resource=<file here>।