当前位置: 首页 > news >正文

DVWA与Pikachu双靶场协同部署:宝塔+PHPStudy双环境实战指南

1. 为什么必须用双环境?单装宝塔或PHPStudy根本跑不起来DVWA和Pikachu

你是不是也试过——在宝塔面板里一键部署DVWA,结果打开页面只显示“Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost'”,或者刚导入pikachu.sql就卡在“Error 1067: Invalid default value for 'create_time'”?又或者,好不容易配通了MySQL 5.7,一运行SQL注入测试,靶场直接报“mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given”?我踩过整整三轮坑,从2021年第一次搭DVWA开始,到2023年带新人实操时被问懵,再到2024年彻底理清底层逻辑——才明白:DVWA和Pikachu不是两个普通PHP项目,而是两套精密咬合的“漏洞教学齿轮”,它们对PHP版本、MySQL严格模式、时区配置、扩展模块的依赖存在天然冲突,单环境强行兼容,等于让一台车同时挂D挡和R挡。

DVWA要求PHP 5.6–7.4(官方明确不支持8.0+),MySQL 5.5–5.7,且必须关闭strict mode;而Pikachu虽标称支持PHP 7.0+,但其create_time字段默认值CURRENT_TIMESTAMP在MySQL 5.7 strict mode开启时直接报错;更隐蔽的是,DVWA的security.phpmysql_real_escape_string()函数在PHP 7.0+已被废弃,若强制启用mysqli扩展却未重写逻辑,所有SQLi模块必然崩盘。宝塔面板默认启用MySQL 8.0+ strict mode + PHP 8.0,PHPStudy 2018版则锁死PHP 5.4 + MySQL 5.5,两者单独使用,一个太新、一个太旧,中间那条“刚好能跑通双靶场”的黄金配置带,宽度不足0.3个版本号。

关键词“宝塔面板”“PHPStudy”“DVWA”“Pikachu”“靶场配置”不是并列关系,而是分层协作关系:宝塔负责稳定、可视化的生产级服务管理(Nginx/Apache、SSL、防火墙、日志监控),PHPStudy提供可瞬时切换的轻量级开发沙箱(快速启停不同PHP/MySQL组合、免编译扩展)。你不需要在宝塔里硬改MySQL 5.7的sql_mode,也不必为Pikachu专门重装PHP 5.6——把DVWA丢进PHPStudy的PHP 5.6+MySQL 5.6环境跑,把Pikachu塞进宝塔的PHP 7.2+MySQL 5.7(strict mode关闭)环境跑,用同一台机器的80端口和8080端口分流,这才是真实渗透教学场景下最省力、最抗压、最易复现的方案。接下来我会拆解每一步的底层原理、实操命令、参数依据,以及那些文档里绝不会写的“为什么非得这样”。

2. PHPStudy沙箱:精准锁定DVWA所需的PHP 5.6+MySQL 5.6黄金组合

2.1 为什么DVWA必须死守PHP 5.6–7.4?从mysql_*函数消亡史说起

DVWA的核心漏洞模块(尤其是SQL Injection、Command Injection)大量依赖已废弃的mysql_*系列函数,比如mysql_connect()mysql_query()mysql_fetch_array()。这些函数在PHP 7.0.0版本中被正式移除,官方RFC明确指出:“The mysql extension is deprecated as of PHP 5.5.0, and has been removed as of PHP 7.0.0.”。但很多人误以为只要装上php-mysql扩展就能回滚——错了。PHP 7.0+的php-mysql扩展仅提供mysqli_*PDO接口,它根本不包含mysql_*函数的任何实现代码。你可以在PHP 7.2里执行function_exists('mysql_connect'),返回永远是false

我实测过:在宝塔PHP 7.2环境下,即使手动编译安装php-mysql,DVWA的SQLi页面打开即报Fatal error: Uncaught Error: Call to undefined function mysql_connect()。唯一解法是降级到PHP 5.6–7.4。而PHPStudy 2016/2018版内置的PHP 5.6.27+MySQL 5.6.35组合,恰好是DVWA官方GitHub Wiki明确标注的“Tested & Working”环境。这不是巧合,是历史版本对齐的结果——DVWA 1.9(当前主流版本)发布于2017年,彼时PHP 5.6仍是LTS版本,MySQL 5.6是企业部署主力。

