CTF训练之OneWayIn
字数 1308 2025-08-15 21:33:59
CTF训练之OneWayIn解题教学文档
题目概述
OneWayIn是一道Web类CTF题目,主要考察代码审计、函数缺陷利用、抓包修改、文件读取和编码解码等技能。题目通过一个登录界面引导解题者逐步发现漏洞并最终获取flag。
初始分析
- 访问实验环境:实验地址为10.1.1.82
- 查看网页源码:这是Web题的常规第一步
源码分析
源码中关键逻辑如下:
if(0_usename == 0_pwd) {
f1();
} elseif (Crc32(0_usename) == Crc32(0_pwd)) {
f2();
} else {
f3();
}
条件分析
- 第一条件:当用户名和密码相同时,调用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
- 需要设置cookie:
- 其他可能的限制条件(如果有)
第五步:获取flag.php内容
- 设置cookie:
- 在请求中添加
Cookie: role_cookie=flagadmin
- 在请求中添加
- 读取flag.php:
- 直接访问可能显示乱码
- 使用curl下载:
curl http://10.1.1.82/flag.php --cookie "role_cookie=flagadmin" -o flag.php - 分析内容:
- 文件内容可能是base64编码
- 进行base64解码获取flag
关键技术点总结
-
CRC32函数缺陷利用:
- 对数组输入返回NULL
- 使不同数组的CRC32值相同
-
文件读取技巧:
- 通过参数控制显示行数
- 逐步获取完整源码
-
条件绕过:
- 通过设置特定cookie满足访问条件
-
编码处理:
- base64编码/解码
- 十六进制数据处理
防御建议
- 避免使用松散比较(==),使用严格比较(===)
- 对函数输入进行类型检查
- 敏感文件访问增加多重验证
- 错误信息处理,避免泄露源码
- 关键操作使用token验证
扩展思考
- 其他可能存在的哈希碰撞:除了CRC32,其他哈希函数在特定条件下也可能产生碰撞
- 文件读取的其他利用方式:如目录遍历、PHP伪协议等
- 条件竞争的利用:如果有时间相关的检查
通过这道题目,可以系统性地学习Web安全中的多种漏洞利用技术,对提升CTF解题能力和实际安全审计都有很大帮助。