Simple fuzzer for OpenAPI 3 specification based APIs
What does this fuzzer do?
- Sends various attack patterns to all the paths defined in an OpenAPI 3 definition file, using the OAS3 definition to create populate requests.
- Verifies if the responses matches those defined in the OAS3 definition file, complains and exit(2) if it doesn't.
- Complains loudly and exit(1) if a path returns an internal server error (status code 500 and higher)
Why does this OpenAPI fuzzer exist?
To make it easy to integrate an OpenAPI 3 fuzzer in an existing API.
How do I use this?
- Install the fuzzer using its pip package
- Add at least the following packages to requirements-test.txt:
coverage==5.0.3
openapi3-fuzzer
adal==1.2.2
Flask-Testing==0.7.1
- Generate OpenAPI (https://github.com/OpenAPITools/openapi-generator)
- Create a test_fuzzing file in the test location using the template below:
import adal
import config
from openapi3_fuzzer import FuzzIt
from openapi_server.test import BaseTestCase
def get_token():
"""
Create a token for testing
:return:
"""
oauth_expected_authenticator = authenticatoruri
client_id = appid
client_secret = secret
resource = resource/audience
# get an Azure access token using the adal library
context = adal.AuthenticationContext(oauth_expected_authenticator)
token_response = context.acquire_token_with_client_credentials(
resource, client_id, client_secret)
access_token = token_response.get('accessToken')
return access_token
class TestvAPI(BaseTestCase):
def test_fuzzing(self):
FuzzIt("openapi.yaml", get_token(), self)
- Run using our unittest container or via the Python Unittest Framework
What OAS3 items are supported?
Based on OpenAPI specification 3.0.2:
| Operation | Supported |
|---|---|
| GET | Yes |
| POST | Yes |
| PUT | Yes |
| DELETE | Yes |
| HEAD | Yes |
| OPTIONS | no |
| PATCH | no |
| TRACE | no |
| Parameter in | Supported |
|---|---|
| path | Yes |
| query | no |
| header | no |
| cookie | no |
| Property types | Supported |
|---|---|
| string | Yes |
| integer | Yes |
| number | Yes |
| array | Yes |
| none | Yes |
| boolean | no |
Example output
Internal server error:
GET fuzzing /managers/expenses/{expenses_id}/attachments
* INTERNAL SERVER ERROR
Endpoint returned 500 but expected one of [200]
GET https://dev.myapi.example/managers/expenses/99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999/attachments
Response doesn't conform to the OAS3 spec:
--------------------------------------------
GET fuzzing /employees/expenses/{expenses_id}
- Unexpected status code
Endpoint returned 404 but expected one of [200, 'default']
GET https://dev.myapi.example/employees/expenses/)$#***^
POST fuzzing /employees/expenses/{expenses_id}
- Unexpected status code
Endpoint returned 400 but expected one of [201, 'default']
POST https://dev.myapi.example/employees/expenses
{
"amount": "123",
"cost_type": "123",
"note": ";sleep 10",
"transaction_date": "123"
}
Contributors
A special thanks to the contributors outside of VWT Digital.
| Name | Contribution |
|---|---|
| Jorrit Folmer | Started the project and created a base for the fuzzer. |
LICENSE
GPL3
Metadata
Release files for openapi3-fuzzer 1.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openapi3-fuzzer-1.3.0.tar.gz | 9.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openapi3_fuzzer-1.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.4 kB
Release files / openapi3-fuzzer-1.3.0.tar.gz
| Download URL | openapi3-fuzzer-1.3.0.tar.gz |
|---|---|
| Size | 9.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
897950d4e03ce314d4ff09c890df299c4fc867415c83f88cea335bf4ea3d6c78
|
|
BLAKE2b-256 checksum How to use checksums |
899741da26f738edc66d65c1242afccef1a6dc98f3c8c940e4fc0be63387a26b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.15.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.52.0 CPython/3.5.2
|
Release files / openapi3_fuzzer-1.3.0-py3-none-any.whl
| Download URL | openapi3_fuzzer-1.3.0-py3-none-any.whl |
|---|---|
| Size | 21.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7c694a1eb8474173b7ce175bc2366335885a47d98654be2b4cca907e3d25e06a
|
|
BLAKE2b-256 checksum How to use checksums |
608035dbbea62056983894504939da58e9a435275e5de6e993f2881a8669601f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.15.0 pkginfo/1.6.1 requests/2.25.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.52.0 CPython/3.5.2
|