is a critical vulnerability in web applications that allows attackers to manipulate database queries through user input. By exploiting inadequate , attackers can bypass security measures and gain unauthorized access to sensitive data.

Understanding SQL injection is crucial for network security professionals. This topic covers the basics, techniques, detection methods, prevention strategies, and real-world case studies, providing a comprehensive overview of this prevalent security threat.

Basics of SQL injection

  • SQL injection is a critical web application vulnerability that allows attackers to manipulate database queries through user input, potentially compromising the confidentiality, integrity, and availability of data
  • Understanding the fundamentals of SQL injection is essential for network security professionals to identify, prevent, and mitigate such attacks effectively
  • SQL injection exploits inadequate input validation and sanitization in web applications, enabling unauthorized access to sensitive data and system functionality

Definition and overview

Top images from around the web for Definition and overview
Top images from around the web for Definition and overview
  • SQL injection is a code injection technique that exploits vulnerabilities in the way web applications construct SQL queries from user-supplied input
  • Attackers craft malicious SQL queries that are executed by the database, bypassing the application's security measures and gaining unauthorized access to data
  • SQL injection attacks can target various relational database management systems (RDBMS) such as MySQL, Oracle, SQL Server, and PostgreSQL

How SQL injection works

  • Web applications often use user input to dynamically construct SQL queries without proper validation or sanitization
  • Attackers manipulate user input by inserting specially crafted SQL syntax, which is then interpreted and executed by the database
  • The injected SQL code can modify the original query logic, allowing attackers to retrieve sensitive data, modify or delete database records, or even execute administrative commands

Types of SQL injection attacks

  • : Attackers use the same communication channel to launch the attack and retrieve results (error messages or actual data)
    • Examples include retrieving sensitive data through union queries or extracting data by triggering error messages containing database information
  • : Attackers send payloads and observe the application's behavior to infer the structure and contents of the database without direct feedback
    • Boolean-based blind SQL injection relies on sending true/false conditions and observing changes in the application's response
    • Time-based blind SQL injection introduces time delays in the database queries to infer information based on response times
  • : Attackers use a different channel to send the SQL injection payload and retrieve the results (DNS or HTTP requests)
    • This technique is useful when the application does not return the results of the SQL query within the same channel

SQL injection techniques

  • vary depending on the attacker's objectives, the application's behavior, and the database management system in use
  • Understanding different SQL injection techniques helps security professionals identify potential attack vectors and implement appropriate defenses

Union-based SQL injection

  • leverages the UNION operator to combine the results of multiple SELECT statements into a single result set
  • Attackers manipulate the original query by appending a malicious SELECT statement, allowing them to retrieve sensitive data from other database tables
  • This technique is effective when the application returns the query results within the HTTP response, enabling attackers to extract data directly

Error-based SQL injection

  • relies on error messages generated by the database to extract sensitive information
  • Attackers deliberately trigger SQL errors by submitting malformed queries or using techniques like type conversion errors or divide-by-zero errors
  • The application's error messages may contain valuable information such as table names, column names, or even database records, assisting attackers in crafting more targeted queries

Blind SQL injection

  • Blind SQL injection is used when the application does not return query results or error messages directly in the HTTP response
  • Attackers rely on inferring the database structure and contents by observing changes in the application's behavior based on the injected SQL conditions
  • Boolean-based blind SQL injection involves sending true/false conditions and observing differences in the application's response (content, status codes, or redirects)
  • Time-based blind SQL injection introduces time delays in the SQL queries and infers information based on the response times (conditional delays using SLEEP or WAITFOR)

Time-based SQL injection

  • is a variant of blind SQL injection that relies on introducing time delays in the database queries to infer information
  • Attackers use SQL functions like SLEEP() or WAITFOR DELAY to pause the execution of the query based on certain conditions
  • By observing differences in response times, attackers can deduce the presence of specific data or the outcome of logical conditions

Out-of-band SQL injection

  • Out-of-band SQL injection involves using a different channel to send the SQL injection payload and retrieve the results
  • Attackers leverage SQL functions like LOAD_FILE() or OUTFILE to write query results to a file accessible via HTTP or to initiate DNS requests containing sensitive data
  • This technique is useful when the application does not return query results within the same channel or when direct data retrieval is not possible

