OWASP Top 10 awareness in Testing Fundamentals - Build an Automation Script
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import unittest import requests class TestOWASPTop10(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.wait = WebDriverWait(self.driver, 10) self.base_url = "https://example.com" # Replace with actual URL def test_sql_injection(self): self.driver.get(f"{self.base_url}/login") username = self.wait.until(EC.presence_of_element_located((By.ID, "username"))) password = self.driver.find_element(By.ID, "password") login_button = self.driver.find_element(By.ID, "loginBtn") # Attempt SQL injection payload username.clear() username.send_keys("' OR '1'='1") password.clear() password.send_keys("password") login_button.click() # Verify login failed or input sanitized error_msg = self.wait.until(EC.presence_of_element_located((By.ID, "errorMessage"))) self.assertIn("Invalid", error_msg.text, "SQL Injection should not succeed") def test_xss(self): self.driver.get(f"{self.base_url}/comment") comment_box = self.wait.until(EC.presence_of_element_located((By.ID, "commentBox"))) submit_btn = self.driver.find_element(By.ID, "submitComment") # Attempt XSS payload xss_payload = "<script>alert('XSS')</script>" comment_box.clear() comment_box.send_keys(xss_payload) submit_btn.click() # Verify alert does not appear and input is sanitized page_source = self.driver.page_source self.assertNotIn(xss_payload, page_source, "XSS payload should be sanitized") def test_https_used(self): self.driver.get(self.base_url) current_url = self.driver.current_url self.assertTrue(current_url.startswith("https://"), "Site should use HTTPS") def test_unauthorized_access(self): self.driver.get(f"{self.base_url}/admin") # Should redirect to login or show access denied self.assertTrue( "login" in self.driver.current_url or "access denied" in self.driver.page_source.lower(), "Unauthorized access should be blocked" ) def test_security_headers(self): response = requests.get(self.base_url) headers = response.headers self.assertIn("Content-Security-Policy", headers, "CSP header should be present") self.assertIn("X-Frame-Options", headers, "X-Frame-Options header should be present") def test_sensitive_data_not_exposed(self): self.driver.get(f"{self.base_url}/error") page_source = self.driver.page_source.lower() self.assertNotIn("password", page_source, "Passwords should not be visible in error messages") def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
This test script uses Selenium with Python's unittest framework to automate checks for OWASP Top 10 security risks.
setUp: Initializes the browser and sets the base URL.
test_sql_injection: Tries a common SQL injection string in the login username field and asserts that login fails with an error message.
test_xss: Inputs a script tag in a comment box and verifies the script does not appear in the page source, meaning it is sanitized.
test_https_used: Checks that the site URL starts with https:// to ensure secure communication.
test_unauthorized_access: Attempts to access a restricted admin page without login and verifies redirection or access denial.
test_security_headers: Uses requests library to check HTTP response headers for security headers like Content-Security-Policy and X-Frame-Options.
test_sensitive_data_not_exposed: Checks error pages do not show sensitive data like passwords.
tearDown: Closes the browser after tests.
Explicit waits ensure elements are loaded before interaction. Assertions clearly check expected security behavior. This structure follows best practices for maintainable and reliable tests.
Now add data-driven testing with 3 different SQL injection payloads and 3 different XSS payloads to verify robustness.
Practice
Solution
Step 1: Understand OWASP Top 10's focus
OWASP Top 10 is a list of the most common security risks in web apps.Step 2: Match purpose with options
Only To highlight the most common security risks in web applications correctly states it highlights common security risks.Final Answer:
To highlight the most common security risks in web applications -> Option BQuick Check:
OWASP Top 10 = Common security risks [OK]
- Confusing OWASP with UI or browser topics
- Thinking it lists programming languages
- Assuming it ranks performance
Solution
Step 1: Identify OWASP Top 10 risks
OWASP Top 10 includes risks like Cross-Site Scripting (XSS), SQL Injection, etc.Step 2: Compare options to known risks
Only Cross-Site Scripting (XSS) is a recognized OWASP Top 10 risk; others are unrelated to security risks.Final Answer:
Cross-Site Scripting (XSS) -> Option AQuick Check:
XSS is a common OWASP risk [OK]
- Choosing UI or performance issues as security risks
- Confusing accessibility issues with security risks
- Not recognizing common OWASP terms
if (userInput.includes('<script>')) {
rejectInput();
} else {
acceptInput();
}Which OWASP risk is this code trying to prevent?
Solution
Step 1: Analyze code purpose
The code checks if user input contains '<script>' tags and rejects it.Step 2: Link to OWASP risks
Rejecting script tags prevents Cross-Site Scripting (XSS), where attackers inject scripts.Final Answer:
Cross-Site Scripting (XSS) -> Option CQuick Check:
Blocking scripts = Prevent XSS [OK]
- Confusing input validation with authentication issues
- Ignoring script injection as a security risk
- Choosing unrelated OWASP risks
Solution
Step 1: Identify the risk from file upload issue
Allowing uploads without validation is Unrestricted File Upload risk.Step 2: Determine best fix
Validating file types before upload prevents malicious files from being accepted.Final Answer:
Unrestricted File Upload; validate file types before upload -> Option DQuick Check:
File upload risk = Validate file types [OK]
- Confusing file upload with access control
- Suggesting encryption instead of validation
- Mixing unrelated OWASP risks
Solution
Step 1: Identify risks from password storage and login attempts
Storing passwords in plain text is Sensitive Data Exposure; no login limits is Broken Authentication.Step 2: Determine testing approach
Test password storage security and brute force attack protections to cover both risks.Final Answer:
Sensitive Data Exposure and Broken Authentication; test password storage and brute force protection -> Option AQuick Check:
Plain text + no limits = Sensitive Data + Broken Auth [OK]
- Mixing unrelated OWASP risks
- Ignoring combined risks in one scenario
- Confusing testing focus areas
Ready to prove it?
Pass the test and this pattern moves unknown
