Skip to content

03靶场:搭建漏洞练习环境

你好,我是赢少良。这一讲我来和你聊一聊"靶场",也就是存在漏洞的实验环境,为了方便你边学习边实践,我强烈建议你在学习前搭建好靶场环境。

本讲主要介绍几款用于学习 Web 漏洞的常见靶场,你可以直接跟着我介绍的操作方法边看边安装。

安装与使用 Docker 容器

以前我们搭建网站,需要在服务器依次安装 Apache、PHP、MySQL 等应用,比较烦琐,而且不同的源还有不同的应用版本,跟系统环境又可能存在兼容性的问题,这就需要手动添加源地址,甚至是自己编译安装。

后来出现了 XAMPP、PHPStudy 等优秀的 PHP 集成环境,可以非常便捷地安装。但是安装好之后,如果要使用某些 PHP 网站代码,我们仍然需要查找下载,再部署上去。PHP 网站代码有可能与 PHP 版本、系统环境存在兼容问题,或者需要额外安装其他依赖库。若需要迁移服务器,那上述安装过程又得重来一遍。

到底有没有高效的安装方式呢?有,答案就是 Docker。

Docker 安装

本课程主要在 Ubuntu 系统下进行演示,在 Ubuntu 下可通过以下命令安装 Docker:

java
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

如果是 Windows 或 macOS 系统,可以直接从官网下载安装包安装,它会自动识别你当前的操作系统,并提供相应平台的下载地址。

安装完成后,可运行以下命令,若输出"Hello from Docker!"则代表安装成功:

java
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bc
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Docker 常用命令

安装完之后,我再介绍一些 Docker 的常用命令,基本是你在使用 Docker 会用到的。

安装 sqli-labs 靶场

sqli-labs 是一款用于学习 SQL 注入的靶场平台,覆盖了各种类型的 SQL 注入,题目共 75 道,按难度划分为 4 页。sqli-labs 靶场的难度循序渐进,对于提高 SQL 注入实战能力有很好的帮助。sqli-labs 靶场的项目开源地址为https://github.com/Audi-1/sqli-labs

那如何使用 Docker 快速安装 sqli-labs 呢?首先,搜索 sqli-labs 镜像,挑战 STARS 星标最多的镜像,这里选择"acgpiano/sqli-labs"镜像:

