1. SQL注入基础与Less-20关卡概述
SQL注入(SQL Injection)作为Web安全领域的经典漏洞类型,至今仍是OWASP Top 10的重要成员。在sqli-labs这个专为SQL注入练习设计的靶场中,Less-20作为Cookie注入的典型场景,展示了与传统GET/POST注入不同的攻击路径。本关需要利用Cookie中的漏洞实现数据库信息提取,这对理解HTTP全协议栈的安全风险具有重要意义。
Cookie本质上是服务端存储在客户端的小型数据片段,每次请求时会自动附带。当后端程序未对Cookie参数进行充分过滤就直接拼接SQL语句时,就会产生注入点。与常规注入相比,Cookie注入往往更隐蔽,因为普通用户不会直接修改Cookie值,这也使得这类漏洞容易被开发者忽视。
2. Less-20关卡环境分析
2.1 目标系统行为观察
访问Less-20页面时,首先注意到登录成功后系统设置了如下Cookie:
code复制uname=admin
通过Burp Suite拦截请求可见,后续页面刷新时都会携带这个Cookie。关键点在于:当手动修改Cookie中的uname值为admin'时,页面返回数据库错误信息,这明确暴露出SQL注入漏洞。
2.2 注入点确认技术
使用经典的探测payload验证注入类型:
code复制admin' and '1'='1 # 正常显示
admin' and '1'='2 # 无内容返回
这种布尔型响应差异说明存在基于Cookie的盲注漏洞。进一步测试显示,系统过滤了空格和注释符,但允许使用括号和加号作为替代分隔符。
3. 手工注入技术实现
3.1 信息收集技术
获取数据库版本的标准语句需要改造为:
code复制admin'+(select@a:=concat(version(),0x3a,database(),0x3a,user()))+and+'1'='1
这里使用@变量存储查询结果,避免直接输出。通过时间盲注技术逐字节提取数据:
code复制admin'+(select+if(ascii(substr(@a,1,1))=53,sleep(3),1))+and+'1'='1
当字符匹配时会产生3秒延迟,据此可推断出完整信息。
3.2 自动化注入实现
虽然可以手工注入,但推荐使用sqlmap提高效率。保存请求为txt文件后执行:
bash复制sqlmap -r request.txt --level 3 --risk 3 --cookie="uname=*" --technique=T
关键参数说明:
--level 3:检查Cookie头--risk 3:允许使用OR-based注入--technique=T:指定时间盲注技术
4. 防御方案与最佳实践
4.1 安全编码建议
- 参数化查询:所有数据库操作必须使用预处理语句
php复制$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $_COOKIE['uname']);
- Cookie安全设置:
php复制setcookie("uname", $value, [
'httponly' => true,
'samesite' => 'Strict',
'secure' => true
]);
- 输入验证:
php复制if(!preg_match('/^[a-zA-Z0-9]{4,20}$/', $_COOKIE['uname'])){
die("Invalid username format");
}
4.2 WAF规则示例
对于Nginx环境,可添加如下规则拦截Cookie注入:
code复制set $block 0;
if ($http_cookie ~* "union.*select") { set $block 1; }
if ($http_cookie ~* "(;|'|\"|--|/\*|\*/)") { set $block 1; }
if ($block = 1) { return 403; }
5. 深入技术探讨
5.1 二次注入场景
即使对Cookie值进行了转义,如果程序后续又将数据取出用于新的SQL查询,仍可能产生二次注入。防御方案包括:
- 始终将用户输入视为不可信数据
- 实现统一的数据库访问层
- 采用ORM框架替代原生SQL
5.2 新型防御技术
- RASP防护:在应用运行时检测异常SQL语句
- 语义分析:通过AST树分析SQL结构异常
- 行为监测:建立正常SQL模式基线,偏离时告警
6. 实战经验总结
在最近一次渗透测试中,我们发现某系统虽然对GET/POST参数进行了严格过滤,但忽略了Cookie中的语言参数。通过构造lang=en'--的Cookie,成功获取了数据库管理权限。这个案例再次证明:
- 安全防护必须覆盖所有输入向量
- 自动化扫描工具可能遗漏Cookie注入点
- 开发阶段需要建立完整的数据流追踪机制
对于防御方,建议定期进行以下检查:
- 审计所有Cookie处理逻辑
- 实施最小权限原则
- 启用SQL查询日志分析异常模式