Detecting SQL injection vulnerabilities

  • Detecting SQL injection vulnerabilities is crucial for proactively identifying and addressing potential security risks in web applications
  • A combination of manual testing techniques and automated tools can be employed to uncover SQL injection flaws effectively

Manual testing for SQL injection

  • Manual testing involves manually submitting crafted input to the application and analyzing the responses for signs of SQL injection vulnerabilities
  • Security professionals test input fields, URL parameters, and HTTP headers by injecting special characters, SQL keywords, and malformed queries
  • They observe changes in the application's behavior, error messages, or unexpected output to identify potential injection points
  • Manual testing requires a good understanding of SQL syntax, database management systems, and the application's functionality

Automated SQL injection testing tools

  • Automated tools streamline the process of detecting SQL injection vulnerabilities by performing systematic tests on web applications
  • These tools, such as , SQLninja, or commercial web application scanners, automate the injection of payloads and analyze the application's responses
  • Automated tools can quickly cover a wide range of injection techniques, saving time and effort compared to manual testing
  • However, automated tools may generate false positives or miss certain vulnerabilities, requiring manual verification and validation

Code review for SQL injection flaws

  • Code review is an essential practice for identifying SQL injection vulnerabilities at the source code level
  • Security professionals and developers manually review the application's codebase, focusing on areas that interact with databases and handle user input
  • They look for inadequate input validation, improper use of , or the absence of security best practices like prepared statements or stored procedures
  • Code review helps identify the root cause of SQL injection vulnerabilities and provides insights for remediation and secure coding practices

Preventing SQL injection attacks

  • Preventing SQL injection attacks requires a multi-layered approach that combines secure coding practices, input validation, parameterized queries, and security controls
  • Implementing effective prevention measures helps protect web applications and databases from unauthorized access and data manipulation

Input validation and sanitization

  • Input validation is the first line of defense against SQL injection attacks
  • All user-supplied input should be thoroughly validated and sanitized before being used in SQL queries
  • Validation techniques include:
    • Whitelisting allowed characters and patterns
    • Rejecting or escaping special characters and SQL keywords
    • Enforcing strict data types and lengths
  • Input validation should be performed on the server-side to prevent client-side tampering
  • Proper input sanitization ensures that user input is treated as data and not as executable code

Parameterized queries vs dynamic SQL

  • Parameterized queries, also known as prepared statements, are a secure way to construct SQL queries by separating the query structure from the user input
  • Instead of concatenating user input directly into the query string, parameterized queries use placeholders for the input values
  • The database engine automatically escapes and sanitizes the input values, preventing SQL injection attacks
  • Parameterized queries ensure that user input is treated as data and not as part of the SQL syntax
  • In contrast, dynamic SQL involves constructing queries by concatenating user input directly, which is prone to SQL injection if proper validation and sanitization are not applied

Stored procedures for SQL injection prevention

  • Stored procedures are precompiled database routines that encapsulate complex database operations and business logic
  • By using stored procedures, the application can minimize the exposure of raw SQL queries and limit the attack surface for SQL injection
  • Stored procedures can be designed to accept input parameters and perform necessary validation and sanitization within the database
  • However, stored procedures are not inherently immune to SQL injection and must be carefully implemented and reviewed for security flaws

Least privilege principle in SQL databases

  • The states that users and applications should have only the minimum privileges necessary to perform their intended functions
  • In the context of SQL databases, this means granting users and applications the least privileged database roles and permissions required for their specific tasks
  • Limiting database privileges reduces the potential impact of SQL injection attacks, as compromised accounts have restricted access to sensitive data and operations
  • Implementing granular access controls and regularly reviewing and updating user privileges are essential practices for maintaining the least privilege principle

Web application firewalls (WAFs) for SQL injection

  • Web application firewalls (WAFs) are security tools that monitor and filter HTTP traffic between web applications and clients
  • WAFs can be configured with rules and signatures to detect and block SQL injection attempts in real-time
  • They inspect incoming requests and responses for known SQL injection patterns, malicious characters, or abnormal behavior
  • WAFs provide an additional layer of defense against SQL injection attacks, complementing secure coding practices and input validation
  • However, WAFs are not foolproof and may require regular updates and tuning to effectively detect and prevent evolving SQL injection techniques

