Web API Pentesting

Basic Information




These kind of APIs may be vulnerable to XXE, but usually DTD Declarations are disallowed in the input from the user.

You could also try to use CDATA tags to insert payloads (as long as the XML is valid)

Check Access

Usually some API endpoints are gong to need more privileges that others. Always try to access the more privileged endpoints from less privileged (unauthorized) accounts to see if it's possible.


Always check the CORS configuration of the API, as if its allowing to end request with the credentials from the attacker domain, a lot of damage can be done via CSRF from authenticated victims.


Search for API patterns inside the api and try to use it to discover more. If you find /api/albums/<album_id>/photos/<photo_id> **you could try also things like _/api/posts/<post_id>/comment**/_. Use some fuzzer to discover this new endpoints.

Add parameters

Something like the following example might get you access to another user’s photo album: /api/MyPictureList → /api/MyPictureList?user_id=<other_user_id>

Replace parameters

You can try to fuzz parameters or use parameters you have seen in a different endpoints to try to access other information

For example, if you see something like: /api/albums?album_id=<album id>

You could replace the album_id parameter with something completely different and potentially get other data: /api/albums?account_id=<account id>

Parameter pollution

/api/account?id=<your account id> → /api/account?id=<your account id>&id=<admin's account id>

Wildcard parameter

Try to use the following symbols as wildcards: *, %, _, .

  • /api/users/*

  • /api/users/%

  • /api/users/_

  • /api/users/.

HTTP request method change

You can try to use the HTTP methods: GET, POST, PUT, DELETE, PATCH, INVENTED to try check if the web server gives you unexpected information with them.

Request content-type

Try to play between the following content-types (bodifying acordinly the request body) to make the web server behave unexpectedly:

  • x-www-form-urlencoded --> user=test

  • application/xml --> <user>test</user>

  • application/json --> {"user": "test"}

Parameters types

If JSON data is working try so send unexpected data types like:

  • {"username": "John"}

  • {"username": true}

  • {"username": null}

  • {"username": 1}

  • {"username": [true]}

  • {"username": ["John", true]}

  • {"username": {"$neq": "lalala"}}

  • any other combination you may imagine

If you can send XML data, check for XXE injections.

If you send regular POST data, try to send arrays and dictionaries:

  • username[]=John

  • username[$neq]=lalala

Play with routes

/files/..%2f..%2f + victim ID + %2f + victim filename

Check possible versions

Old versions may be still be in use and be more vulnerable than latest endpoints

  • /api/v1/login

  • /api/v2/login

  • /api/CharityEventFeb2020/user/pp/<ID>

  • /api/CharityEventFeb2021/user/pp/<ID>

Owasp API Security Top 10

Read this document to learn how to search and exploit Owasp Top 10 API vulnerabilities: https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf

API Security Checklist

List of possible API endpoints



Last updated