* r* A O; J7 M8 Z于是我们进行了多种尝试,利用这个软件其他的一些工具进行解码,结果一无所获,但是,后来我们决定修改参数,因为之前的配置是可以得出flag的,于是猜测要更改SPI的某个特殊点。 % g0 N. a2 ?- A. o4 R. g O% ]" A
更改SPI的某个特殊点后,进行一个对照,发现只有将setting中最后的一个参数,改成high值,原屏幕的右下角就出现了flag。2 v3 I' e1 @% V; q$ l
/ K) h: Z* D8 U ~7 \! P: qweb第一题 6 w j% @9 y* L; s( T6 e3 P' X$ `. W+ {. R3 W
Just so so4 g+ P# V, f* i
! ?% k- I' r7 x; k
开始时,用伪协议拿到源码,然后就是反序列化利用了1 M' x, U" B `% r/ W( F, \1 @1 D
) ]! F" H+ L+ S0 l* N# N" V; A* V$ Y
<?php index.php error_reporting(0); $file = $_GET["file"]; $payload = $_GET["payload"]; if(!isset($file)){ echo 'Missing parameter'.' ! }7 ~# R" u0 a. Z'; } if(preg_match("/flag/",$file)){ die('hack attacked!!!'); } @include($file); if(isset($payload)){ $url = parse_url($_SERVER['REQUEST_URI']); parse_str($url['query'],$query); foreach($query as $value){ if (preg_match("/flag/",$value)) { die('stop hacking!'); exit(); } } $payload = unserialize($payload); }else{ echo "Missing parameters"; } ?> hint.php <?php class Handle{ private $handle; public function __wakeup(){ foreach(get_object_vars($this) as $k => $v) { $this->$k = null; } echo "Waking up\n"; } public function __construct($handle) { $this->handle = $handle; } public function __destruct(){ $this->handle->getFlag(); } } # |' A* p) P# R' R. Aclass Flag{ + I' U9 A( H# F$ ?0 Tpublic $file; / I0 [/ _1 a! }public $token; # Z( R* E% F1 p, u4 E! Lpublic $token_flag; . x' g# T, y1 o3 k" s: N3 c( w# }4 ?5 O: O& G
function __construct($file){ - }% b+ N! E+ P0 k9 Z" u $this->file = $file;- f9 g; _; t% y: @9 U
$this->token_flag = $this->token = md5(rand(1,10000));! `) `0 z" k1 r% x
} * j! U0 {# v4 Z+ ?1 n ; b$ h6 W( g8 _( \& ]* hpublic function getFlag(){% |3 h6 T' r; o. {$ ?6 B1 Z
$this->token_flag = md5(rand(1,10000));8 e: f5 l8 Z' k1 G8 M3 T) @( D: f6 p
if($this->token === $this->token_flag)5 p6 t% g, Q. Z0 _" A
{ 6 \8 `- e: E; g$ e: r+ O if(isset($this->file)){ ) Z+ I3 v7 M2 D" b5 t7 W( W echo @highlight_file($this->file,true); 2 `1 _4 J& } _- D } % P1 a% X; l3 O4 h% s+ { } , Y! l7 j: H b8 M' _, W6 U} 1 q# J. a1 C! m% q$ p5 F# V% }1 * Y7 ?" ]( ]4 f+ a20 e. s0 E) z. s" f5 X1 M6 ^
3 `" o0 l& A5 \
4 9 K: S' [' U4 S5 . w* t6 y* \8 D/ V/ j9 x; n* x" t6 " L) D- H" u5 ? F- @6 b% [+ V7( J o( [9 z/ ?* {, G
8 $ S- f0 L6 C2 P: q7 G* z- z% [5 L/ R$ Y96 u* ?1 d4 [2 t/ K! u# \% N6 G
10 # R4 c) _( E- ^4 w; Q; K1 a, `11/ @/ [1 {$ B f, ^# U, a
12* i/ m' N8 l. {& ?; O7 g6 I
13 ) x( F* F6 _, A% y14 z# _9 m& ]7 D) p4 {% x0 t}. O' b7 H/ U# m" ]) {
?>; |) N# F! A- n1 A
大佬说: 可以看到Handle类有个__destruct函数,该函数可以触发getFlag函数,但是__wakeup函数会将所有东西清空,这里改下属性个数就能绕过,参考SugerCRM漏洞,然后getFlag函数的条件可以用指针绕过,以前安恒的月赛也考过,最后flag的匹配可以利用parse_url漏洞,三个斜杠就能绕过了# K4 c8 J6 g4 e( F
exp/ @% Q0 V( B B# ~! `: s
$ C# x; N1 S! ]View Code: a7 q$ j0 E7 l- p6 B7 c
) s- m/ x( Q0 h; ?* i( v. d% S
4 \" X# E4 v: K: {: }0 V0 J* L