SQL injection impact and consequences

  • SQL injection attacks can have severe consequences for organizations, compromising the confidentiality, integrity, and availability of sensitive data and systems
  • Understanding the potential impact and consequences of SQL injection helps prioritize security efforts and raise awareness among stakeholders

Data theft and confidentiality breaches

  • SQL injection attacks often aim to steal sensitive information from databases, such as personal data, financial records, or authentication credentials
  • Attackers can extract large volumes of data by manipulating SQL queries and retrieving unauthorized information
  • Data theft leads to confidentiality breaches, exposing individuals' privacy and potentially leading to identity theft, fraud, or

Unauthorized data manipulation and integrity loss

  • SQL injection vulnerabilities allow attackers to modify or delete database records without proper authorization
  • Malicious modifications can compromise the integrity of the stored data, leading to incorrect business decisions, financial losses, or legal consequences
  • Attackers may alter sensitive information, such as prices, account balances, or user privileges, for personal gain or to disrupt business operations

Potential for complete system compromise

  • In some cases, SQL injection vulnerabilities can be exploited to gain complete control over the underlying database management system and the host operating system
  • Attackers can leverage SQL injection to execute arbitrary commands, escalate privileges, or pivot to other systems on the network
  • A successful SQL injection attack can lead to a complete system compromise, allowing attackers to exfiltrate data, install malware, or launch further attacks
  • SQL injection breaches can severely damage an organization's reputation, eroding customer trust and loyalty
  • Data breaches resulting from SQL injection attacks often attract media attention and public scrutiny, leading to negative publicity and brand damage
  • Organizations may face legal consequences, such as regulatory fines, lawsuits, or penalties, for failing to protect sensitive data and comply with data protection regulations (, HIPAA, )

Real-world SQL injection case studies

  • Studying real-world SQL injection case studies provides valuable insights into the techniques used by attackers, the impact of successful breaches, and the lessons learned for improving security practices

High-profile SQL injection breaches

  • Heartland Payment Systems (2008): Attackers used SQL injection to compromise the payment processing company's network, resulting in the theft of over 100 million credit and debit card numbers
  • Sony Pictures (2011): SQL injection vulnerabilities in Sony's website allowed attackers to gain access to sensitive user information, including passwords, email addresses, and dates of birth
  • TalkTalk (2015): A SQL injection attack on the UK telecommunications company's website led to the theft of personal data belonging to over 150,000 customers
  • Equifax (2017): Attackers exploited a SQL injection vulnerability in the credit reporting agency's web application, resulting in the breach of sensitive personal information of nearly 150 million individuals

Lessons learned from SQL injection incidents

  • Implement comprehensive input validation and sanitization measures to prevent malicious user input from being executed as SQL code
  • Use parameterized queries or prepared statements to separate user input from the SQL query structure and mitigate injection risks
  • Regularly update and patch web applications, frameworks, and database management systems to address known SQL injection vulnerabilities
  • Implement least privilege access controls and limit database permissions to the minimum necessary for each user or application
  • Conduct regular security assessments, penetration testing, and code reviews to identify and remediate SQL injection vulnerabilities proactively
  • Provide security awareness training to developers, emphasizing secure coding practices and the risks associated with SQL injection
  • Implement web application firewalls (WAFs) as an additional layer of defense to detect and block SQL injection attempts in real-time
  • Establish incident response and notification procedures to promptly detect, contain, and communicate SQL injection incidents

SQL injection in penetration testing

  • SQL injection testing is a critical component of web application penetration testing, aiming to identify and assess the severity of SQL injection vulnerabilities
  • Penetration testers simulate real-world SQL injection attacks to evaluate the security posture of web applications and databases

SQL injection in the penetration testing methodology

  • Reconnaissance: Gather information about the target web application, its functionality, and potential entry points for SQL injection attacks
  • Vulnerability scanning: Use automated tools to scan the web application for known SQL injection vulnerabilities and identify potential injection points
  • Manual testing: Perform manual SQL injection tests by submitting crafted input and analyzing the application's responses for signs of injection flaws
  • Exploitation: Attempt to exploit identified SQL injection vulnerabilities to assess their impact and potential for data extraction or system compromise
  • Reporting: Document the findings, including the vulnerability details, impact, and remediation recommendations, in a clear and actionable penetration testing report

