【第一章 web入门]afr_1 1】任意文件读取

一、漏洞简介

任意文件读取/下载漏洞(Arbitrary File Read/Download Vulnerability),是指攻击者可以通过某些漏洞,绕过应用程序的限制,直接读取或下载应用程序之外的文件。

这种漏洞通常是由于应用程序没有对用户输入进行充分的验证和过滤而导致的。攻击者可以通过构造恶意的请求来利用该漏洞,从而读取或下载他们本来无权访问的文件,如密码、私钥、证书等,会提供攻击者更多可用信息,提高被入侵的风险。

二、解题过程

尝试p是什么相关的参数:
http://b76b2ea7-9676-4d7a-b904-6b1232d1db02.node5.buuoj.cn:81/?p=./hello
【第一章 web入门]afr_1 1】任意文件读取_第1张图片
猜测p后面跟随的应该是文件名,传入后端之后将文件的内容显示出来,尝试输入别的东西,不管输入什么都是一片空白,可能过滤了吧,然后就不知道该干嘛了,这也不能问别人,我就在网上找啊找,最终找到了一条记录:Filter的利用,如php://filter/convert.Base64-encode(将文件流通过Base64进行编码)。这句话啥意思,完全看不懂,去查查:

php://filter 是 PHP 中的一种流过滤器(stream filter)机制,用于对数据流进行过滤和转换。它允许你在读取或写入数据流时应用过滤器,以便在传输数据之前或之后进行一些处理。
使用 php://filter 的基本语法如下:

 php://filter//resource
其中:

 是过滤器的名称,表示你要应用的过滤器类型。
resource 是要过滤的数据流资源。
以下是一些例子:

Base64 编码解码:
$data = 'Hello, World!';
$encoded = file_get_contents('php://filter/read=convert.base64-encode/resource=data:text/plain;base64,' . base64_encode($data));
echo $encoded;

$decoded = file_get_contents('php://filter/write=convert.base64-decode/resource=data:text/plain;base64,' . base64_encode($data));
echo $decoded;
上述例子中,convert.base64-encode 和 convert.base64-decode 是两个过滤器,分别用于对数据进行 Base64 编码和解码。

字符串替换:


$data = 'Hello, World!';
$filteredData = file_get_contents('php://filter/read=string.toupper/resource=data:text/plain;base64,' . base64_encode($data));
echo $filteredData;
在这个例子中,string.toupper 过滤器将字符串转换为大写。

自定义过滤器:


stream_filter_register('custom_filter', 'CustomFilter');

class CustomFilter extends php_user_filter {
    public function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = strtoupper($bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

$data = 'Hello, World!';
$filteredData = file_get_contents('php://filter/read=custom_filter/resource=data:text/plain;base64,' . base64_encode($data));
echo $filteredData;
这个例子中,定义了一个自定义的过滤器 CustomFilter,它将输入数据转换为大写。

总体来说,php://filter 提供了一种灵活的方式来处理数据流,你可以根据具体需求选择合适的过滤器进行处理。

可能这道题目源码里面用到了file_get_contents 函数,这函数本身是用来读取文件内容的,它返回文件内容的原始字符串。它并不会解析文件内容,而是将文件的原始数据以字符串形式返回。
于是,套用了一下hello,会是什么样子的?
【第一章 web入门]afr_1 1】任意文件读取_第2张图片
进行base64解码:
【第一章 web入门]afr_1 1】任意文件读取_第3张图片
发现可以查看源码,这里就不限制我只能输入hello了,我估计是输出的时候过滤了什么。
【第一章 web入门]afr_1 1】任意文件读取_第4张图片
至于这里为什么测试flag,我也不知道,看网上说有这文件:
【第一章 web入门]afr_1 1】任意文件读取_第5张图片

得到flag:
【第一章 web入门]afr_1 1】任意文件读取_第6张图片
n1book{afr_1_solved}

这里提供一篇相关的文章:https://blog.csdn.net/qq_44418229/article/details/125197168

PS:
这样读取不到文件http://42ec0689-09ce-4ecf-8cef-b7e24fd95cfe.node5.buuoj.cn:81/?p=php://flag,但是这样就可以读取到文件了,http://42ec0689-09ce-4ecf-8cef-b7e24fd95cfe.node5.buuoj.cn:81/?p=php://filter/convert.base64-encode/resource=flag,说明什么?首先第一种写法就有问题,你最好理解理解原理再说吧。
我觉得这篇文章讲的很好,同一个例子:https://www.freebuf.com/articles/web/333519.html
https://segmentfault.com/a/1190000018991087也不错
好吧,伪协议这一块,我太弱了,下次出一片总结文章。

你可能感兴趣的:(CTF训练营,前端,任意文件读取,伪协议,ctf)