Zurück

WordPress Plugin Finder

12.08.2013 15:22 von Samuel

Die meisten Lücken in den aktuellen CMS wie WordPress, Joomla, Typo 3 usw. sind in den Plugins. Jeder kann eigene Plugins programmieren und somit auch neue Türchen für Angreifer öffnen.

Ich habe eine kleine PHP Klasse programmiert, mit der man Plugins aus einer mit WordPress generierte Seite auslesen kann. Dannach sucht das Script das vorhandene Plugin auf der offiziellen WordPress Seite (wordpress.org) und gibt die Beschreibung des Plugins aus.

 

Klasse:

<?php

  class WPPlugins {
    private $src = '';

	//Constructor
	public function __construct($site) {
	  if($this->isValidURL($site)) {
	    if($this->isWP()) {
		  echo '<p>Wordpress gefunden ('.$site.'), suche nach Plugins..</p>';

		  $wp_plugins = $this->getPlugins();

		  if(!empty($wp_plugins)) {
		    echo '<pre>';
			print_r($wp_plugins);
			echo '<br />';
			print_r($this->getDescription($wp_plugins));
			echo '</pre>';
		  } else {
		    echo 'Keine Plugins gefunden';
		  }
		} else {
		  echo 'Keine WordPress Installation gefunden';
		}
	  } else {
	    echo 'Seite gibt keine g&uuml;ltige Antwort zur&uuml;ck (200)';
	  }
	}

   /**
	* Plugins aus WP Seite auslesen
	*
	* @return array
	*/

	private function getPlugins() {
	  preg_match_all('#/plugins/([a-z0-9_-]*?){1,30}/#is', $this->src, $matches);

	  return array_unique($matches[1]);
	}

   /**
	* Plugin Beschreibung von WP auslesen
	*
	* @param array $plugins
	* @return array
	*/

	private function getDescription($plugins) {
	  $descriptions = array();

	  foreach($plugins as $plugin) {
		preg_match('#<p itemprop="description" class="shortdesc">(.*?)<\/p>#s',
				    @file_get_contents('http://wordpress.org/plugins/'.$plugin), $matches);

		!empty($matches[1]) ? array_push($descriptions, $matches[1]) : array_push($descriptions, 'Nicht gefunden');
	  }

	  return $descriptions;
	}

   /**
	* Überprüfen ob die Seite mit WP erstellt wurde
	*
	* @return boolean
	*/

	private function isWP() {
	  return @strpos($this->src, 'wp-content/themes') ? true : false;
	}

   /**
	* Überprüfen ob die Seite einen gültigen Antwort-Header zurückgibt (200)
	*
	* @param string $url
	* @return boolean
	*/

	private function isValidURL($url) {
	  if(!empty($url)) {
	    $this->src = @file_get_contents($url);

	    return @strpos($http_response_header[0], '200') ? true : false; 
	  } else {
	    return false;
	  }
	}
  }

 

Die Klasse kann so benutzt werden:

<?php
  set_time_limit(0);

  if(isset($_GET['site'])) {
    $site = htmlentities($_GET['site']);
    $site = substr($site, 0, 7) !== 'http://' ? 'http://'.$site : $site;

    if(preg_match('/^(http|https):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i', $site)) {
      require_once('wpparser.class.php');
      $Object = new WPPlugins($site);
    } else {
      echo 'Invalid URL';
    }
  } else {
    echo 'Usage: '.basename($_SERVER['SCRIPT_NAME']).'.php?site=mysite.ch';
  }

Eine Ausgabe sieht das z.B. so aus.

Zurück

Einen Kommentar schreiben