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

时间:2017-11-28 19:33:42

标签: php code-injection

我想了解更多关于(道德)黑客攻击的事情,因为我是一名网络开发者,有时候我担心我的应用程序的安全性。

有人告诉我,一旦最好的学习方法是尝试自己破解真正的应用程序,所以我在我的localhost上玩一个例子。这是我前段时间构建的一个非常简单的应用程序,它有一个名为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调用此脚本的表单,也可以尝试使用它。

1 个答案:

答案 0 :(得分:2)

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