命令执行漏洞小结(上)

简介: 命令执行漏洞小结

0x01 漏洞原理

目标应用把用户的输入当做系统命令或者系统命令的一部分去执行,且应用没有正确的验证、过滤用户的输入,从而导致命令执行漏洞。

0x02 常见漏洞存在点

  1. 「使用用户提供的邮箱地址发送邮件的应用程序」
  2. 「服务器监控类型的应用,他们会返回系统的健康状况,这些健康状况都是通过执行系统命令取得的」
  3. 「使用第三方软件根据据用户提供的输入实时生成报告的应用程序」

0x03 漏洞利用

1、远程命令执行漏洞

1.1 利用系统函数实现远程命令执行

「在PHP下,允许命令执行的函数有:」

  • eval()
  • assert()
  • preg_replace()
  • call_user_func()

如果存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞

「eval()函数」

  • 定义和用法

eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

  • 语法

eval(phpcode) phpcode 必需。规定要计算的 PHP 代码。

  • 例子
<?php
$a = $_GET['a'];
eval($a);
?>

浏览器执行

http://127.0.0.1/oscommand/1.php?a=phpinfo();

640.png

image-20211216095104137

「assert()函数」

定义和用法

检查一个断言是否为 FALSE

语法

PHP 5 bool assert ( mixed description ] ) PHP 7 bool assert ( mixed exception ] ) assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动

例子

<?php
$a = $_GET['a'];
assert($a);
?>

浏览器执行

http://127.0.0.1/test/test.php?a=phpinfo();http://127.0.0.1/test/test.php?a=phpinfo()

640.png

image-20211216095811342

640.png

image-20211216095831786

「eval()和assert()区别」eval()函数正确执行需要满足php的代码规范,而assert()函数则不存在这个问题,对于php的代码规范要求不高

「preg_replace()函数」

  • 定义和语法 preg_replace 函数执行一个正则表达式的搜索和替换。
  • 语法 mixed preg_replace ( mixed replacement , mixed $subject [, int KaTeX parse error: Expected 'EOF', got '[' at position 12: limit = -1 \̲[̲, int &count ]] ) 搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。*
  • 参数说明:
  1. p a t t e r n : 要 搜 索 的 模 式 , 可 以 是 字 符 串 或 一 个 字 符 串 数 组 。当 pattern: 要搜索的模式,可以是字符串或一个字符串数组。当pattern:要搜索的模式,可以是字符串或一个字符串数组。当pattern处存在一个"/e"修饰符时,$replacement的值会被当成php代码来执行。
  2. $replacement: 用于替换的字符串或字符串数组。
  3. $subject: 要搜索替换的目标字符串或字符串数组。
  4. $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。默认是-1(无限制)。
  5. $count: 可选,为替换执行的次数。
  • 例子
<?php
$a = $_GET['a'];
echo preg_replace("/test/e", $a, "just test!")
?>
http://127.0.0.1/test/test.php?a=phpinfo()
http://127.0.0.1/test/test.php?a=phpinfo();

640.png

image-20211216100045884

640.png

image-20211216100104065

「注意」

在php5.4及以下版本中,preg_replace()可正常执行代码,而在php5.5及后续版本中会提醒"/e"修饰符已被弃用,要求用preg_replace_callback()函数来代替。

「call_user_func()函数」

  • 「定义和用法」call_user_func — 把第一个参数作为回调函数调用
  • 「语法」mixed call_user_func ( callable parameter [, mixed $… ]] ) 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

「例子」

<?php
call_user_func($_GET['a'],$_GET['b']);
?>

6911906b30d6a71362039d06cf94c56a.png

image-20211216102125344

「其他函数」

  • ob_start()、unserialize()、creat_function()
  • usort()、uasort()、uksort()
  • array_filter()
  • array_reduce()
  • array_map()

2、系统命令执行漏洞

若系统只允许执行特定的函数,比如只允许执行ping命令,可通过拼接绕过

2.1 php常见系统命令执行函数

  • system()
  • exec()
  • shell_exec()
  • passthru()
  • pcntl_exec()
  • popen()
  • proc_open()
  • 反引号
system函数

用于执行外部程序并显示输出

<?php system('whoami'); ?>

8658b62a170e3d6e3a4448469d5842e3.png

image-20211216103658807

exec函数

用于执行一个外部程序

<?php echo exec('whoami');?>

63c839dfcb91be5151d6e6ff132617d6.png