Ethical considerations in SQL injection testing

  • Obtain proper authorization and legal consent before conducting SQL injection testing on web applications and databases
  • Adhere to the agreed-upon scope and rules of engagement, limiting testing to authorized systems and minimizing the impact on production environments
  • Handle sensitive data discovered during testing with confidentiality and protect it from unauthorized access or disclosure
  • Provide responsible disclosure of identified vulnerabilities to the application owners, allowing them sufficient time to remediate the issues before public disclosure

Reporting SQL injection findings effectively

  • Clearly document the SQL injection vulnerabilities discovered during testing, including the affected URLs, parameters, or input fields
  • Provide step-by-step reproduction steps to help developers understand and validate the reported issues
  • Assess the severity and impact of each SQL injection vulnerability based on factors such as data sensitivity, potential for exploitation, and business criticality
  • Include remediation recommendations and best practices for fixing the identified SQL injection vulnerabilities
  • Prioritize the findings based on their severity and risk level to help the organization allocate resources effectively for remediation efforts
  • Engage in collaborative discussions with the development team to ensure a clear understanding of the vulnerabilities and the necessary mitigation measures

Advancements in SQL injection defense

  • As SQL injection attacks continue to evolve, researchers and security professionals are exploring innovative approaches and technologies to enhance SQL injection defense mechanisms
  • Staying informed about the latest advancements helps organizations stay ahead of emerging threats and implement effective countermeasures

Machine learning for SQL injection detection

  • Machine learning techniques are being applied to detect and prevent SQL injection attacks more effectively
  • Anomaly detection models can be trained on normal application behavior and SQL query patterns to identify deviations indicative of SQL injection attempts
  • Supervised learning algorithms can be used to classify user input as benign or malicious based on historical data and known SQL injection patterns
  • Machine learning-based approaches can adapt to new SQL injection techniques and reduce false positives compared to traditional rule-based detection methods

Runtime application self-protection (RASP) for SQL injection

  • is an emerging technology that embeds security controls directly into the application runtime environment
  • RASP solutions monitor the application's behavior during runtime and can detect and block SQL injection attempts in real-time
  • By instrumenting the application code, RASP can identify malicious SQL queries and prevent their execution, providing a granular level of protection
  • RASP solutions can also provide valuable insights into attack patterns and help prioritize remediation efforts based on the actual exploitation risk
  • Continuous integration and continuous deployment (CI/CD) pipelines incorporate automated security testing, including SQL injection scanning, to catch vulnerabilities early in the development process
  • Security-as-code practices, where security controls and policies are defined and managed alongside application code, help ensure consistent and auditable security measures
  • Shift-left security approaches emphasize the integration of security testing and best practices throughout the software development lifecycle, reducing the likelihood of SQL injection vulnerabilities
  • Advancements in artificial intelligence and deep learning algorithms can enhance the accuracy and efficiency of SQL injection detection and prevention mechanisms
  • Collaboration between security researchers, database vendors, and web application frameworks leads to the development of more secure and resilient technologies against SQL injection attacks

Key Terms to Review (28)

