是否可以通过 URI 参数注入 PHP 代码?

Is it possible to inject PHP code via URI parameters?

我想更多地了解(道德)黑客,因为我是一名网络开发人员,有时我会担心我的应用程序的安全性。

有人曾经告诉我最好的学习方法是尝试自己破解真实的应用程序,所以我在我的本地主机上玩了一个例子。这是我前段时间构建的一个非常简单的应用程序,它有一个名为 api.php 的文件,内容如下:

<?php
header('Content-type: application/json;charset=UTF-8');

if (isset($_GET["api"]) and $_GET["api"] !== "") {

  if ($_GET["api"] === "posts") {

    $url = "https://api.third-party.com/posts?q=". rawurlencode($_GET["post_id"]);

  } else if ($_GET["api"] === "users") {

    $url = "https://api.third-party.com/users?q=". $_GET["user_id"];

  } else if ($_GET["api"] === "tags") {

    $url = "https://api.third-party.com/tags?q=". $_GET["tag_id"];

  }

  $json = exec("curl -X GET ".$url);
  echo $json;

}

?>

我试图使用 URI 参数注入一些 PHP 代码。像这样:

http://localhost:8888/test-app/api.php?api=users&user_id=5;print_r("success");}if(0){die();

我的想法是,当我的应用程序读取带有 user_id 参数的 PHP 代码时,它会执行如下操作:

<?php
header('Content-type: application/json;charset=UTF-8');

if (isset($_GET["api"]) and $_GET["api"] !== "") {

  if ($_GET["api"] === "posts") {

   $url = "https://api.third-party.com/posts?q=". rawurlencode($_GET["post_id"]);

 } else if ($_GET["api"] === "users") {

   $url = "https://api.third-party.com/user?q=". 5;

   print_r("success");

 }

 if(0){

   die();

 } else if ($_GET["api"] === "tags") {

   $url = "https://api.third-party.com/tags?q=". $_GET["tag_id"];

 }


  $json = exec("curl -X GET ".$url);
  echo $json;

}

?>

但它实际上不起作用。我得到的只是一个空白屏幕,这可能是回显空 $json 变量的结果。

这有可能吗?我还有一个通过 ajax 调用此脚本的表单,也可以尝试使用它。

exec("curl -X GET ".$url);

正在执行命令,而不是运行宁PHP。您的 shell 很可能没有 print_r 命令。你可以这样做:

http://localhost:8888/test-app/api.php?api=tags&tags=echo%20%22%3C?php%20print_r(\%22success\%22);%20?%3E%22%20|%20php

哪个会让你运行

echo "<?php print_r(\"success\"); ?>" | php