Welcome to Raider's documentation!
==================================

.. note::
   This documentation and the entire Raider framework is still work in
   progress. Many things are not finished, stuff is missing, other stuff
   is not working as expected, and so on...  Meanwhile, `read the source
   code <https://github.com/OWASP/raider>`_ to understand better how
   Raider works, `open Github issues
   <https://github.com/OWASP/raider/issues>`_ if you find some
   mistakes, or come `talk to us in the community forum
   <https://community.raiderauth.com/>`_.


.. image:: ../ext/logo.png

**Raider** is a framework designed to test :term:`authentication` for
web applications. While web proxies like `ZAProxy
<https://www.zaproxy.org/>`_ and `Burpsuite
<https://portswigger.net/burp>`_ allow authenticated tests, they don't
provide features to test the authentication process itself,
i.e. manipulating the relevant input fields to identify broken
authentication. Most authentication bugs in the wild have been found
by manually testing it or writing custom scripts that replicate the
behaviour. **Raider** aims to make testing easier, by providing the
interface to interact with all important elements found in modern
authentication systems.


How does Raider work?
---------------------

**Raider** treats the authentication as a :term:`finite state
machine`. Each authentication step is a different :term:`stage`, with
its own inputs and outputs. Those can be cookies, headers, CSRF
tokens, or other pieces of information.

Each application needs its own configuration directory for **Raider**
to work. The configuration is written in `Hylang
<https://docs.hylang.org/>`_. The language choice was done for
multiple reasons, mainly because it's a Lisp dialect embedded in
Python.

:ref:`Using Lisp was necessarily <why_lisp>` since sometimes the
authentication can get quite complex, and using a static configuration
file would've not been enough to cover all the details. Lisp makes it
easy to combine code and data, which is exactly what was needed here.

By using a real programming language as a configuration file gives
**Raider** a lot of power, and :ref:`with great power comes great
responsibility <faq_eval>`. Theoretically one can write entire malware inside the
application configuration file, which means you should be careful
what's being executed, and **not to use configuration files from
sources you don't trust**. **Raider** will evaluate everything inside
the ``.hy`` files, which means if you're not careful you could shoot
yourself in the foot and break something on your system.


Features
--------

**Raider** has the goal to support most of the modern authentication
systems, and here are some features that other tools don't offer:

* Unlimited authentication steps
* Unlimited inputs/outputs for each step
* Ability to conditionally decide the next step
* Running arbitrary operations when receiving the response
* Easy to write custom operations and plugins


Raider's philosophy
-------------------

**Raider** was developed with the following goals:

* To abstract authentication concepts using Python objects.
* To support most modern web authentication features.
* To make it easy to add new features for users.
  

And if you're looking at the code and willing to contribute, keep
those in mind:

* The simpler and cleaner the code, the better.
* New features should be implemented as :term:`Plugins <plugin>` and
  :term:`Operations <operation>` if possible.
* The :term:`hyfiles` should stay as minimal as possible, while still
  allowing the user to get creative. In the future parts of this code
  could be autogenerated.


User guide
----------

.. toctree::
   :maxdepth: 2
   :caption: Getting started

   user/install
   user/architecture
   user/tutorials
   user/definitions
   user/faq


.. toctree::
   :maxdepth: 2
   :caption: Configuration

   dev/special_variables
   dev/flows
   dev/attacks
   dev/plugins
   dev/operations


.. toctree::
   :maxdepth: 2
   :caption: API reference

   dev/api


Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
