it-swarm.com.de

WP Administrator AJAX Sicherheit - mit POST um eine relative URL einzuschließen

Ich habe mehrere WordPress Admin AJAX Skripte eingerichtet (die nur im Admin-Bereich ausgeführt werden), die derzeit alle separat Aktionen, Funktionen und Nonces verwenden.

Der einzige "echte" Unterschied zwischen diesen Skripten besteht in ihren PHP Funktionen. In dem Bestreben, das System zu rationalisieren, habe ich 1 JS-Funktion und 1 Hauptfunktion PHP geschrieben, um sie alle zu handhaben.

Ein $ _POST-Wert wird mit einem Pfad zum Include gesendet. Wenn wp_ajax_custom_func() ausgeführt wird, wird die Datei PHP eingeschlossen und in locate_template() eingeschlossen.

Es funktioniert super, aber ich mache mir Sorgen, ob dies eine Sicherheitslücke schafft?

Ich bin mir bewusst, dass Angreifer versuchen können, eine Nonce zu fälschen, falsche POST Daten an admin-ajax.php zu senden, XSS-/Cross-Scripting-Angriffe usw.

Ich gehe davon aus, dass dies zum Schutz des Systems beiträgt, da ich das Include in locate_template() eingeschlossen habe. (Long Side ein SSL, wp_verify_nonce und current_user_can natürlich)

Hier ist das Kernkonzept vereinfacht.

Konfiguration

 wp_enqueue_script( 'ajax_js_class', 
         get_template_directory_uri() . '/theme/ajax_js_class.js' 
     );

 wp_localize_script( 'ajax_js_class', 'custom_settings', array(
        'my_ajaxurl'    => admin_url( 'admin-ajax.php' )
         // nonce and action are attached at the form level
    ) );

Funktion

  add_action( 'wp_ajax_run_ajax_class_func', 'run_ajax_class_func' ); 
  // wp_ajax_nopriv_run_ajax_class_func is not used

function run_ajax_class_func() {
    if(isset($_POST['nonce'])) {
        $nonce=  $_POST['nonce']; // the nonce from the form
        $action = $_POST['action_hash']."-special-string"; // changes on each form
        $verify_nonce = wp_verify_nonce($nonce, $action); 

        if( $verify_nonce !== false ) {
            if(isset($_POST['path']) && current_user_can('administrator') ) {
                $path = $_POST['path']; // <= this is my concern...
                include locate_template($_POST['path']);
            } else {
            $output = json_encode( array( "success" => "false", "message" => "fail") );
            }
        } else {
        $output = json_encode( array( "success" => "false", "message" => "fail") );
        }
    } else {
      $output = json_encode( array( "success" => "false", "message" => "fail") );
    }

    echo $output; // this is handled in the include above
    // always die
    die();
}

HTML-Grundlagen

 <?php $nonce = wp_create_nonce( $random_hash."-special-string" ); ?>
 <form>
    <input type="hidden" name="path" value="in/theme/run_this.php" >
    <input type="hidden" name="nonce" value="<?php echo $nonce; ?>" >
    <input type="hidden" name="action_hash" value="<?php echo $random_hash; ?>" >

Lokalisierte Js Essentials

 $.post(custom_settings.my_ajaxurl, data, function(response) {

Ich habe versucht, das Formular anzugreifen (mithilfe von Fiddler2, um die Header und Post-Daten zu ändern), habe jedoch den Verdacht, dass ich unter einer Bestätigungsverzerrung leide.

Ich würde gerne die Community konsultieren, um herauszufinden, ob diese Idee schlecht oder gut ist. (schlechte Ideen verdienen natürlich Kritik)

Fragen:

  1. Wenn ich die Funktion wp_ajax gesichert habe (gemäß den bewährten Methoden von WordPress), ist es in Ordnung, POST Daten zu verwenden, um eine Datei in den WP Admin AJAXaufzunehmen. _ Aktion?
  2. Erleichtere ich es Angreifern, das System zu missbrauchen?
  3. Erzeugt dies eine unnötige Hintertür im System, um zu vermeiden, dass mehrere zusätzliche Funktionen geschrieben werden, z. B .: Ist es faul?

Zum Schluss, wenn das Erstellen jeder Nonce, Enqueue, Form und Aktion als vollständig separate Skripte sicherer ist, erläutern Sie bitte, warum.

Referenz und Forschung:

Wenn Sie nonces richtig verwenden, ist es nicht möglich, die Site dazu zu bringen, gefälschte Anfragen zu verarbeiten ... Dieser Teil sollte also sicher sein, aber ... Ihre Vorgehensweise weist immer noch eine Sicherheitslücke auf ...

Was ist, wenn ich Sie dazu bringen kann, mein JS-Skript in Ihrem Browser auszuführen, während Sie als Administrator angemeldet sind? Es ist möglich.

Auf diese Weise verursacht nonce keinen Überprüfungsfehler und Ihr Code wird ausgeführt, was immer ich will - weil Sie die Eingaben des Benutzers nicht überprüfen ...

Ihre gesamte Sicherheit basiert also auf der Möglichkeit, Ihrer Website JS hinzuzufügen - und das ist ziemlich häufig - werfen Sie einen Blick auf den Malware-Verlauf in WP ...

Viel sicherer wäre es, wenn die Vorlage auf Basis verifizierter Daten geladen würde. Laden Sie es also nicht direkt, sondern erstellen Sie eine Liste korrekter, sicherer Vorlagen und laden Sie sie basierend auf den im POST gesendeten Variablen.

Also zurück zu deinen 3 Fragen:

1. Wenn ich die Funktion wp_ajax gesichert habe (gemäß den Best Practices von WordPress), ist es in Ordnung, POST Daten zu verwenden, um eine Datei in den WP Admin AJAX aufzunehmen. Aktion?

Nein. Es ist niemals in Ordnung, Dateien basierend auf dem vom Benutzer gesendeten Pfad zu laden. Es ist viel sicherer, wenn Sie eine Variable übergeben und diese Variable dann in den Pfad einer Datei in PHP übersetzen.

2. Erleichtere ich es Angreifern, das System zu missbrauchen?

Sie machen es nicht viel einfacher, aber ja - es wird möglich sein, solchen Code anzugreifen.

3. Erzeugt dies eine unnötige Hintertür im System, um zu vermeiden, dass mehrere zusätzliche Funktionen geschrieben werden, z. B .: Ist es faul?

Ja, so ist es. Sie müssen jedoch nicht mehrere Funktionen schreiben. Sie müssen dieses nur richtig sichern und sich daran erinnern - Sie sollten niemals etwas vertrauen, das vom Benutzer kommt.

1