image-20211216104234914

执行时加上echo 才会输出whoami的结果

shell_exec函数

通过shell环境执行命令 且将完整的输出以字符串方式返回

<?php echo shell_exec('whoami');?>

fa0b3b67bb115839859b31a29f25bc82.png

image-20211216104413488

执行时加上echo 才会输出whoami的结果

反单引号

反单引号是php执行运算符 php将尝试将反单引号中的内容作为shell命令来执行 并将输出信息返回

<?php echo `whoami`;?>

3780e1ee69bf69b23a9aea6ef2d0c3e1.png

image-20211216105352842

2.2 Windows下的命令执行漏洞

Windows系统支持的管道符
| 命令连接符

如果前语句为假则直接报错,后边不执行 如果前语句为真,执行后边的语句

25c2189cb8a8b9d7d28d0ec299a95fc9.png

image-20211216110239864

||命令连接符

如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句

b55a2011691ff0283728aa6303dd9c38.png

image-20211216110216879

&命令连接符

&前面和后面命令都要执行,无论前面真假

6c8b77fbe46373b2aa21945f1886c2bc.png

image-20211216111446269

&&命令连接符

&&如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令

5a6ea6be2acf3a85b827017a35a61f25.png

image-20211216111723501

例:
<?php
header("Content-type:text/html;charset=utf-8");
  $ip=$_GET['ip'];
  system("ping ".$ip);
?>

正常输入?ip=127.0.0.1会返回ping的结果

2cc22d171b35a2828499d549c2f878fb.png

image-20211216110720924

输入?ip=127.0.0.1| whoami 会返回whoami的结果

b989b840f4b72e630575e797fb16797a.png

image-20211216111835472

2.3 Linux下的命令执行漏洞

|、||、&、&&这四种管道符都存在且用法和Windows系统下一样,多了一个;管道符,作用和&一样

<?php
$ip=$_GET['ip'] ;
system("ping -c 3".$ip);    
?>

代码调用system函数 输?ip=127.0.0.1;id成功执行 返回用户信息

2.4 有回显和无回显下的利用

有回显

这是最完美的情况下,可直接获取目标敏感信息

例如:

http://127.0.0.1/test/test.php?ip=127.0.0.1%20|%20type%20c:\windows\win.ini

57c13a4f64be2457e9e4ec4ebca73713.png

相关文章
|
2月前
|
SQL 安全 Linux
命令执行漏洞
命令执行漏洞
|
3月前
|
安全 Java PHP
Web安全-命令执行漏洞
Web安全-命令执行漏洞
39 2
|
4月前
|
Web App开发 安全 云计算
H3C任意命令执行漏洞
H3C任意命令执行漏洞
60 1
|
5月前
|
安全 Unix Shell
web安全之命令执行
应用未对用户输入做严格得检查过滤,导致用户输入得参数被当成命令来执行。
59 4
|
安全 Linux Windows
MS08-067 (CVE-2008-4250) 远程命令执行漏洞
本文为08年出现的漏洞进行复现,仅作为学习参考,切勿非法利用! MS08-067漏洞是通过MSRPC over SMB通道调用Server服务程序中的NetPathCanonicalize 函数时触发的,而NetPathCanonicalize 函数在远程访问其他主机时,会调用NetpwPathCanonicalize函数,对远程访问的路径进行规范化,而在NetpwPathCanonicalize函数中发生了栈缓冲区内存错误,造成可被利用实施远程代码执行。
307 1
|
安全 数据安全/隐私保护
亿邮电子邮件系统远程命令执行漏洞 漏洞复现
亿邮电子邮件系统远程命令执行漏洞 漏洞复现
760 0
|
安全 Linux Windows
WEB漏洞-RCE代码及命令执行漏洞
WEB漏洞-RCE代码及命令执行漏洞
|
存储 编解码 安全
|
安全 Linux API
Supervisord 远程命令执行漏洞(CVE-2017-11610)
Supervisord是一款Python开发,用于管理后台应用(服务)的工具,其角色类似于Linux自带的Systemd。
336 0
Supervisord 远程命令执行漏洞(CVE-2017-11610)
|
移动开发 安全 Oracle
Log4j2远程执行代码漏洞如何攻击? 又如何修复
Log4j2远程执行代码漏洞如何攻击? 又如何修复
750 0
Log4j2远程执行代码漏洞如何攻击? 又如何修复