Skip to main content

[web] Drobots

This challenge exposes a login page with a form as a home page.

The login form is calling an endpoint /api/login, with 2 parameters username and password. We do have access to the source code, which is a python Flask.

The route /api/login is reaching the following code:

@api.route('/login', methods=['POST'])
def apiLogin():
    if not request.is_json:
        return response('Invalid JSON!'), 400
    
    data = request.get_json()
    username = data.get('username', '')
    password = data.get('password', '')
    
    if not username or not password:
        return response('All fields are required!'), 401
    
    user = login(username, password)
    
    if user:
        session['auth'] = user
        return response('Success'), 200
        
    return response('Invalid credentials!'), 403

Let’s explore the login function by itself:

def login(username, password):
    # We should update our code base and use techniques like parameterization to avoid SQL Injection
    user = query_db(f'SELECT password FROM users WHERE username = "{username}" AND password = "{password}" ', one=True)

    if user:
        token = createJWT(username)
        return token
    else:
        return False

We see here that the paremters are passed as is in the SQL query, which leads to potential SQL injection, database used is mysql.

We can then craft a username to bypass the password check. By sending the username admin" # and any value for password.

flag