是否可以通过 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
我想更多地了解(道德)黑客,因为我是一名网络开发人员,有时我会担心我的应用程序的安全性。
有人曾经告诉我最好的学习方法是尝试自己破解真实的应用程序,所以我在我的本地主机上玩了一个例子。这是我前段时间构建的一个非常简单的应用程序,它有一个名为 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