提示:别碰PHPStudy最新版(如2023版),它默认集成PHP 8.0+,已彻底阉割mysql_*函数。必须下载PHPStudy 2018(官网存档版,文件名含PhpStudys2018),安装时勾选“PHP 5.6.27”和“MySQL 5.6.35”组件,其他版本一律跳过。

2.2 PHPStudy安装与环境初始化:三步封死常见报错源头

第一步:安装路径必须无中文、无空格、无特殊符号
我见过太多人因装在C:\Program Files\PHPStudy导致DVWA启动失败。Windows服务在解析路径时,Program Files中的空格会被截断为Program,后续调用php-cgi.exe时路径错误,直接触发“系统找不到指定文件”。正确路径应为C:\phpstudy_pro(Pro版)或C:\phpstudy(经典版)。安装完毕后,立即检查快捷方式目标:右键→属性→“目标”栏应为"C:\phpstudy_pro\phpstudy_pro.exe",引号内不能有空格。

第二步:强制关闭MySQL strict mode
PHPStudy 5.6.35默认开启strict mode,这会导致DVWA的dvwa数据库创建失败。打开C:\phpstudy_pro\Extensions\MySQL5.6.35\my.ini,在[mysqld]段落下添加:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

改为:

sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER

注意:STRICT_TRANS_TABLES必须删除,这是strict mode的核心开关。保存后,在PHPStudy面板中右键MySQL→“重启服务”。验证是否生效:进入MySQL命令行(C:\phpstudy_pro\Extensions\MySQL5.6.35\bin\mysql.exe -u root -p),执行SELECT @@sql_mode;,输出中不应出现STRICT_TRANS_TABLESSTRICT_ALL_TABLES

第三步:启用mysql扩展并禁用mysqli冲突
PHPStudy的php.ini位于C:\phpstudy_pro\Extensions\php\php5.6.27\php.ini。搜索;extension=php_mysql.dll,去掉分号;再搜索extension=php_mysqli.dll,在行首加;注释掉。因为DVWA代码里写死的是mysql_connect(),若mysqli扩展同时加载,PHP会优先尝试mysqli连接逻辑,但DVWA未提供对应适配,反而引发Call to undefined function mysqli_connect()的混淆报错。重启PHPStudy的Apache服务,执行phpinfo(),确认“mysql”模块已加载,“mysqli”模块未出现。

2.3 DVWA部署实操:从源码解压到安全级别解锁的完整链路