Automated sql injection testing tools: Automated SQL injection testing tools are software solutions designed to identify vulnerabilities in web applications by simulating SQL injection attacks. These tools can quickly analyze databases and web applications, helping security professionals detect potential weaknesses in SQL queries that attackers might exploit. By automating the testing process, these tools save time and reduce the likelihood of human error, making them essential for maintaining database security.
Blind SQL Injection: Blind SQL injection is a type of SQL injection attack where the attacker is able to send malicious SQL queries to the database but does not receive any error messages or visible output. Instead, the attacker uses true/false questions to infer information about the database structure and data by observing changes in the application's behavior or response times. This technique relies on the application responding differently based on whether the injected query returns true or false, allowing attackers to extract sensitive information without direct feedback.
Code review for sql injection flaws: Code review for SQL injection flaws is a process where developers examine source code to identify and rectify vulnerabilities that could be exploited through SQL injection attacks. This proactive approach helps ensure that user inputs are properly validated and sanitized, reducing the risk of attackers manipulating SQL queries to gain unauthorized access or extract sensitive data from a database. Code reviews play a critical role in maintaining application security by embedding security best practices into the development lifecycle.
Data breach: A data breach is an incident where unauthorized individuals gain access to sensitive, protected, or confidential data, often resulting in the exposure of personal or financial information. Such breaches can occur due to various factors including cyberattacks, malware infections, or human error, highlighting the need for robust security measures and response strategies.
Database compromise: Database compromise refers to an incident where unauthorized individuals gain access to a database, potentially leading to data theft, manipulation, or destruction. This can happen through various means, such as exploiting vulnerabilities in applications or executing malicious code. When a database is compromised, sensitive information such as personal data, financial records, or proprietary business information may be exposed, resulting in significant risks to both individuals and organizations.
Error-based sql injection: Error-based SQL injection is a technique used by attackers to exploit vulnerabilities in a web application's database layer by intentionally causing errors that reveal information about the database structure. By inserting malicious SQL statements into input fields, attackers can trigger errors that return detailed messages, exposing database names, table names, and other sensitive data. This technique helps attackers refine their strategies for further exploitation.
Ethical considerations in sql injection testing: Ethical considerations in SQL injection testing refer to the moral guidelines and responsibilities that govern how security professionals conduct tests for SQL injection vulnerabilities. This involves ensuring that testing is done with permission, awareness, and in a manner that does not harm systems or data integrity. Respecting these ethical boundaries is crucial to maintain trust and security in the field of cybersecurity.
GDPR: The General Data Protection Regulation (GDPR) is a comprehensive data protection law in the European Union that came into effect on May 25, 2018. It aims to enhance individuals' control over their personal data and streamline the regulatory environment for international business by imposing strict rules on data handling and processing.
In-band SQL injection: In-band SQL injection is a type of web application vulnerability that allows an attacker to interfere with the queries that an application makes to its database. This form of SQL injection occurs when the attacker uses the same communication channel to both launch the attack and receive the results. In-band SQL injection is often seen in scenarios where the attacker can manipulate user inputs and directly observe the database's responses, making it a straightforward yet dangerous method for data breaches.
Input Validation: Input validation is the process of ensuring that data provided by a user meets specific criteria before being processed by an application. This is crucial for preventing malicious inputs that can exploit vulnerabilities in software, ensuring data integrity and security throughout the system. By effectively implementing input validation, developers can defend against various attacks that target web applications and protect sensitive data from unauthorized access.
Least Privilege Principle: The least privilege principle is a security concept that asserts individuals and systems should have only the minimum level of access necessary to perform their functions. This approach minimizes potential damage from accidents or malicious actions, ensuring that users and processes have just enough permissions to complete their tasks without exposing sensitive data or critical systems unnecessarily.
Legal implications: Legal implications refer to the potential legal consequences or ramifications that arise from certain actions, behaviors, or events, especially in the context of laws and regulations. Understanding these implications is crucial for individuals and organizations, particularly when dealing with actions that may violate laws or ethical standards, leading to civil or criminal liability.
Machine learning for sql injection detection: Machine learning for SQL injection detection refers to the application of machine learning algorithms to identify and prevent SQL injection attacks on databases. This approach involves training models on data that captures both legitimate and malicious SQL queries, enabling the system to recognize patterns associated with SQL injection attempts. By leveraging machine learning, security systems can enhance their ability to detect new and evolving threats more effectively than traditional methods.
Manual testing for sql injection: Manual testing for SQL injection involves the process of identifying and exploiting vulnerabilities in a web application's database layer by manually inserting malicious SQL code into input fields. This method allows security testers to verify the application's resilience against SQL injection attacks without relying on automated tools. By manually crafting input data, testers can explore various attack vectors and understand the application's behavior under different conditions.
Out-of-band SQL injection: Out-of-band SQL injection is a type of SQL injection attack where the attacker is unable to use the same channel to launch the attack and gather results, relying instead on a different channel to receive the output. This method is often used when the attacker cannot extract data directly from the application's response and must rely on alternate methods, like sending data to an external server they control. It often indicates that the application is well-protected against traditional methods, prompting attackers to be more creative in their exploitation techniques.
OWASP: OWASP stands for the Open Web Application Security Project, a nonprofit organization dedicated to improving software security. It provides guidelines, tools, and resources for organizations and developers to understand and mitigate security risks in web applications. By highlighting common vulnerabilities and offering best practices, OWASP plays a crucial role in promoting secure coding practices and awareness of threats like SQL injection, cross-site request forgery, scanning techniques, and the IoT threat landscape.
Parameterized queries: Parameterized queries are a type of SQL statement that allow developers to execute commands while providing input parameters separately, which helps prevent SQL injection attacks. This approach enhances security by ensuring that user input is treated as data rather than executable code, making it difficult for attackers to manipulate the SQL queries. By using placeholders for parameters, these queries promote better database performance and cleaner code management.
PCI DSS: PCI DSS, or Payment Card Industry Data Security Standard, is a set of security standards designed to ensure that all companies that accept, process, store, or transmit credit card information maintain a secure environment. This standard aims to protect cardholder data and reduce the risk of credit card fraud, making it crucial for businesses handling payment information.
Reporting sql injection findings effectively: Reporting SQL injection findings effectively involves documenting vulnerabilities, their potential impacts, and recommendations for remediation in a clear and concise manner. This process ensures that stakeholders understand the seriousness of SQL injection vulnerabilities and can take appropriate action to mitigate risks. An effective report not only highlights technical details but also contextualizes the findings within the broader security landscape.
Reputational Damage: Reputational damage refers to the harm caused to an organization’s credibility and public perception, often resulting from negative events or actions. It can significantly affect customer trust, stakeholder relationships, and overall business performance. In the context of security incidents like SQL injection attacks, reputational damage can arise when sensitive information is compromised, leading to loss of confidence among users and clients.
Runtime Application Self-Protection (RASP): Runtime Application Self-Protection (RASP) is a security technology that integrates directly into an application and is able to detect and prevent real-time attacks from within the app itself. It operates by monitoring the application’s behavior and environment, enabling it to react immediately to any threats like SQL injection attempts, ensuring that vulnerabilities are mitigated while the application is running. This proactive approach enhances security, particularly for applications exposed to untrusted networks.
SQL injection: SQL injection is a web security vulnerability that allows an attacker to interfere with the queries that an application makes to its database. By manipulating input data, attackers can gain unauthorized access to sensitive data, modify or delete records, and even execute administrative operations on the database. This type of attack highlights the importance of secure coding practices and robust input validation to protect applications from malicious actors.
Sql injection techniques: SQL injection techniques are methods used by attackers to exploit vulnerabilities in an application's software by inserting or 'injecting' malicious SQL code into a query. This manipulation allows unauthorized access to sensitive data, such as user credentials and personal information, and can also enable attackers to alter or delete records. Understanding these techniques is crucial for defending against such attacks and maintaining the security of database-driven applications.
Sqlmap: sqlmap is an open-source penetration testing tool designed to automate the process of detecting and exploiting SQL injection vulnerabilities in web applications. By leveraging a variety of techniques, sqlmap can identify weaknesses in database systems and extract sensitive data, making it a vital resource for security professionals and ethical hackers to secure web applications against SQL injection attacks.
Stored procedures for sql injection prevention: Stored procedures are precompiled SQL statements that can help prevent SQL injection attacks by separating user inputs from the SQL code. They are designed to execute a series of SQL commands in a controlled manner, ensuring that input is treated as data and not executable code. This makes it significantly more difficult for attackers to manipulate queries and inject harmful SQL commands.
Time-based SQL Injection: Time-based SQL injection is a type of SQL injection attack that relies on the database's response time to infer information about the structure or data of a database. In this method, the attacker manipulates SQL queries to cause the database to wait for a specified duration before responding, allowing them to determine if the injected condition is true or false based on whether the response is delayed. This technique is particularly useful when an application does not return specific error messages that could otherwise provide clues about the database schema.
Union-based sql injection: Union-based SQL injection is a type of attack that allows an attacker to combine the results of two or more SELECT statements using the UNION SQL operator. This technique exploits vulnerabilities in a web application's database queries, enabling the attacker to retrieve data from other tables within the database that they shouldn't have access to. By manipulating input fields, an attacker can extract sensitive information like user credentials, which highlights significant security risks in poorly secured applications.
Web application firewall: A web application firewall (WAF) is a security device or software solution that monitors, filters, and blocks HTTP traffic to and from a web application to protect it from various attacks. It serves as a shield for web applications by inspecting incoming and outgoing traffic, detecting anomalies, and applying predefined rules to prevent exploits. This is crucial in defending against vulnerabilities such as SQL injection and cross-site request forgery, which can compromise the integrity of web applications.
© 2024 Fiveable Inc. All rights reserved.
AP® and SAT® are trademarks registered by the College Board, which is not affiliated with, and does not endorse this website.