免责声明:这只是一个了解 PHP 代码注入的示例,而不是以任何方式使用的生产代码。我完全意识到这不是良好的编码实践。
我有以下 PHP 脚本:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Sample Script</title>
</head>
<body>
<h1>Sample page</h1>
<p>Now doing the maths. Please enter a formula to compute. Example: 1+1.</p>
<form method="get">
<p>Formula: <input type="text" name="maths" /></p>
<p><input type="submit" value="compute" /></p>
</form>
<?
if (( isset($_REQUEST["maths"])) && ($_REQUEST["maths"] != "") )
{
echo "<p>The result is: ";
eval("echo (".$_REQUEST["maths"].");");
echo "</p>";
}
?>
</body>
</html>
这个脚本很容易受到 PHP 代码注入的攻击,我可以通过它来破坏它(我主要是通过试验和错误发现的)。
$a='1');phpinfo();echo($a
但是,我不完全明白发生了什么。根据我的理解,我需要完成 echo 语句,插入我自己的代码(例如 phpinfo()),然后编写另一个函数(例如 echo)来处理右括号。
我认为这样的事情会起作用:
");phpinfo();echo("
但是,这不能作为注入使用,因为 phpinfo 被视为字符串的一部分并且不会由 eval 进行评估。 我也尝试过逃避引号,但无济于事。
问题:
$a='1');phpinfo();echo($a
有效?当您使用该输入时,替换变量的结果是:
eval("echo ($a='1');phpinfo();echo($a);");
因此,这会分配
$a='1'
,并回显该分配的结果(分配给 $a
的值)。然后它执行phpinfo()
。最后它再次回响$a
。
如果您尝试使用
);phpinfo();echo(
它不起作用,因为它尝试执行 echo ()
。但 echo
需要至少 1 个参数。