Unverified Account Parameters

Introduction

Welcome to the very first lesson of the A01: Broken Access Control course! In this lesson, we will explore a critical security risk: unverified account parameters in SQL calls.

This vulnerability is a classic example of Broken Access Control because it allows attackers to bypass restrictions and access data they are not authorized to see, such as the private information of other users. By understanding how SQL injection vulnerabilities occur and how to prevent them through proper parameter validation, you'll be better equipped to secure your applications. Let's dive in! 🚀

Note: In this unit, we'll focus specifically on parameter validation and SQL injection prevention. More advanced topics like JWT authentication and role-based access control will be covered in upcoming units of this course.

Understanding SQL And Parameters

Before we delve into vulnerabilities, it's essential to understand the basics of SQL and how parameters are used in database queries. SQL, or Structured Query Language, is the standard language for communicating with databases. To make these communications useful, we often need to include specific pieces of information, which are known as parameters.

Even though SQL injection is usually an A03 issue, here it lets attackers see data they shouldn’t—so it’s a Broken Access Control (A01) problem too.

Think of an SQL query as a sentence with a blank space. A parameter is the word you fill in that blank. For example, consider a query to fetch user information:

SQL
SELECT * FROM users WHERE id = 1;

In this query, 1 is a hardcoded parameter. However, in real-world applications, parameters are often dynamic, meaning they come from user input. For instance, when you log into a website, the application needs to fetch your specific profile, not a hardcoded one. It does this by using your user ID as a dynamic parameter. This flexibility is powerful, but it's also where the risk of SQL injection arises if the parameters are not handled securely.

The Vulnerable Code

Let's examine a code example that demonstrates how unverified parameters can lead to access control issues. A developer, perhaps in a hurry or unaware of the risks, might write code that directly combines a user-provided value into an SQL string.

from sqlalchemy import text

def get_user_info(id, db):
    query = text(f"SELECT * FROM users WHERE id = {id}")
    result = db.execute(query)
    return result.fetchall()

In this example, the id parameter is directly inserted into the SQL query using an f-string without any validation or sanitization. This is dangerous because the application trusts the input completely. It assumes the id will always be a simple number, but an attacker can provide a malicious string that changes the query's logic, leading to a SQL injection vulnerability.

Sign up

Join the 1M+ learners on CodeSignal

Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal