XYCTF-web个人wp
字数 1382 2025-08-29 22:41:01

XYCTF Web题目个人解题思路详解

ez_puzzle 题目解析

解题步骤:

  1. 分析游戏机制,发现通关后会弹出alert窗口
  2. 搜索源码中的alert代码,发现存在两个alert
  3. 通过测试确认第一个alert是成功flag,第二个是失败提示
  4. 下载源码并修改alert判断条件(将小于号改为大于号)
  5. 重新通关游戏获取flag

关键点:

  • 通过源码分析确定关键alert位置
  • 修改判断条件绕过游戏逻辑

ezsql SQL注入题目

漏洞发现:

  • 在登录处存在SQL注入漏洞
  • 过滤了空格和逗号等关键字符

绕过技术:

  1. 使用括号代替空格:(select(1))
  2. 盲注技术替代逗号限制
  3. 构造时间盲注payload:当条件成立时会延时1秒

获取凭证:

  1. 通过脚本爆破获取:
    • double_check值:dtfrtkcc0czkoua9S
    • 账号:yudeyoushang
    • 密码:zhonghengyisheng

后续利用:

  • 登录后存在无回显命令执行
  • 绕过过滤:
    • 使用$IFS$9代替空格
    • 使用反斜杠绕过关键词过滤
    • 直接写入webshell

Signin 反序列化漏洞

漏洞分析:

  • 使用pickle.loads进行反序列化
  • ser_cookie使用pickle.dumps序列化

利用步骤:

  1. 通过/download路径实现目录穿越读取key
    • 使用路径:./.././../
  2. 获取key后构造恶意pickle序列化数据
  3. 生成恶意cookie实现RCE
  4. 打入内存马

Now you see me 1 (SSTI)

漏洞利用:

  1. 使用#}{#闭合{##}
  2. 使用{%%}绕过{{}}
  3. 利用未被过滤的request类

绕过技术:

  • 使用5个可控的请求头绕过限制
  • 使用传统SSTI继承链绕过os.system过滤:
    ''.__class__.__base__.__subclasses__()[137].__init__.__globals__['popen']("dd if=/flag_h3r3 bs=1 skip=10000000 count=20000000 2>/dev/null|base64").read()
    

Now you see me 2 (进阶SSTI)

新增限制:

  • 禁用了更多request类下的属性

绕过方法:

  1. 利用未被过滤的range功能
  2. 通过Range头配合jinja2的String和random过滤器获取单个字符
  3. 使用config作为中间变量存储获取的字符
    • 赋值语句:{%set%0Aa=config%}(用换行符代替空格)
  4. 逐步构建request.args访问路径

回显方法:

  • 由于无回显且路由检测严格,使用请求头回显数据

出题人已疯 (长度受限SSTI)

限制条件:

  • SSTI但限制了长度
  • 禁用了open等关键函数

解决方案:

  1. 尝试使用rebaseinclude模板函数进行文件读取(受限)
  2. 利用__builtins__进行变量赋值(Bottle框架特性)
    • 赋值示例:{% __builtins__.__dict__.__setitem__('xy',1) %}
  3. 通过分段赋值构造open函数:
    • 逐步构建open功能
    • 也可以构造完整RCE链

关键点:

  • Bottle框架模板环境直接关联__builtins__
  • 通过分段赋值绕过长度限制

总结

这些题目涵盖了多种Web安全技术:

  1. 前端游戏逻辑绕过
  2. SQL注入与过滤绕过
  3. 反序列化漏洞利用
  4. SSTI模板注入及各种绕过技术
  5. 受限环境下的代码执行

每种技术都展示了不同的绕过思路和利用方法,对于理解Web安全漏洞的本质和防御方法有很好的参考价值。

XYCTF Web题目个人解题思路详解 ez_ puzzle 题目解析 解题步骤: 分析游戏机制,发现通关后会弹出alert窗口 搜索源码中的alert代码,发现存在两个alert 通过测试确认第一个alert是成功flag,第二个是失败提示 下载源码并修改alert判断条件(将小于号改为大于号) 重新通关游戏获取flag 关键点: 通过源码分析确定关键alert位置 修改判断条件绕过游戏逻辑 ezsql SQL注入题目 漏洞发现: 在登录处存在SQL注入漏洞 过滤了空格和逗号等关键字符 绕过技术: 使用括号代替空格: (select(1)) 盲注技术替代逗号限制 构造时间盲注payload: 当条件成立时会延时1秒 获取凭证: 通过脚本爆破获取: double_ check值: dtfrtkcc0czkoua9S 账号: yudeyoushang 密码: zhonghengyisheng 后续利用: 登录后存在无回显命令执行 绕过过滤: 使用 $IFS$9 代替空格 使用反斜杠绕过关键词过滤 直接写入webshell Signin 反序列化漏洞 漏洞分析: 使用 pickle.loads 进行反序列化 ser_cookie 使用 pickle.dumps 序列化 利用步骤: 通过 /download 路径实现目录穿越读取key 使用路径: ./.././../ 获取key后构造恶意pickle序列化数据 生成恶意cookie实现RCE 打入内存马 Now you see me 1 (SSTI) 漏洞利用: 使用 #}{# 闭合 {##} 使用 {%%} 绕过 {{}} 利用未被过滤的request类 绕过技术: 使用5个可控的请求头绕过限制 使用传统SSTI继承链绕过 os.system 过滤: Now you see me 2 (进阶SSTI) 新增限制: 禁用了更多request类下的属性 绕过方法: 利用未被过滤的 range 功能 通过 Range 头配合jinja2的String和random过滤器获取单个字符 使用 config 作为中间变量存储获取的字符 赋值语句: {%set%0Aa=config%} (用换行符代替空格) 逐步构建 request.args 访问路径 回显方法: 由于无回显且路由检测严格,使用请求头回显数据 出题人已疯 (长度受限SSTI) 限制条件: SSTI但限制了长度 禁用了open等关键函数 解决方案: 尝试使用 rebase 或 include 模板函数进行文件读取(受限) 利用 __builtins__ 进行变量赋值(Bottle框架特性) 赋值示例: {% __builtins__.__dict__.__setitem__('xy',1) %} 通过分段赋值构造open函数: 逐步构建open功能 也可以构造完整RCE链 关键点: Bottle框架模板环境直接关联 __builtins__ 通过分段赋值绕过长度限制 总结 这些题目涵盖了多种Web安全技术: 前端游戏逻辑绕过 SQL注入与过滤绕过 反序列化漏洞利用 SSTI模板注入及各种绕过技术 受限环境下的代码执行 每种技术都展示了不同的绕过思路和利用方法,对于理解Web安全漏洞的本质和防御方法有很好的参考价值。