【问题标题】:Security vulnerability with exec(), shell_exec(), curl_exec()exec()、shell_exec()、curl_exec() 的安全漏洞
【发布时间】:2012-12-01 15:06:23
【问题描述】:

有时,我会使用 exec()、shell_exec() 和 curl_exec()。以下是典型用途。假设我在其中有一个 PHP 变量(即第一个变量中的 $html),用户就有可能修改其内容。

从安全漏洞的角度来看,我应该关注什么? escapeshellcmd() 和 escapeshellarg() 是答案吗?如果是,应该在哪里使用?

$cmd='echo "html + '.$html.'" | htmldoc --format pdf > '.$filename;
$cmd='/usr/bin/convert '.$docs.' '.$filename;
$cmd='HOME='.$dir.'; /usr/bin/libreoffice3.5 --headless -convert-to pdf --outdir '.$dir.' '.$file_org;
$cmd='wget -O '.$file_org.' "'.$url.'"';
$cmd='/opt/wkhtmltopdf/bin/wkhtmltopdf "'.$url.'" '.$paramaters;
$cmd='/usr/bin/php -q '.$worker.' '.$session_id.' >/dev/null &';
exec($cmd);

$cmd='sendfax -n -m -w -i '.$id.' -o JohnDoe -D -S "hello@gmail.net" -s "us-leg" -f "'.$from.'" -d "'.$to.'" '.$doc_list;
$cmd = "faxstat -s | grep \"^$jid \"";
$output = shell_exec($cmd);

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_USERAGENT, $_GET['user_agent'] ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT'] );
curl_setopt($ch,CURLOPT_POSTFIELDS,array('aaa'=>$aaa,'bbb'=>$bbb));
$result = curl_exec($ch);

【问题讨论】:

  • 在php代码中命名临时文件,不允许用户命名文件,不使用wget拉文件,使用libcurl,
  • 使用 libcurl 代替 wget?
  • 我想知道如果用户将$html 设置为"; rm -rf /; echo "foo" 会发生什么。
  • @user1032531 你想知道什么?你不能使用 curl 下载文件?
  • @JonasWielicki。我尝试了以下方法,但没有创建目录。 $cmd="echo \"

    你好; mkdir /tmp/测试/; echo \"foo\"

    \" | htmldoc --format pdf > /tmp/new.pdf"

标签: php security shell curl shell-exec


【解决方案1】:

如果您没有正确验证和/或转义输入值,任何人都可以代表运行 PHP 的用户在您的系统上执行任意命令。

对于命令参数,有escapeshellarg。确保您转义整个参数值,例如:

$cmd='echo '.escapeshellarg('html + '.$html).' | htmldoc --format pdf > '.escapeshellarg($filename);
$cmd='/usr/bin/convert '.escapeshellarg($docs).' '.escapeshellarg($filename);
// […]
$cmd='sendfax -n -m -w -i '.escapeshellarg($id).' -o JohnDoe -D -S "hello@gmail.net" -s "us-leg" -f '.escapeshellarg($from).' -d '.escapeshellarg($to).' '.escapeshellarg($doc_list);

【讨论】:

  • 谢谢秋葵。是否会使用 escapeshellcmd() 来转义诸如“echo”或“sendfax”之类的东西(假设它们是变量,为什么我不知道为什么要这样做)?这是否适用于所有三个 exec()、shell_exec() 和 curl_exec()?
  • 另外你应该知道,如果用户可以控制文件名,他可能只是覆盖你的一些脚本或 PHP 用户可写的所有其他内容。
  • @user1032531 手册页仅列出了execsystem 和反引号运算符。由于shell_exec 与反引号运算符相同,因此将其用于该功能也是安全的。但curl_exec 与这些不同,因为它不执行系统命令。你使用它的方式应该是安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2017-02-28
相关资源
最近更新 更多