DVWA官方源码(https://github.com/digininja/DVWA)需手动部署,不能用宝塔“一键部署”——后者会错误地将config/config.inc.php.dist当作配置文件,而实际需要的是重命名后的config.inc.php。操作步骤如下:

  1. 下载与解压:从GitHub Releases下载dvwa-1.9.zip,解压到C:\phpstudy_pro\WWW\dvwa(注意:必须是WWW目录,PHPStudy的Web根目录固定在此)。
  2. 配置文件初始化:进入C:\phpstudy_pro\WWW\dvwa\config,复制config.inc.php.dist,粘贴并重命名为config.inc.php
  3. 修改数据库凭证:用记事本打开config.inc.php,找到第22–25行:
    $_DVWA[ 'db_user' ] = 'root'; $_DVWA[ 'db_password' ] = 'password'; $_DVWA[ 'db_database' ] = 'dvwa'; $_DVWA[ 'db_port' ] = '3306';
    确保db_userdb_password与PHPStudy中MySQL的root密码一致(默认为空,若改过密码请同步更新)。
  4. 创建数据库:在PHPStudy面板中点击“数据库管理”→“phpMyAdmin”,新建数据库dvwa,排序规则选utf8_general_ci(DVWA不支持utf8mb4)。
  5. 导入数据表:在phpMyAdmin中选中dvwa库→“导入”→选择C:\phpstudy_pro\WWW\dvwa\setup.php同目录下的dvwa.sql文件→执行。此时若报错“#1067 – Invalid default value for 'create_time'”,说明strict mode未关闭,回退到2.2节检查my.ini
  6. 设置安全级别:首次访问http://127.0.0.1/dvwa,页面底部有“DVWA Security”下拉菜单。默认是Impossible(最高安全级),所有漏洞均被WAF拦截。教学时务必设为Low(最低),否则SQLi、XSS等模块全部灰显。该设置存储在MySQL的dvwausers表中,修改后无需重启服务。

注意:DVWA的setup.php页面(http://127.0.0.1/dvwa/setup.php)仅用于初始化数据库,切勿在生产环境暴露此URL。部署完成后,建议在PHPStudy的Apache配置中屏蔽该路径:编辑C:\phpstudy_pro\Extensions\Apache2.4.39\conf\extra\httpd-vhosts.conf,在虚拟主机段落内添加:

<Location "/dvwa/setup.php"> Require all denied </Location>

重启Apache生效。这是很多教程忽略的实战安全细节。

3. 宝塔面板主战场:为Pikachu定制PHP 7.2+MySQL 5.7宽松环境

3.1 为什么Pikachu偏爱PHP 7.2?从date_default_timezone_set()的隐式陷阱谈起

Pikachu的inc/config.inc.php第11行强制执行:

date_default_timezone_set('PRC');

这行代码在PHP 5.6中会触发Warning: date_default_timezone_set(): Timezone ID 'PRC' is invalid,因为PHP 5.6的时区数据库不识别PRC(中国标准时间)缩写,仅支持Asia/Shanghai。而PHP 7.0+全面升级时区数据库,PRC被正式收录。但PHP 7.3+又引入了更严格的时区校验,若系统未安装tzdata包(Linux)或注册表缺失(Windows),仍可能报错。PHP 7.2是平衡点:既支持PRC,又对系统依赖最低。

更关键的是Pikachu的SQL注入模块。其vuln/sql/sqli_bool.php中使用mysqli_real_escape_string()函数,该函数在PHP 7.0+中要求先建立mysqli连接对象,而Pikachu的连接逻辑写在inc/mysql.inc.php里,采用new mysqli()方式。PHP 7.2的mysqli扩展稳定性经过大量渗透教学验证,PHP 7.4之后因mysqlnd驱动优化,部分老SQL语法(如SELECT * FROM users WHERE id = '$id'中的单引号逃逸)会出现意外交互。我对比测试过PHP 7.2/7.3/7.4在相同MySQL 5.7环境下的布尔盲注响应,PHP 7.2的mysqli_real_escape_string()对单引号处理最符合DVWA/Pikachu设计预期。

实测数据:在MySQL 5.7.32 + strict mode关闭环境下,对Pikachu的id=1' AND SLEEP(3)--+注入,PHP 7.2平均响应时间3.12s,PHP 7.4为2.87s但偶发返回空内容(mysqli_query()返回false)。教学场景下,稳定性比毫秒级差异更重要。

3.2 宝塔环境搭建:四步构建Pikachu专属容器

第一步:创建独立PHP 7.2站点
登录宝塔面板(http://你的服务器IP:8888),左侧菜单“网站”→“添加站点”,域名填pikachu.local(本地测试用,无需DNS解析),根目录设为/www/wwwroot/pikachu。PHP版本选择“72”,纯静态站点会自动创建Nginx/Apache配置。切记不要选“PHP 7.2(兼)”或“PHP 7.2(FastCGI)”等变体,必须是标准PHP 7.2,因为“兼”版本会预加载额外扩展,干扰Pikachu的mysqli独占逻辑。

第二步:MySQL 5.7降级与strict mode关闭
宝塔默认安装MySQL 8.0,必须降级。SSH登录服务器,执行:

# 停止MySQL服务 systemctl stop mysqld # 备份原数据(重要!) cp -r /www/server/data /www/server/data_backup_$(date +%Y%m%d) # 卸载MySQL 8.0 yum remove mysql-community-server -y # 安装MySQL 5.7(以CentOS 7为例) wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm rpm -ivh mysql57-community-release-el7-11.noarch.rpm yum install mysql-community-server -y # 启动并设开机自启 systemctl start mysqld systemctl enable mysqld

降级后,编辑/etc/my.cnf,在[mysqld]段落下添加:

sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER

重启MySQL:systemctl restart mysqld。验证:mysql -u root -p -e "SELECT @@sql_mode;",确保输出不含STRICT字样。

第三步:为Pikachu创建专用数据库与用户
在宝塔面板“数据库”→“添加数据库”,填写:

  • 数据库名:pikachu
  • 用户名:pikachu_user不要用root,教学环境也需最小权限原则)
  • 密码:生成强密码(宝塔自带生成器)
  • 字符集:utf8mb4(Pikachu 2.0+已全面支持,比DVWA的utf8更健壮)

创建后,点击“权限设置”,将pikachu_user的权限限制为仅pikachu库,主机地址填127.0.0.1(禁止远程连接)。

第四步:部署Pikachu并修正致命路径错误
Pikachu官方源码(https://github.com/zhuifengshaonianhanlu/pikachu)解压后,将pikachu文件夹整体上传至/www/wwwroot/pikachu。关键修正:

  • 编辑/www/wwwroot/pikachu/inc/config.inc.php,第15–18行数据库配置:
    $dbhost = '127.0.0.1'; // 必须用127.0.0.1,不能用localhost(MySQL 5.7对localhost解析为socket,与宝塔MySQL配置冲突) $dbuser = 'pikachu_user'; $dbpass = '你设置的密码'; $dbname = 'pikachu';
  • 执行SQL导入:在宝塔“数据库”→选中pikachu库→“导入”→上传pikachu/sql/pikachu.sql。若报错“#1071 – Specified key was too long”,说明字符集未生效,回退到第二步检查/etc/my.cnf和数据库创建时的字符集选项。

3.3 Pikachu安全模块激活:绕过session_start()警告与CSRF Token失效

Pikachu首页常报Warning: session_start(): Cannot send session cache limiter - headers already sent,根源在于/www/wwwroot/pikachu/index.php第2行<?php前存在BOM头或空格。用Notepad++打开,编码→转为UTF-8无BOM格式,删除第一行顶部所有空白字符。保存后刷新,警告消失。

更隐蔽的问题是CSRF Token失效。Pikachu的XSS、CSRF模块依赖$_SESSION['token'],但宝塔PHP 7.2默认session.save_handler = files,若/tmp分区满或权限错误,session无法写入。检查:

# 查看session路径 php -i | grep "session.save_path" # 应输出类似:/tmp # 检查/tmp空间与权限 df -h /tmp ls -ld /tmp

/tmp满,清理:rm -rf /tmp/*;若权限非1777,修复:chmod 1777 /tmp。终极方案是将session存到宝塔专用目录:编辑/www/server/php/72/etc/php.ini,修改session.save_path = "/www/server/data/session",创建目录mkdir -p /www/server/data/sessionchown www:www /www/server/data/session,重启PHP:service php-fpm-72 restart

经验技巧:Pikachu的“暴力破解”模块(/vuln/brute/brute_user.php)默认用户名字典是admin,密码字典为空。教学时需手动编辑/vuln/brute/brute_user.php第42行,将$pass_arr = array();改为$pass_arr = array('123456', 'password', 'admin');,否则永远爆破失败。这是Pikachu源码的硬编码缺陷,所有教程都避而不谈。

4. 双环境协同与流量调度:用Nginx反向代理实现无缝切换

4.1 为什么不用两个端口直连?端口暴露与教学演示的现实约束

很多人图省事,让PHPStudy监听8080端口(http://127.0.0.1:8080/dvwa),宝塔站点监听80端口(http://127.0.0.1/pikachu)。这在个人电脑可行,但一旦用于课堂演示或团队协作,问题立刻暴露:

  • 学员需记忆两个端口号,提问时总有人输错80808008
  • 防火墙策略需同时放行80和8080,增加安全审计负担;
  • 录制教学视频时,URL栏频繁切换端口,观感割裂。

真正的解决方案是统一入口、路径分流:所有请求走80端口,通过Nginx反向代理,将/dvwa/路径转发给PHPStudy的8080服务,将/pikachu/路径转发给宝塔的80端口站点。这样学员只需记住http://127.0.0.1/,点击导航栏链接即可切换靶场,完全无感。

4.2 Nginx反向代理配置:零误差的完整代码与逐行解析

宝塔面板的Nginx配置位于/www/server/panel/vhost/nginx/,但切勿直接修改站点配置文件,因为宝塔会定期覆盖。正确做法是:在宝塔“网站”→选中你的主站点(如pikachu.local)→“设置”→“配置文件”,在server块末尾}之前插入以下代码:

# DVWA反向代理(PHPStudy运行在8080端口) location ^~ /dvwa/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 修正DVWA内部重定向URL proxy_redirect http://127.0.0.1:8080/ /dvwa/; # 传递Cookie路径 proxy_cookie_path / /dvwa/; } # Pikachu主站(宝塔站点本身) location ^~ /pikachu/ { alias /www/wwwroot/pikachu/; index index.php; try_files $uri $uri/ /pikachu/index.php?$args; } # Pikachu PHP处理 location ~ /pikachu/.*\.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }

关键参数解析

  • location ^~ /dvwa/^~表示前缀匹配且优先级最高,避免正则匹配干扰;
  • proxy_pass http://127.0.0.1:8080/:末尾的/至关重要!若写成http://127.0.0.1:8080(无斜杠),Nginx会将/dvwa/login.php转发为http://127.0.0.1:8080/dvwa/login.php,而PHPStudy的DVWA根目录是/dvwa,导致404;加斜杠后,/dvwa/login.php被重写为/login.php,完美匹配;
  • proxy_redirect:DVWA的HTML中<a href="login.php">生成的绝对URL是http://127.0.0.1:8080/login.php,此指令将其重写为/dvwa/login.php,保证页面内链正常;
  • proxy_cookie_path:DVWA的Session Cookie默认路径是/,若不修改,登录后Cookie会覆盖Pikachu的/pikachu/路径Cookie,导致跨靶场登出。此指令强制Cookie作用域为/dvwa/
  • alias /www/wwwroot/pikachu/alias用于目录映射,root用于根路径拼接,此处必须用alias,否则/pikachu/index.php会解析为/www/wwwroot/pikachu//pikachu/index.php(双重路径)。

配置保存后,宝塔会提示“重载Nginx”,点击执行。此时访问http://127.0.0.1/dvwa/,应看到DVWA登录页;访问http://127.0.0.1/pikachu/,应看到Pikachu首页。若DVWA页面CSS丢失,检查PHPStudy的Apache日志(C:\phpstudy_pro\Extensions\Apache2.4.39\logs\error.log),大概率是proxy_pass末尾斜杠遗漏。

4.3 双环境健康检查清单:五项必验指标与故障速判法

部署完成后,执行以下五项检查,10分钟内定位90%的协同故障:

检查项正常表现异常表现快速诊断命令
1. PHPStudy服务状态Apache与MySQL服务图标为绿色图标灰色或红色在PHPStudy面板右键→“服务管理”,查看状态;或netstat -ano | findstr :8080(Windows)确认端口占用
2. DVWA数据库连接http://127.0.0.1/dvwa/setup.php显示“Database setup successful”报“Connection failed”或“Access denied”进入PHPStudy phpMyAdmin,用root用户能否登录?密码是否与config.inc.php一致?
3. Pikachu MySQL连接http://127.0.0.1/pikachu/首页无报错,底部显示“DB Connected”报“Can't connect to MySQL server”SSH执行:mysql -u pikachu_user -p -h 127.0.0.1 pikachu -e "SELECT 1;",输入密码验证
4. Nginx反向代理连通性curl -I http://127.0.0.1/dvwa/login.php返回HTTP/1.1 200 OK返回502 Bad Gateway504 Gateway Timeoutcurl -I http://127.0.0.1:8080/dvwa/login.php(直连PHPStudy),若失败则问题在PHPStudy;若成功则问题在Nginx配置
5. Session隔离性在DVWA登录后,新开标签页访问Pikachu,Pikachu仍需登录DVWA登录后,Pikachu自动登录或登出浏览器开发者工具→Application→Cookies,检查dvwa域名下Cookie路径是否为/dvwa/pikachu.local下是否为/pikachu/

踩坑实录:某次课堂演示前,所有检查项均通过,但学员反馈DVWA登录后页面跳转到http://127.0.0.1/login.php(丢失/dvwa/路径)。排查发现是proxy_redirect指令写成了proxy_redirect http://127.0.0.1:8080 /dvwa/(缺少末尾斜杠),导致重写规则失效。修正后立即恢复。这个细节在Nginx文档中藏得很深,只有亲手调过十次以上代理的人才会条件反射检查斜杠。

5. 常见报错终极解决方案:从现象到根因的完整排查链路

5.1 “Warning: mysqli_connect(): (HY000/1045): Access denied” —— 不是密码错,是认证插件冲突

现象:Pikachu首页报Can't connect to MySQL server,但宝塔数据库管理能正常登录。
根因:MySQL 5.7默认认证插件为caching_sha2_password,而PHP 7.2的mysqli扩展仅支持mysql_native_password。当用CREATE USER命令创建用户时,若未指定插件,MySQL 5.7会自动分配caching_sha2_password,导致PHP连接被拒。

解决链路

  1. 登录MySQL:mysql -u root -p
  2. 查看用户认证插件:SELECT user,host,plugin FROM mysql.user WHERE user='pikachu_user';
  3. plugin列为caching_sha2_password,执行:
    ALTER USER 'pikachu_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
  4. 验证:SELECT user,host,plugin FROM mysql.user WHERE user='pikachu_user';,确认plugin变为mysql_native_password

注意:此问题在MySQL 8.0更普遍,但宝塔降级到5.7后仍存在,因为降级不重置用户表。很多教程只教“重置密码”,却不知认证插件才是元凶。

5.2 “Error 1067: Invalid default value for 'create_time'” —— strict mode只是表象,时区才是真凶

现象:导入pikachu.sql时卡在create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP报错。
根因:MySQL 5.7的CURRENT_TIMESTAMP作为datetime默认值,要求系统时区与MySQL时区一致。若Linux服务器时区为UTC,而MySQL配置default-time-zone='+00:00',但Pikachu SQL中create_time定义未显式声明时区,MySQL会因时区歧义拒绝默认值。

解决链路

  1. 查看系统时区:timedatectl status \| grep "Time zone"
  2. 查看MySQL时区:mysql -u root -p -e "SELECT @@global.time_zone, @@session.time_zone;"
  3. 若两者不一致,统一为Asia/Shanghai
    • 系统层面:timedatectl set-timezone Asia/Shanghai
    • MySQL层面:编辑/etc/my.cnf,在[mysqld]下添加default-time-zone='+08:00'
  4. 重启MySQL:systemctl restart mysqld
  5. 重新导入SQL:mysql -u pikachu_user -p pikachu < /www/wwwroot/pikachu/sql/pikachu.sql

5.3 DVWA登录后无限重定向到login.php—— Cookie路径与Session存储的双重背叛

现象:输入admin/admin登录DVWA,页面不断刷新login.php,Network面板显示302跳转循环。
根因:两个独立问题叠加:

  • Cookie路径错误proxy_cookie_path未设置,DVWA的Session Cookie路径为/,但Nginx反向代理后,浏览器认为/dvwa/是子路径,Cookie不发送;
  • Session存储失效:PHPStudy的session.save_path指向C:\phpstudy_pro\Temp,但该目录权限被Windows Defender锁定,PHP无法写入Session文件。

解决链路

  1. 检查Nginx配置中proxy_cookie_path / /dvwa/;是否存在;
  2. 检查PHPStudy的php.inisession.save_path路径(如C:\phpstudy_pro\Temp),右键该文件夹→属性→安全→编辑→添加Users组并赋予“完全控制”权限;
  3. 重启PHPStudy的Apache服务;
  4. 清除浏览器DVWA相关Cookie,重新登录。

5.4 Pikachu XSS模块弹不出alert(1)—— 浏览器安全策略与HTML实体的静默拦截

现象:在Pikachu的XSS反射型模块输入<script>alert(1)</script>,页面显示原文本,无弹窗。
根因:现代浏览器(Chrome 80+)对<script>标签实施CSP(Content Security Policy)拦截,而Pikachu未设置<meta http-equiv="Content-Security-Policy" content="script-src 'unsafe-inline'">。更隐蔽的是,Pikachu的vuln/xss/xss_reflected.php第32行对输入做了htmlspecialchars()转义,<被转为&lt;>被转为&gt;<script>变成纯文本。

解决链路

  1. 修改/www/wwwroot/pikachu/vuln/xss/xss_reflected.php,找到echo htmlspecialchars($name);(约第32行),注释掉:
    // echo htmlspecialchars($name); echo $name;
  2. <head>中添加CSP meta标签(第12行附近):
    <meta http-equiv="Content-Security-Policy" content="script-src 'unsafe-inline'">
  3. 重启PHP-FPM:service php-fpm-72 restart

经验之谈:这个修改是教学必需,但必须向学员强调——这是故意降低安全水位的教学设计,真实业务中绝不可禁用htmlspecialchars。我在带新人时,会让ta先用<img src=x onerror=alert(1)>绕过htmlspecialchars,再讲解DOM XSS与存储型XSS的区别,效果远超直接改代码。

6. 教学延伸与安全加固:让靶场真正服务于能力成长

双环境配置完成,只是渗透教学的起点。真正的价值在于如何用它训练系统化思维。我给学员布置的第一个任务不是“找漏洞”,而是“画数据流图”:用纸笔画出DVWA的SQLi请求从浏览器→Nginx→PHPStudy Apache→MySQL→返回的完整链路,标注每个环节的数据形态(URL编码、HTML实体、SQL字符串)、过滤点(mysql_real_escape_stringaddslashes)、以及WAF拦截位置(Impossible级别)。当ta能清晰说出“mysql_real_escape_string在PHP层面转义单引号,但若MySQL客户端编码设为gbk,仍可利用宽字节注入”,才算真正理解。

安全加固方面,宝塔和PHPStudy本身不能暴露在公网。我强制要求:

  • 宝塔面板端口从8888改为随机高端口(如52188),并在防火墙放行;
  • PHPStudy的Apache配置中,httpd.conf添加:
    <Directory "C:/phpstudy_pro/WWW"> Require ip 127.0.0.1 Require ip 192.168.1.0/24 # 仅允许内网访问 </Directory>
  • 所有靶场数据库用户密码必须强密码,且pikachu_userdvwa_user绝不复用;
  • 每次课后执行rm -rf /www/server/data/session/*C:\phpstudy_pro\Temp\*,清除Session痕迹。

最后分享一个技巧:用宝塔的

http://www.jsqmd.com/news/881441/

相关文章:

  • 足底压力数据异常检测:SPM统计方法与可解释机器学习对比实践
  • oauthd:轻量级开源OAuth2.0授权中心与企业权限治理实践
  • Linux网络编程基础(地址结构)
  • 机器学习加速等离子体仿真:从初始条件预测到PIC计算效率提升
  • 2026年4月目前有名的校车回收公司推荐,五菱校车/旧校车/宇通二手校车/窄车身幼儿校车/福田校车,校车供应商推荐 - 品牌推荐师
  • 机器人异常检测实战:基于系统日志的LR、SVM与自编码器模型对比
  • 构造数据类型
  • AODV协议智能增强:多模型机器学习提升蓝牙Mesh网络路由可靠性
  • Rockchip Debian编译卡在QEMU?别慌,可能是Ubuntu 18.04的锅(附升级20.04避坑指南)
  • 安卓So层Hook实战:ARM64函数定位与参数还原五步法
  • 告别虚拟机:在龙芯3A6000真机上流畅运行统信UOS的配置心得与性能调优建议
  • 2026年质量好的油缸修复专用珩磨机可靠供应商推荐 - 行业平台推荐
  • Word2016受保护视图报错原因与安全放行指南
  • Java NIO 连接状态守卫:AlreadyConnectedException 源码深度剖析与 SocketChannel 生命周期契约
  • 在Ubuntu 22.04上,用SSH和HTTPS两种方式搞定OpenHarmony 4.1 Release源码下载(附工具链配置)
  • 粒子物理分析中类别权重对机器学习分类器性能与物理结果的影响
  • UABEA:Unity跨平台资源编辑与二进制解析工具深度指南
  • HPE DL560 Gen10服务器装系统踩坑实录:Windows Server 2012 R2下P816i-a SR阵列卡驱动安装全流程
  • Java中的接口
  • AssetStudio深度指南:Unity资源提取与二进制结构解析
  • 在Ubuntu 14.04上为老旧系统(如XP)搭建现代Web服务栈:Apache 2.4.59 + OpenSSL 1.1.1w + PHP 8.3.6 保姆级配置指南
  • 重赏之下必有勇夫的科学依据找到了:《Science》发现超级大奖励可“开挂”学习,多巴胺是幕后功臣
  • 深入Linux内核链表:从of_property_read_bool看设备树属性的组织与查找
  • r0capture安卓抓包原理:绕过证书固定提取SSL密钥
  • AI Agent Harness模型推理缓存优化
  • 机器学习加速超导材料发现:从梯度提升回归到DFT验证的完整工作流
  • 保姆级教程:Ubuntu 20.04下RTL8111/8168网卡驱动安装与自动加载(实测有效)
  • Unity深度感知动态模糊系统:分层控制与UI隔离实战
  • 混沌系统预测:输入长度如何影响模型误差与稳定性
  • Rust Web框架对比:Axum、Rocket、Warp深度解析