vAPI illustrates some common API vulnerabilities
- Install Docker
- Run
docker build -t vapi .
- Run
docker run -itd -p 8081:8081 --name vapi vapi:latest
- API will be accessible at
localhost:8081
- Request token from
/tokens
- Returns an auth token
- Returns expiration date of auth token
- Returns a user id
- Request user record from
/user/<user_id>
- Requires the auth token
- Returns the user record for the user specfied, provided the auth token is not expired and is valid for the user id specified
- Each user can only access their own record
Included by default
Username | Password |
---|---|
user{1-9} | pass{1-9} |
admin1 | pass1 |
Request an auth token for a user
- Accept: application/json
- Content-Type: application/json or application/xml
- username (string) - Name of user requesting token
- password (string) - Password of user requesting a token
- token
- expires (string) - The Auth Token expiration date/time
- token - id (string) - Auth Token
- user - id (string) - Unique user ID
- name (string) - Username
- 200 OK - Request completed successfully
POST /tokens HTTP/1.1
Accept: application/json
Content-Length: 36
Content-Type: application/json
Host: 192.168.13.37:8081
{
"auth": {
"passwordCredentials": {
"username": "USER_NAME",
"password":"PASSWORD"
}
}
}
or
POST /tokens HTTP/1.1
Accept: */*
Content-Length: 170
Content-Type: application/xml
Host: 192.168.13.37:8081
<?xml version="1.0" encoding="UTF-8"?>
<auth>
<passwordCredentials>
<username>user1</username>
<password>pass1</password>
</passwordCredentials>
</auth>
HTTP/1.0 200 OK
Date: Tue, 07 Jul 2015 15:34:01 GMT
Server: WSGIServer/0.1 Python/2.7.6
Content-Type: text/html; charset=UTF-8
{
"access": {
"token": {
"expires": "Tue Jul 7 15:39:01 2015",
"id": "AUTH_TOKEN"
},
"user": {
"id": 10,
"name": "USER_NAME"
}
}
}
Retrieve the user's entry in the user database
- Accept: application/json
- Content-Type: application/json
- X-Auth-Token: <TOKEN_ID> (from /tokens POST)
- None
- User
- id (string) - Unique user ID
- name (string) - Username
- password (string) - Password
- 200 OK - Request completed successfully
GET /user/1 HTTP/1.1
Host: 192.168.13.37:8081
X-Auth-Token: AUTH_TOKEN
Content-type: application/json
Accept: text/plain
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 0
HTTP/1.0 200 OK
Date: Mon, 06 Jul 2015 22:08:56 GMT
Server: WSGIServer/0.1 Python/2.7.9
Content-Length: 73
Content-Type: application/json
{
"response": {
"user": {
"password": "PASSWORD",
"id": USER_ID,
"name": "USER_NAME"
}
}
}
Creates an user with the given username and password.
Conditions:
- User cannot already exist
- Username should match the regex:
([a-z]+)*[0-9]
. This means that a username has to start with a lowercase letter and end with numbers. So, usernames that look like "user1" or "abc123" will be accepted, but usernames that look like "USER1" or "1user" will not be accepted.
- X-Auth-Token - Valid token for the admin user
- User
- name (string) - Username that matches above conditions
- password (string) - Password
- response
- user
- username - the name of the succesfully created user
- password - the password of the successfully created user
- user
- 200 OK - Request completed successfullyi
POST /user HTTP/1.1
User-Agent: curl/7.35.0
Host: 127.0.0.1:8081
Accept: */*
x-auth-token: ADMIN TOKEN
Content-type: application/json
Content-Length: 54
{
"user": {
"username": "USERNAME",
"password": "PASSWORD"
}
}
HTTP/1.0 200 OK
Date: Mon, 06 Jul 2015 22:08:56 GMT
Server: WSGIServer/0.1 Python/2.7.9
Content-Length: 68
Content-Type: application/json
{
"response": {
"user": {
"password": "PASSWORD",
"name": "USER_NAME"
}
}
}
Returns the server uptime, and now supports pretty formatting just by passing in command line flags.
- None
- Response
- Command (string) - The system call you made
- Output (string) - uptime
- 200 OK - Request completed successfully
GET /uptime/s HTTP/1.1
Host: 192.168.13.37:8081
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 0
HTTP/1.0 200 OK
Date: Wed, 17 Feb 2016 22:44:27 GMT
Server: WSGIServer/0.1 Python/2.7.6
Content-Length: 90
Content-Type: text/html; charset=UTF-8
{
"response": {
"Command": "uptime -s",
"Output": "2016-02-17 09:42:44\n"
}
}
- Transport layer security
- User enumeration
- Information exposure through server headers
- Authentication bypass
- User input validation
- SQL injection
- Error handling
- Session management
- Encryption
- Auth bypass
- Command injection
- Regex DDoS