CTF训练之OneWayIn
字数 1308 2025-08-15 21:33:59

CTF训练之OneWayIn解题教学文档

题目概述

OneWayIn是一道Web类CTF题目,主要考察代码审计、函数缺陷利用、抓包修改、文件读取和编码解码等技能。题目通过一个登录界面引导解题者逐步发现漏洞并最终获取flag。

初始分析

  1. 访问实验环境:实验地址为10.1.1.82
  2. 查看网页源码:这是Web题的常规第一步

源码分析

源码中关键逻辑如下:

if(0_usename == 0_pwd) {
    f1();
} elseif (Crc32(0_usename) == Crc32(0_pwd)) {
    f2();
} else {
    f3();
}

条件分析

  1. 第一条件:当用户名和密码相同时,调用f1()
  2. 第二条件:当用户名和密码的CRC32校验值相同时,调用f2()
  3. 其他情况:调用f3()

关键漏洞

CRC32函数存在一个缺陷:当输入为数组时,CRC32函数会返回NULL。这意味着如果用户名和密码都是数组(即使内容不同),它们的CRC32值都会是NULL,从而满足第二个条件。

解题步骤详解

第一步:绕过CRC32检查

  1. 抓包修改:使用Burp Suite等工具拦截登录请求
  2. 修改参数为数组
    • 0_usename0_pwd参数改为数组形式
    • 例如:0_usename[]=a&0_pwd[]=b

第二步:分析响应

  1. 观察响应:会得到一些十六进制数据
  2. 注意URL变化:URL中会出现一个base64编码的参数
  3. 解码测试:解码后发现是test.txt,暗示文件读取功能

第三步:文件读取漏洞利用

  1. 尝试读取index.php
    • index.php进行base64编码
    • 替换URL中的文件参数
  2. 发现num参数
    • 观察到有num参数控制显示行数
    • num=1显示第一行代码,num=2显示第二行,以此类推
  3. 逐步获取完整源码
    • 通过修改num值获取index.php的全部源代码

第四步:代码审计

从获取的源码中发现:

  1. 访问flag.php的条件
    • 需要设置cookie:role_cookie=flagadmin
  2. 其他可能的限制条件(如果有)

第五步:获取flag.php内容

  1. 设置cookie
    • 在请求中添加Cookie: role_cookie=flagadmin
  2. 读取flag.php
    • 直接访问可能显示乱码
  3. 使用curl下载
    curl http://10.1.1.82/flag.php --cookie "role_cookie=flagadmin" -o flag.php
    
  4. 分析内容
    • 文件内容可能是base64编码
    • 进行base64解码获取flag

关键技术点总结

  1. CRC32函数缺陷利用

    • 对数组输入返回NULL
    • 使不同数组的CRC32值相同
  2. 文件读取技巧

    • 通过参数控制显示行数
    • 逐步获取完整源码
  3. 条件绕过

    • 通过设置特定cookie满足访问条件
  4. 编码处理

    • base64编码/解码
    • 十六进制数据处理

防御建议

  1. 避免使用松散比较(==),使用严格比较(===)
  2. 对函数输入进行类型检查
  3. 敏感文件访问增加多重验证
  4. 错误信息处理,避免泄露源码
  5. 关键操作使用token验证

扩展思考

  1. 其他可能存在的哈希碰撞:除了CRC32,其他哈希函数在特定条件下也可能产生碰撞
  2. 文件读取的其他利用方式:如目录遍历、PHP伪协议等
  3. 条件竞争的利用:如果有时间相关的检查

通过这道题目,可以系统性地学习Web安全中的多种漏洞利用技术,对提升CTF解题能力和实际安全审计都有很大帮助。

CTF训练之OneWayIn解题教学文档 题目概述 OneWayIn是一道Web类CTF题目,主要考察代码审计、函数缺陷利用、抓包修改、文件读取和编码解码等技能。题目通过一个登录界面引导解题者逐步发现漏洞并最终获取flag。 初始分析 访问实验环境 :实验地址为10.1.1.82 查看网页源码 :这是Web题的常规第一步 源码分析 源码中关键逻辑如下: 条件分析 第一条件 :当用户名和密码相同时,调用f1() 第二条件 :当用户名和密码的CRC32校验值相同时,调用f2() 其他情况 :调用f3() 关键漏洞 CRC32函数存在一个缺陷: 当输入为数组时,CRC32函数会返回NULL 。这意味着如果用户名和密码都是数组(即使内容不同),它们的CRC32值都会是NULL,从而满足第二个条件。 解题步骤详解 第一步:绕过CRC32检查 抓包修改 :使用Burp Suite等工具拦截登录请求 修改参数为数组 : 将 0_usename 和 0_pwd 参数改为数组形式 例如: 0_usename[]=a&0_pwd[]=b 第二步:分析响应 观察响应 :会得到一些十六进制数据 注意URL变化 :URL中会出现一个base64编码的参数 解码测试 :解码后发现是 test.txt ,暗示文件读取功能 第三步:文件读取漏洞利用 尝试读取index.php : 将 index.php 进行base64编码 替换URL中的文件参数 发现num参数 : 观察到有 num 参数控制显示行数 num=1 显示第一行代码, num=2 显示第二行,以此类推 逐步获取完整源码 : 通过修改num值获取index.php的全部源代码 第四步:代码审计 从获取的源码中发现: 访问flag.php的条件 : 需要设置cookie: role_cookie=flagadmin 其他可能的限制条件 (如果有) 第五步:获取flag.php内容 设置cookie : 在请求中添加 Cookie: role_cookie=flagadmin 读取flag.php : 直接访问可能显示乱码 使用curl下载 : 分析内容 : 文件内容可能是base64编码 进行base64解码获取flag 关键技术点总结 CRC32函数缺陷利用 : 对数组输入返回NULL 使不同数组的CRC32值相同 文件读取技巧 : 通过参数控制显示行数 逐步获取完整源码 条件绕过 : 通过设置特定cookie满足访问条件 编码处理 : base64编码/解码 十六进制数据处理 防御建议 避免使用松散比较 (==),使用严格比较(===) 对函数输入进行类型检查 敏感文件访问增加多重验证 错误信息处理 ,避免泄露源码 关键操作使用token验证 扩展思考 其他可能存在的哈希碰撞 :除了CRC32,其他哈希函数在特定条件下也可能产生碰撞 文件读取的其他利用方式 :如目录遍历、PHP伪协议等 条件竞争的利用 :如果有时间相关的检查 通过这道题目,可以系统性地学习Web安全中的多种漏洞利用技术,对提升CTF解题能力和实际安全审计都有很大帮助。