GitXplorerGitXplorer
s

waf4wordpress

public
130 stars
26 forks
7 issues

Commits

List of commits on branch master.
Unverified
ad5f7eed34c62791ca1e317838ef2f5fe758354e

Handle internal REST API requests

sszepeviktor committed 6 months ago
Unverified
5938f721e6cb23562b4f2bdae44ef57c68ea3d00

Add badges to README

sszepeviktor committed a year ago
Unverified
e68a2c716e3f9c3ea8fb66bb87353ae8ae702057

Fix die handlers and CS

sszepeviktor committed 2 years ago
Unverified
cb64788d0c2551f963f54af92ee602c3384ab1a0

Introduce W4WP_ALLOW_ACCEPT_LANGUAGE_EMPTY

sszepeviktor committed 2 years ago
Unverified
4ad4a17070d3a993e98297e7a2ed116e9c721882

Improve MU plugin

sszepeviktor committed 2 years ago
Unverified
177d1268013aacb00135ac63b5c9f0dc1724aeaa

Fix typos

sszepeviktor committed 2 years ago

README

The README file for this repository.

WAF for WordPress

License PHP Version Packagist stats Latest version PHPStan enabled

Stop real-life attacks on your WordPress website and trigger Fail2Ban.

💡 Before using this WAF you have to clean your website, get rid of even tiny errors. See your access and error logs daily and run this WAF without Fail2ban for a week.

This WAF does not give proper HTTP responses to unusual requests. It blocks the attacking IP address instantly, the purpose of this are the following.

  1. Prevent website compromise in further requests
  2. Prevent DoS attacks

Shared hosting has no server-wide banning (because of trust issues) but you can still install this software without Fail2Ban to stop attacks by using one of the Miniban methods.

Support my work

Please consider sponsoring me monthly if you use my packages in an agency.

Sponsor

Theory

Your WordPress - really general HTTP - security consists of the followings.

  1. Use HTTPS
  2. Have daily backups
  3. Block known hostile networks
  4. Have Fail2Ban installed (controls the firewall)
  5. Maintain your website and use strict Fail2Ban filters which ban on the first suspicious request instantly
  6. Deny direct access to core WordPress files, themes and plugins
  7. Install WAF for WordPress (this project)
  8. Use Leanmail for filtering Fail2Ban notification emails

See the Block WordPress attack vectors note in my other repository for an overview of the topic.

Composer installation

Technically this is not a WordPress plugin nor an MU plugin. WAF for WordPress is distributed and autoloaded as a Composer package.

  1. Issue composer require szepeviktor/waf4wordpress command
  2. Load vendor/autoload.php from your wp-config
  3. Instantiate SzepeViktor\WordPress\Waf\HttpAnalyzer class early in wp-config
    require dirname(__DIR__) . '/vendor/autoload.php';
    new SzepeViktor\WordPress\Waf\HttpAnalyzer();
  4. Create an MU plugin in wp-content/mu-plugins/waf4wordpress.php
    <?php
    /*
     * Plugin Name: WAF for WordPress (MU)
     */
    if (! function_exists('add_filter')) {
        exit;
    }
    new SzepeViktor\WordPress\Waf\CoreEvents();

Manual installation

💡 Please see Composer-managed WordPress for managing WordPress with Composer.

Technically this is not a WordPress plugin nor an MU plugin.

  1. First download WAF for WordPress then extract files to a directory, e.g. waf/
  2. Instantiate SzepeViktor\WordPress\Waf\HttpAnalyzer class early in wp-config
    require_once __DIR__ . '/waf/src/HttpAnalyzer.php';
    require_once __DIR__ . '/waf/src/CoreEvents.php';
    new SzepeViktor\WordPress\Waf\HttpAnalyzer();
  3. Create an MU plugin in wp-content/mu-plugins/waf4wordpress.php
    <?php
    /*
     * Plugin Name: WAF for WordPress (MU)
     */
    if (! function_exists('add_filter')) {
        exit;
    }
    new SzepeViktor\WordPress\Waf\CoreEvents();

Configuration

WAF for WordPress is configured in source code before class instantiation. in wp-config.

Create custom filters for Fail2Ban catching these PHP messages.

  • Likely malicious requests: Malicious traffic detected: may be banned after 6 attempts per 10 minutes
  • Surely break-in attempts: Break-in attempt detected: may be banned instantly

How to support PayPal IPN, Braintree and custom entry points in poorly written plugins

Copy this into your in wp-config.php.

// Enable PayPal IPN in WooCommerce
if ( isset( $_SERVER['REQUEST_URI'] ) ) {
    if ( '/wc-api/WC_Gateway_Paypal/' === parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ) ) {
        // PayPal IPN does not send Accept: and User-Agent: headers
        $_SERVER['HTTP_ACCEPT'] = '*/*';
        $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 PayPal/IPN';
    }
}

// Enable Braintree Webhooks
new \Waf4WordPress\Braintree_Fix( '/braintree/webhook' );

// Enable email opens in Newsletter plugin
if ( isset( $_SERVER['REQUEST_URI'] ) ) {
    $newsletter_path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
    if ( '/wp-content/plugins/newsletter/statistics/open.php' === $newsletter_path
        || '/wp-content/plugins/newsletter/statistics/link.php' === $newsletter_path
    ) {
        // UA hack for old email clients
        $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 ' . $_SERVER['HTTP_USER_AGENT'];
    }
    unset( $newsletter_path );
}

// Enable email open tracking in ALO EasyMail Newsletter plugin
if ( isset( $_SERVER['REQUEST_URI'] ) ) {
    $alo_path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
    if ( '/wp-content/plugins/alo-easymail/tr.php' === $alo_path ) {
        // UA hack for old email clients
        $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 ' . $_SERVER['HTTP_USER_AGENT'];
    }
    unset( $alo_path );
}

Bug reports and feature requests

Open a new issue

Where script kiddies look for WordPress

  • /backup/
  • /blog/
  • /cms/
  • /demo/
  • /dev/
  • /home/
  • /main/
  • /new/
  • /old/
  • /portal/
  • /site/
  • /test/
  • /tmp/
  • /web/
  • /wordpress/
  • /wp/

Best not to create these directories to avoid lengthy log excerpts.