尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Web安全入门:四大靶场安装实战与Docker一键部署方案

Web安全入门:四大靶场安装实战与Docker一键部署方案 这标题一看就知道是给刚入门的Web安全学习者准备的。说实话我当年学的时候最头疼的不是漏洞原理而是环境装不起来。手里一份DVWA的教程照着装了一下午最后卡在PHP版本兼容上愣是白屏一整天。后来把Pikachu、sqli-labs、upload-labs这些靶场都逐个试过一遍才发现安装这件事本身就有不少门道。这篇就把我从零开始装这四个靶场的完整过程、踩过的坑、以及最终怎么用Docker一把梭的方案都整理出来给需要的人省点时间。1. 装之前先搞清楚这四个靶场到底在练什么很多新手犯的错是拿到靶场就装装完就刷题但根本不清楚每个靶场的训练定位。结果就是DVWA刷了两遍SQL注入到sqli-labs里又迷路了因为两者出题思路完全不一样。先花五分钟搞清楚每个靶场是干嘛的后面练起来会顺手很多。1.1 DVWA综合型入门首选难度分级是它最大的价值DVWADamn Vulnerable Web Application是目前最常见的入门靶场它最大的特点是内置了四个安全等级Low、Medium、High、Impossible。同一个漏洞你在Low级别能打进去切到High级别同样的payload就失效了Impossible级别的代码几乎从根上封死了这个漏洞。这种设计让你能直观感受“同样的功能写法不同安全性天差地别”。它覆盖的漏洞类型也比较全SQL注入、XSS、命令注入、文件上传、CSRF、文件包含、暴力破解基本覆盖了OWASP Top 10里的核心项。适合作为第一个系统学习的靶场把Web漏洞的“全家福”先过一遍。要注意的是DVWA只做功能演示代码量不大它是单文件式PHP应用没有复杂的框架逻辑安装时要关注的其实就是配置文件里的数据库连接信息。1.2 Pikachu中文界面、带漏洞原理讲解对新手极其友好Pikachu这个靶场我愿称之为“中文亲妈”。它和DVWA最大的区别是界面全中文而且每个漏洞模块下面都有原理说明文字告诉你这个漏洞是怎么产生的、怎么测。对英文一般、看DVWA界面费劲的初学者来说Pikachu是第一选择。它的漏洞覆盖面比DVWA还广一些除了常规的SQL注入、XSS、CSRF还加入了RCE、XXE、SSRF、反序列化、越权以及一个独立的“PHP特性”模块专门演示一些PHP函数使用不当导致的安全问题。难度上比DVWA的Low级别稍微高一点更适合在DVWA入门之后用来进阶。有意思的是Pikachu的作者还配套了在线漏洞讲解文档每个模块都有详细的前因后果。所以这靶场不只是“练手”还能当“教程”用。1.3 sqli-labsSQL注入专项训练从基础到偏门全覆盖如果你确定自己要主攻SQL注入那sqli-labs是绕不开的。这个靶场是印度安全研究员写的一共65关从最基础的“单引号报错”开始逐步覆盖联合查询、报错注入、盲注、堆叠注入、二次注入、宽字节注入、order by注入到后期的过滤绕过等偏门技巧。它的每一关都是独立的PHP文件文件名本身就是关卡编号比如Less-1.php、Less-2.php。这对学习特别友好——你看一眼URL就知道自己在练哪一关复现笔记也好做。不过sqli-labs界面极度简陋没有任何花哨的页面基本就是一个带参数链接的空白页面纯粹服务功能。1.4 upload-labs文件上传漏洞专项训练upload-labs是目前网络上常见的文件上传专项靶场早期版本大约20关新版本关卡更多关卡逻辑覆盖了前端JS校验、MIME类型校验、扩展名黑名单绕过、文件头校验、二次渲染、.htaccess利用等常见场景。如果你目标是搞懂“为什么有时候明明能上传一句话木马但就是连不上”或者想搞懂“服务端到底校验了什么东西”这个靶场必须刷。它和前面几个靶场的区别在于它更偏向渗透测试中的对抗思维——每一关都是防守方设计的一个常见失误你要找出绕过方式。这四个靶场各司其职DVWA打基础Pikachu进阶并补原理sqli-labs和upload-labs是专项深度训练。装一套环境四者缺一不可。2. 环境准备Windows下用phpStudy装之前必须想清楚的三个问题大多数学Web安全的人主力机是Windows所以最容易上手的方案是装集成环境。但我见过太多人直接百度“phpStudy下载”装完新版发现靶场跑不起来。这里有几个问题必须先想明白。2.1 PHP版本到底选哪个新版不等于能用这是最容易被坑的点。DVWA、Pikachu、sqli-labs、upload-labs这些都是老项目最后更新时间基本都在2015到2019年之间。它们依赖的PHP特性、数据库扩展方式都是老一套。尤其是老靶场对PHP 7.0以上版本中移除的mysql扩展以及PHP 7.4以后对短标签的默认关闭都极其敏感。我的建议是Windows下用 phpStudy 的话PHP版本选择PHP 5.6.xphpStudy中该版本为5.6.27左右。这个版本对四个靶场兼容性最优基本开箱就能跑。有人会说PHP 5.6太老了有安全漏洞。这是靶场环境要的就是老版本才会有漏洞本地虚拟机里跑没有任何问题。不要在靶场环境强行追求新版本那不是学习是给自己找麻烦。2.2 MySQL默认密码和端口冲突两个高频翻车点phpStudy自带MySQL但有两个问题经常让人卡住一是phpStudy面板里MySQL的默认密码。新版本phpStudy安装完MySQL默认密码可能是空也可能是root具体要看面板首页显示。很多靶场安装教程统一让你填“root”结果换了个phpStudy版本就翻车。二是端口冲突。如果本机已经装了其他MySQL或者别的服务占用了3306端口phpStudy里的MySQL根本启动不了。我见过最夸张的一次是有人电脑上装了XAMPP没卸载干净两个集成环境的MySQL服务互相抢端口开了这个关那个。解决方案在phpStudy的“设置—端口常规设置”里把MySQL端口改成3336之类不常用的端口。然后对应地靶场配置文件里的数据库连接端口也要同步改。2.3 Web根目录的存放路径千万别放在带中文的路径下phpStudy的网站根目录默认是phpStudy_Pro\WWW这是中文路径。诡异的是大部分时候靶场放里面能跑但偶尔会有解析异常。我建议直接在磁盘根目录建一个纯英文目录比如D:\www然后在phpStudy的“网站—创建站点”里把根目录指向这里。另外子目录名也别用中文。我见过有人把解压出来的DVWA文件夹重命名成“DVWA-靶场”结果直接白屏改成DVWA-main就正常了。3. 四个靶场逐个安装关键配置文件和注意事项这一部分直接上干货按顺序把每个靶场的安装要点和配置文件位置列出来。真实操作时建议四个都解压到Web根目录下然后用http://127.0.0.1/dvwa/这样的路径访问。3.1 DVWA改一处配置文件登录默认账号密码要记住DVWA从GitHub下载后搜索DVWA仓库下载zip解压或git clone把目录重命名为dvwa放到Web根目录下。接下来最关键的一步复制配置文件。DVWA自带一个config/config.inc.php.dist文件你需要手动复制一份把副本重命名为config.inc.php。很多新手直接跳过这步打开页面就报错“Configuration file not found”还以为自己环境坏了。打开config.inc.php需要修改的核心内容$_DVWA[ db_server ] 127.0.0.1; $_DVWA[ db_port ] 3306; $_DVWA[ db_user ] root; $_DVWA[ db_password ] 你的MySQL密码; $_DVWA[ db_database ] dvwa;如果你在phpStudy里改了MySQL端口这里的db_port要同步改。保存后浏览器访问http://127.0.0.1/dvwa/首次打开页面下方会提示你点击“Create/Reset Database”按钮初始化数据库点击后会自动建库。默认登录账号是admin密码是password。登录后默认安全等级是Impossible记得去“DVWA Security”里把等级调到Low再开始练。3.2 Pikachu改数据库连接配置无需建库自动完成Pikachu的安装比DVWA还简单。GitHub上下载源码搜索pikachu解压后把目录重命名为pikachu放到Web根目录。它只需要改一个文件inc/config.inc.php。打开后找到const DB_HOST 127.0.0.1; const DB_PORT 3306; const DB_USER root; const DB_PASS 你的MySQL密码; const DB_NAME pikachu;改完刷新页面即可。Pikachu首次访问时会自动检测数据库是否存在不存在会自动创建不需要你手动导入SQL这点非常友好。首页会有个“初始化”按钮可点击点击后确认可以看到“初始化成功”的提示。有个小细节Pikachu的目录结构里有一个pkxss子目录是独立的XSS靶场里面也有自己的数据库配置路径是pkxss/inc/config.inc.php。如果你打算用Pikachu练XSS这个文件也得改。虽然两个文件的内容几乎一样但漏改任何一个对应的功能就无法正常工作。3.3 sqli-labs需要手动点击Setup数据库初始化sqli-labs的安装相对繁琐一点但也就两步。第一步解压后把目录重命名为sqli-labs放到Web根目录。然后找到sql-connections/sql-connect.php打开修改$dbuser root; $dbpass 你的MySQL密码; $dbname security; $host 127.0.0.1; $port 3306;第二步浏览器访问http://127.0.0.1/sqli-labs/首页会有一个**“Setup/reset Database for labs”的链接点击它会自动创建security数据库。注意这一步不是可选的**不点的话后面每一关都会报错连接不到数据库。sqli-labs的关卡文件都叫Less-1.php、Less-2.php这种格式访问http://127.0.0.1/sqli-labs/Less-1.php就能进入第一关。有些版本的sqli-labs还带了Less-1到Less-65的完整关卡但有些精简版只到22关下载的时候注意看文件完整性。3.4 upload-labs一个容易忽略的上传目录权限问题upload-labs分几个版本老版本比较轻量把源码解压到Web根目录就可以访问。新版本可能需要composer install装依赖。这里以常见的老版本为例。解压后重命名目录为upload-labs放到Web根目录。它也有一个数据库配置文件路径一般是config.php但大部分早期版本不需要数据库纯文件上传逻辑直接访问就能用。容易翻车的点在上传目录权限。upload-labs默认上传目录是upload/如果这个目录没有写权限测试上传时会一直提示“上传失败”。Windows下phpStudy通常不会有权限问题但如果你用的是Linux服务器要记得chmod -R 755 /var/www/html/upload-labs/如果你用的是新版upload-labs还需要检查PHP版本。新版用了一些更新的语法特性PHP 5.6可能跑不起来需要PHP 7.2以上。装了新版跑不起来的话先看一下首页左侧的版本号提示别急着怪环境。四个靶场装完之后建议在Web根目录下顺手建一个index.html写一个简单的导航页把四个靶场的URL链接放上去后面用起来省事很多。4. 用Docker Compose一把梭跨平台部署方案如果你用的是macOS或者Linux或者你嫌弃Windows上一堆集成环境的配置麻烦那就直接上Docker Compose。这个方案最省心配置一次之后以后换电脑也能秒速重建。4.1 为什么推荐Docker而不是继续手工安装手工安装的好处是你能看到每个配置文件在哪、改了什么理解靶场是怎么跑起来的。但坏处也很明显PHP版本兼容、MySQL密码、端口冲突、路径中文任何一个环节出问题都可能卡半小时以上。Docker Compose的好处是把环境依赖、PHP版本、MySQL版本全部固化在配置文件里一次写好哪里都能跑。而且容器之间互相隔离不会污染宿主机环境。缺点是你对底层配置的感知会弱一些但如果目标是练漏洞不是研究环境这个缺点完全可接受。4.2 docker-compose.yml写法一个服务对应一个靶场我直接给出一份我自己在用的配置四个靶场 MySQL全部编排在一个Compose文件里。假设你已经装好了Docker Desktop直接在任意目录新建docker-compose.ymlservices: db: image: mysql:5.7 container_name: vuln_db restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: dvwa ports: - 3306:3306 command: --character-set-serverutf8mb4 volumes: - db_data:/var/lib/mysql dvwa: image: vulnerables/web-dvwa container_name: dvwa restart: always depends_on: - db ports: - 8081:80 environment: DB_HOST: db DB_USER: root DB_PASSWORD: root DB_NAME: dvwa pikachu: image: area39/pikachu container_name: pikachu restart: always ports: - 8082:80 sqli-labs: image: acgpiano/sqli-labs container_name: sqli_labs restart: always ports: - 8083:80 upload-labs: image: c0ny1/upload-labs container_name: upload_labs restart: always ports: - 8084:80 volumes: db_data:这份配置把四个靶场分别映射到宿主机的8081到8084端口端口冲突概率大幅降低也方便记忆。需要说明的是Pikachu镜像不一定需要MySQL配置它的Docker镜像内部自带了完整的LAMP环境启动后直接访问即可。4.3 启动、查看状态、关闭三个必须记住的命令启动全部服务docker compose up -d查看服务状态和日志docker compose ps docker compose logs -f [服务名]关闭环境docker compose down这套命令的核心逻辑是up -d让容器后台运行ps确认状态down终止所有容器但保留数据卷。数据库数据不会丢因为绑定了db_data这个数据卷。镜像拉取较慢时需要先配置Docker镜像加速器。macOS和Windows版Docker Desktop在Settings—Docker Engine里把国内镜像源加到registry-mirrors数组里保存重启Docker即可。Linux上则在/etc/docker/daemon.json里配置然后重启Docker服务。4.4 容器方式访问后的验证启动完成后直接用浏览器访问DVWAhttp://127.0.0.1:8081Pikachuhttp://127.0.0.1:8082sqli-labshttp://127.0.0.1:8083upload-labshttp://127.0.0.1:8084DVWA容器版默认登录账号密码依然是admin/password首次访问需要点“Create/Reset Database”。sqli-labs容器版默认数据库连接信息在镜像里已经配好不需要自己在容器里改配置访问首页点Setup即可。5. 靶场装完之后的验证清单如何确认每个靶场真能用了很多人装完靶场看到首页能打开就觉得“装好了”结果练到一半发现某个模块怎么都不对。这里给一份我自己每次装完都会跑一遍的快速自检清单大概五分钟能验证完全部功能。5.1 四个靶场的核心功能验证方法DVWA验证项登录页能否正常加载是否能登录成功admin/password。进入“Security”页面能否把安全等级从Impossible切换为Low并保存。进入“SQL Injection”模块在输入框提交一个1如果页面报错或出现异常回显说明SQL注入模块可用。进入“Upload”模块随便传一个正常的txt文件看能否上传成功。如果连正常文件都传不上去说明上传模块有问题需要检查upload目录权限。Pikachu验证项首页“初始化”是否提示成功。进入“SQL Injection—数字型注入”模块提交一个单引号看是否报错。进入“RCE—exec ping”模块提交127.0.0.1看是否回显ping结果。测试一下pkxss下的XSS题目确保独立环境也正常。sqli-labs验证项首页是否显示关卡列表点击Less-1能否正常打开。在Less-1页面URL后面加参数?id1如果页面报错说明数据库连接正常、注入点存在。随机点开几关比如Less-2、Less-23确认没有大面积报错。upload-labs验证项进入第一关按页面提示先上传一个正常图片确认能成功显示。再尝试把PHP文件后缀改成.php.jpg或者1.php上传看第二关、第三关的绕过逻辑是否正常触发。注意有些关卡会要求你先创建一个包含特定内容的文件比如第三关可能要.user.ini或.htaccess文件配合这些在关卡描述里都会写照着操作就好。5.2 网络与端口自检连不上先查这两项如果上面某一步访问不了先做两件事第一在命令行里ping 127.0.0.1确认本机网络栈正常。这一步看起来傻但能排除偶发性的网络驱动异常。第二确认端口真正在监听。Windows下执行netstat -ano | findstr 8081Linux/macOS下执行lsof -i:8081。如果端口没有监听说明服务本身没起来而不是靶场配置问题。Docker环境有个特殊点容器内的8081端口映射需要等待镜像完全初始化。镜像首次启动可能需要拉取依赖、初始化数据库所以刚执行完docker compose up -d后不需要急着访问等30秒左右再刷新浏览器。5.3 容易被忽略的“后续”问题靶场别裸奔在公网这里必须提醒一句这些靶场设计出来就是有漏洞的绝不要部署到云服务器公网IP上。它们的存在价值是让你在本地或者内网环境里安全地练手如果暴露到公网分分钟就会被扫描工具盯上沦为他人的跳板或挖矿肉鸡。我个人的习惯是本地环境用127.0.0.1访问如果需要在虚拟机里装就把虚拟机的网络模式设置为“仅主机模式”其他机器无法访问最稳妥。6. 实测中我踩过的坑排查链路与解决办法这部分不是理论推演都是我实际安装过程中真真切切遇到的按“现象—原因—解决”的方式排出几条高频的链路希望能帮你省下排查时间。6.1 现象DVWA页面能打开但一点“Create/Reset Database”就报错这种报错绝大多数出在数据库连接信息不对。我之前遇到过一次特别典型的花了半小时最终发现是phpStudy里的MySQL默认端口是3307而不是3306而DVWA配置文件里还写的是3306导致DB连接失败。排查链路先去phpStudy面板看MySQL当前实际使用的端口是多少再开一个终端手动测试一下数据库账号密码能不能连上mysql -uroot -p你的密码 -h127.0.0.1 -P3306最后同步修改DVWA的config.inc.php里的db_port、db_password。6.2 现象sqli-labs首页正常随便点进一关就白屏或报错这个坑主要出在PHP版本太高。sqli-labs很多文件用了老式mysql_query()函数在PHP 7.0以后被移除会直接报Call to undefined function mysql_query()。解决办法在phpStudy里把当前网站的PHP版本切换为5.6。在phpStudy的“网站—管理—PHP版本”里切换或者直接在“设置—PHP版本”里改默认版本改完重启Apache。Docker方案的用户基本不会遇到这个问题因为镜像内部已经配好了合适的PHP版本。这恰恰是Docker的又一个优势。6.3 现象upload-labs上传任何文件都提示失败这个坑的根源通常不是PHP代码逻辑而是上传目录没有写权限。Windows下主要是目录只读属性或phpStudy运行用户权限不足Linux下就是目录权限问题。还有一种情况是phpStudy开了“防跨站攻击”功能限制了PHP只能访问站点的域名根目录导致上传目录不可写。在phpStudy的“其他选项—PHP安全设置”里找到open_basedir相关配置把它留空或关闭即可。6.4 现象Docker Compose启动后某个靶场反复重启这种常见于数据库服务还没就绪靶场容器就先启动了。虽然Compose文件里写了depends_on但depends_on只保证容器启动顺序不保证数据库已经初始化完成。解决办法第一个应用容器起来后先执行docker compose logs db看到里面有“ready for connections”字样再刷新靶场页面。如果还是不行重启一下应用容器docker compose restart dvwa6.5 现象四个靶场全部装好但互相抢80端口手工安装方案里如果你把四个靶场都放在同一个Web根目录下用不同子目录访问一般不存在端口冲突。但如果你图省事分别给四个靶场建了不同站点且都监听80端口就会出问题。我的建议是手工安装就用“单站点多子目录”方案统一通过http://127.0.0.1/dvwa、http://127.0.0.1/pikachu这种路径访问不额外建站点最省事也最不容易乱。7. 日常使用的一些实操心得这里分享几个我后来养成的习惯算不上教程但是能减少大量重复性工作。第一每次重装系统或换电脑后最快重建靶场环境的方式是Docker Compose。一份docker-compose.yml文件保存好所有环境配置都在里面十分钟就能全装回来。手工安装的环境虽然也能用但重装一遍至少要半小时还容易踩版本坑。第二靶场的动手记录一定要做笔记。不光是留档更重要的是记录自己每道关卡的思考路径。我自己的习惯是每刷一关把使用的payload、页面返回结果、自己的理解写到一篇Markdown文档里按靶场分目录整理。积累几个月之后这会是一份比任何教程都适合自己的知识库。第三学习顺序很重要。以我接触过的大量初学者经验来看比较省力的顺序是DVWA按漏洞类型刷一遍把每种漏洞的利用方式混个脸熟然后Pikachu做补充重点看它自带的原理讲解再根据自己感兴趣的方向深入sqli-labs或upload-labs做专项训练。贪多嚼不烂四个靶场同时练容易乱了节奏。第四务必在本地环境学习。我所介绍的所有安装方式默认都是127.0.0.1访问本地环境。靶场资源应该用在本地虚拟机、Docker容器或者隔离的实验网络中不建议对外开放。记住这一点既能保证自己的安全也能让学习过程更专注、更规范。
返回列表