java
$ sudo docker search sqli-labs
NAME                       DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
acgpiano/sqli-labs         sql injection labs                              12
c0ny1/sqli-labs            sqli-labs 是一个 sql 注入的练习靶机,项目地址为...                   2
sari3l/sqli-labs-safedog   Base: sqli-labs & safedog(version Linux64_2....   1
promiseit/sqli-labs                                                        1
0bajie0/sqli-labs                                                          1
tinmin/sqli-labs                                                           0
area39/sqli-labs           sql inject                                      0
hl0rey/sqli-labs                                                           0
sari3l/sqli-labs           Base: Debian-Wheey + MySQL 5.5 + PHP 5          0
sari3l/sqli-labs-yunsuo    Base: sqli-labs & yunsuo(version Linux_3.0.6...   0
aqyoung/sqli-labs                                                          0
xuanxuan3000/sqli-labs                                                     0
fengbj/sqli-labs           lamp+sqli-labs please down 2.0                  0
jylsec/sqli-labs                                                           0
baohs/sqli-labs-cenos                                                      0
mendickxiao/sqli-labs      sqli-labs based on ubuntu                       0
r0ulier/sqli-labs          sqlInjection                                    0

然后拉取镜像:

java
$ sudo docker pull acgpiano/sqli-labs
Using default tag: latest
latest: Pulling from acgpiano/sqli-labs
10e38e0bc63a: Pull complete 
0ae7230b55bc: Pull complete 
fd1884d29eba: Pull complete 
4f4fb700ef54: Pull complete 
2a1b74a434c3: Pull complete 
fb846398c5b7: Pull complete 
9b56a3aae7bc: Pull complete 
1dca99172123: Pull complete 
1a57c2088e59: Pull complete 
b3f593c73141: Pull complete 
d6ab91bda113: Pull complete 
d18c99b32885: Pull complete 
b2e4d0e62d16: Pull complete 
91b5c99fef87: Pull complete 
bf0fd25b73be: Pull complete 
b2824e2cd9b8: Pull complete 
97179df0aa33: Pull complete 
Digest: sha256:d3cd6c1824886bab4de6c5cb0b64024888eeb601fe18c7284639db2ebe9f8791
Status: Downloaded newer image for acgpiano/sqli-labs:latest
docker.io/acgpiano/sqli-labs:latest

接着再在容器中运行 sqli-labs:

java
$ sudo docker run -dt --name sqli-labs -p 80:80 --rm acgpiano/sqli-labs                   [13:36:58]
2c40ccae95775f7dca6064c95e5eed9c58e66c93e92775a04f22f407b665d331

各参数含义如下所示:

java
-d:代表后台运行
-t:为容器分配伪终端
--name:命名容器
-p:指定映射端口,此处将 acgpiano/sqli-labs 的 80 端口映射到本地的 80 端口
--rm:退出时自动移除容器

现在我们直接访问http://localhost,可以看到 sqli-labs 已经成功运行了。

图 1:sqli-labs 成功运行

最后点击"Setup/reset Database for labs"链接完成数据库的安装:

图 2:完成数据库安装

到此,sqli-labs 安装结束!

安装 DVWA 靶场

DVWA(Damn Vulnerable Web Application)是一款比较著名的漏洞靶场,很多 Web 安全的初学者都会拿它来练习,一些高校以及相关书籍里面也会介绍它。DVWA 的项目开源地址为https://github.com/digininja/DVWA

DVWA 靶场可以直接通过 Docker 安装:

java
$ sudo docker pull citizenstig/dvwa
$ sudo docker run -d --name dvwa --rm -p80:80 citizenstig/dvwa

安装成功后,打开http://localhost

图 3:DVWA靶场

然后点击"Create/Reset Database"创建数据库,使用默认密码 admin/password 登录,即可正常使用。做题时它能直接提供阅读源码的功能,不过题目相对少一些。

图 4:DVWA 支持在线查看源码

上面的 XSS 漏洞默认是安全的,在实际练习时,可以在"DVWA Security"中设置安全等级,即题目的难度等级,共有 4 等,其中 Impossible 代表的是已修复漏洞的情况,可以用来熟悉如何修复漏洞。

图5:DVWA 安全等级设置

安装 Pikachu 靶场

Pikachu 也是一款 Web 漏洞靶场,涵盖各种 Web 漏洞类型的练习,也是基于 PHP+MySQL 搭建的平台,是由国人开发的。平台采用中文描述和基本的页面设计,相比 sqli-labs 这种单调的界面还是好看很多的。Pikachu 的项目开源地址为https://github.com/zhuifengshaonianhanlu/pikachu

安装 Pikachu 也很简单,通过 Docker 即可快速安装。我们先搜索下镜像:

java
$ sudo docker search pikachu
NAME                                  DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
area39/pikachu                        https://github.com/zhuifengshaonianhanlu/pik...   3
......

然后取第一个镜像安装&运行:

java
$ sudo docker pull area39/pikachu
$ sudo docker run -d --name pikachu --rm -p80:80 area39/pikachu

安装成功后,打开http://localhost即可。

图 6:Pikachu 靶场

CTF 赛题练习

CTF(Capture The Flag)夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF 起源于 1996 年 DEFCON 全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今,CTF 已经成为全球范围网络安全圈流行的竞赛形式。

一些 CTF 出题方经常会直接搭建现成的漏洞测试环境供参赛者使用,有些赛后会取消,有些会一直保留。所以你也可以直接利用现成的 CTF 赛题环境来练习,连搭建环境这一步都省去了。对于一些未保留在线赛题环境的 CTF 题目,就只能自己搭建了。

前面的漏洞靶场更新频率不高,CTF 赛题会更与时俱进一些,每年都有新比赛和新赛题,特别是新的漏洞场景和利用技术,这在 CTF 上很容易看到。

图 7:CTF TIME

各种国内外的赛事、题目与解答(write-up)都可通过该链接获取到,我在这里顺便也介绍几个现成的 Web 漏洞 CTF 在线练习环境:

1. XCTF 攻防世界https://adworld.xctf.org.cn

图 8:XCTF 攻防世界

2. SQL 注入挑战平台http://redtiger.labs.overthewire.org

图 9:SQL 注入挑战平台

3. 韩国 Web 安全挑战平台https://webhacking.kr/

图 10:韩国 Web 安全挑战平台

4. Websec CTF 练习平台http://www.websec.fr/

图 11:Websec CTF 练习平台

5. 网络信息安全攻防学习平台http://hackinglab.cn/index.php

图 12:网络信息安全攻防学习平台

6. 国外的 XSS 挑战平台http://prompt.ml/

图 13:国外的 XSS 挑战平台

你可以根据自己的喜好做选择进行练习。

安装 VulHub 真实漏洞靶场

Vulhub 是一款基于 Docker 和 docker-compose 的漏洞测试靶场,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。Vulhub 的项目开源地址为https://github.com/vulhub/vulhub

前面的靶场都是精心构造的漏洞场景,与真实的漏洞场景还是有一些差异的。为了提高实战水平,熟悉更多的真实漏洞场景,建议你安装 VulHub 来重现各种历史漏洞进行实战练习。

对于每个漏洞,VulHub 都有相应的文档描述其漏洞原理以及测试利用方法,你在重现漏洞后,可以进一步研究相关漏洞类型的利用技术,并对漏洞代码进行阅读,以提高代码审计能力。

我们需要先从 GitHub 上下载 VulHub,然后进行相应目录去创建和运行容器:

java
$ git clone https://github.com/vulhub/vulhub
$ cd vulhub/flask/ssti
$ sudo docker-compose up -d

安装使用都很方便。

该项目几乎每个月都在更新,非常适合用于检测、利用和防御漏洞时的测试环境搭建。

总结

这一讲我主要介绍了一些用来实战漏洞攻防的训练靶场,并重点介绍了 Docker 快速搭建环境的方法,它相比传统方法中一个个工具的安装更加便捷;同时,靶场还能避免对真实网站非法测试的风险。

我向你介绍了 sqli-lab、DVWA、Pikachu、VulHub 这些业界常用的漏洞靶场,你可以都安装了,然后跟着后面的教程,边学边动手操作,以提高自己的实战能力,以及对漏洞的理解。

除了上述靶场之外,你如果还知道其他好的靶场,也欢迎在留言区中推荐。

下一讲,我将带你了解在渗透测试过程中需要注意的法律法规。之后,咱们就会进入本课程最核心的内容,模块二的漏洞攻防。