【问题标题】:Is this script vulnerable to shell command bypass?这个脚本是否容易被 shell 命令绕过?
【发布时间】:2017-03-21 19:17:10
【问题描述】:

我正在使用此脚本从 Android 应用接收 base 64 编码图像。我想知道是否有任何方法可以绕过 POST 请求中的 PHP shell 命令并让它在服务器中工作,例如,发送命令 shell 编码和名称如“shell.php”、“shell.php%” 0删除0”。根据脚本,所有内容都将保存为 .png,所以我会说它是安全的,但也许我错了,脚本实际上容易受到 shell 命令上传的攻击。

<?php 
header('charset=utf-8');

if($_SERVER['REQUEST_METHOD'] == 'POST') {
    if(isset($_POST['image']) && isset($_POST['name'])) {
        $image = $_POST['image'];
        $name = $_POST['name'];
        file_put_contents("/var/www/html/admigas/android/uploads/$name".strval(date('_Ym')).".png",base64_decode($image));
        echo "Success";
    } else {
        echo "Wrong params";
    }
} else {
    echo "Nothing to do";
}

?>

【问题讨论】:

  • 您是说要发送要从应用程序运行的脚本的名称吗?如果是这样,请不要这样做。如果你真的想这样做,请确保你使用准备好的语句,很好地清理输入并且仍然不要这样做。

标签: php linux shell security file-upload


【解决方案1】:

那么,让我们一步一步地看一下代码。我的cmets前面是#:

<?php 
header('charset=utf-8');

if($_SERVER['REQUEST_METHOD'] == 'POST') {
    if(isset($_POST['image']) && isset($_POST['name'])) {
        # This is provided by the user:
        $image = $_POST['image'];
        # This is provided by the user:
        $name = $_POST['name'];
        # Where does $name come from? User input, of course!
        file_put_contents("/var/www/html/admigas/android/uploads/$name".strval(date('_Ym')).".png",base64_decode($image));
        echo "Success";
    } else {
        echo "Wrong params";
    }
} else {
    echo "Nothing to do";
}

因此,发送带有 base64 编码负载的 name=../../../../reverse-shell.php%00 将允许攻击者上传任意文件(在本例中为 PHP 代码),并可能在随后的 PHP 请求中执行它。

解决方案(以差异格式呈现):

-           $name = $_POST['name'];
+           $name = preg_replace('#[^A-Za-z0-9\-_]#', '', $_POST['name']);

您肯定希望删除任何非 URL 安全字符以防止攻击。你可能想totally rethink your strategy, of course

【讨论】:

  • 我已经使用这些参数向 Fiddler 发送了一个 POST 请求 name=reverse-shell.php%00&image=PD9waHAgDQplY2hvICJIZWxsbyI7DQo/Pg== 但我得到了响应:file_put_contents() 期望参数 1 是有效路径,第 8 行 C:\xampp\htdocs\prueba\index.php 中给出的字符串
  • 在不同版本的 PHP 和不同操作系统上处理 NUL 字节有些奇怪。一般来说,你应该假设它是易受攻击的,除非你确定它不是。
  • 还有:Apache mod_mime 和多个文件扩展名。
猜你喜欢
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 2021-12-12
  • 2014-12-13
  • 2015-11-01
相关资源
最近更新 更多