ctf中sed替换内容的利用技巧
字数 1033 2025-08-22 12:23:24
CTF中sed替换内容的利用技巧
背景介绍
在CTF比赛中,我们经常会遇到需要利用sed命令进行内容替换的题目。这类题目通常提供一个文件读取和内容替换的功能,通过精心构造的输入可以实现命令注入或绕过限制。
题目分析
题目提供了一个Web界面,功能是:
- 读取一个文件
- 将文件中被
{}包裹的字符替换为用户输入的字符 - 显示替换后的结果
例如:nothing被替换成truncated
初始尝试:命令注入
最初尝试通过命令注入来获取系统权限,但发现以下问题:
- 无论怎样拼接命令都会出错
- Web前端可能对输入进行了过滤或限制
- 服务器端可能先检查路径存在性再执行sed
JavaScript代码分析
前端JavaScript代码主要功能:
- 监听输入框的回车事件
- 发送POST请求到服务器,包含文件名和匹配模式
- 处理服务器响应并显示结果
关键点:
- 使用
t变量防止短时间内多次触发 - 发送
pattern和file两个参数 - 根据返回的
exit状态码显示stdout或stderr
为什么命令注入失败
推测原因:
- 服务器可能先验证路径存在性再执行sed
- Web前端可能截断了异常输入
- 在Linux终端可以执行的注入在Web环境中可能失败
有效利用方法
方法1:使用空字符串替换
原理:
- 使用
\0作为替换内容,实际上不做任何改变 s/{.*}/\0/g命令中:{.*}匹配{}包裹的内容\0是未定义的捕获组,实际不改变内容
效果:
- sed会执行替换操作但内容保持不变
- 可以绕过某些替换限制
方法2:使用&作为替换部分
原理:
&代表匹配到的内容本身s/{.*}/&/g命令中:{.*}匹配{}包裹的内容&会被替换为匹配到的原始内容
效果:
- 内容实际上保持不变
- 可以绕过替换限制
高级利用技巧
- 多行匹配:使用
-z选项处理多行内容 - 引用捕获组:使用
\1,\2等引用特定捕获组 - 条件执行:结合
e标志执行匹配内容作为命令 - 文件写入:通过替换将内容写入新文件
防御措施
- 对用户输入进行严格过滤
- 使用最小权限执行sed
- 限制文件访问路径
- 禁用危险sed选项
总结
在CTF中利用sed替换功能的关键在于:
- 理解sed的替换模式和特殊字符
- 尝试绕过限制的多种方法
- 结合Web环境和Linux命令特性的差异
- 灵活运用sed的各种选项和标志位
通过掌握这些技巧,可以在类似题目中快速找到突破口,实现预期目标。