文件包含 Writeup
1 | if (isset($_GET['file'])) { |
分析代码,要求参数中不能有flag字样,考虑绕过。但是,shell.txt文件中出现一句话木马,<?php eval($_REQUEST['ctfhub']);?>是一个密码为ctfhub的一句话木马,用蚁剑,连接成功
右键打开虚拟终端,在文件中查找flag,用cat /flag,得flag为ctfhub{7c63a9dfbcf853e1dff7dceb}

二、php://input
考点:php伪协议,include函数,
常用到伪协议的php://input和php://filter,本题是前者
(substr函数,是指文件开头前六位必须是“php://input”)
php://input伪协议:(利用php://input执行代码:)
如果allow_url_include开启,可通过php://input接收 POST 数据并作为 PHP 代码执行:
- GET 参数:
?file=php://input - POST 数据:
<?php system('。。。。。。'); ?>
在phpinfo文件中显示,allow_url_include是on的状态,说明可用。
bp抓包,改参。直接cat查找flag不行,就从目录开始找(ls)
找到flag_17093,cat打开文件,得flag:ctfhub{da8496ee7b7500f5de84d6d0}
三、读取源代码
考点:include函数,php://filter伪协议,filter过滤器
1 | if (isset($_GET['file'])) { |
php://filter伪协议
可以作为一个中间流来处理其他流,具有四个参数:
| 名称 | 描述 | 备注 |
|---|---|---|
| resource=<要过滤的数据流> | 指定了你要筛选过滤的数据流。 | 必选 |
| read=<读链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符|分隔。 | |
| write=<写链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符分隔。 | |
| <;两个链的筛选列表> | 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。 |
php://filter 的基本使用格式如下:
1 | php://filter/[过滤链]/resource=[目标文件] |
过滤链:由一个或多个过滤器组成,用管道符
|分隔,按顺序执行。resource:指定要处理的目标文件路径(必填参数)。
(还有的题不能直接出flag,需要base64输出/?file=php://filter/read=convert.base64-encode/resource=/flag)
bp抓包,改GET参数?file=php://filter/resource=/flag,得到flag:ctfhub{62d946f14b1617aebd65d23e}

四、远程包含
分析代码,要求参数不能有flag,发现phpinfo中,allow_url_include是on,所以考虑使用php://input伪协议
bp抓包,步骤同上,得flag:ctfhub{8624a4d165a9dc546083cbe6}