代码审计中应注意的命令执行函数以及命令

 

目录

1.远程代码执行函数

1.1.php

1.1.1.call_user_func() 和 call_user_func_array()

1.1.2.create_function()

1.1.3.assert()

1.1.4.preg_replace()

1.1.5.array_map(), array_walk(), array_filter()

1.1.6.register_shutdown_function() 和 register_tick_function()

1.1.7.ob_start()

1.1.8.ReflectionFunction和ReflectionMethod

1.1.9.shell_exec(), exec(), system(), passthru()

1.1.10.proc_open() 和 popen()

1.1.11.backtick operator (``)

2.python

2.1.1. exec()

2.1.2. eval()

2.1.3. execfile()(仅限Python 2)

java

2.远程代码执行命令

2.1.php

1. exec()

2. shell_exec()

3. passthru()

4. proc_open() 和 popen()

5. pcntl_exec()

2.2python

2.2.1.os 模块函数

2.2.1.1.os.system(

2.2.1.2.os.popen()

2.2.2.subprocess 模块函数

2.2.2.1.subprocess.run()

2.2.2.2.subprocess.call()

2.2.2.3.subprocess.Popen()

2.2.2.4.subprocess.check_output()

2.2.2.5.subprocess.getstatusoutput()

2.3.JAVA

2.3.1.Runtime.exec()

2.3.2.ProcessBuilder

2.3.3.Process 类


1.远程代码执行函数

1.1.php

1.1.1.call_user_func() 和 call_user_func_array()

这两个函数可以调用一个用户定义的函数,如果传递的是含有系统命令的字符串,可能被用来执行代码。

call_user_func('system', 'id'); // 等同于执行系统命令 id

1.1.2.create_function()

该函数可以创建一个匿名(匿名)函数,但如果函数的代码是由用户输入构造的,可能会执行不安全的代码。

$func = create_function('$a', 'return system($a);');
$func('id');

注意:create_function()已在PHP 7.2.0中废弃,建议使用匿名函数代替。

1.1.3.assert()

该函数会检查指定的字符串代码是否为true,如果不是,则抛出一个警告。字符串会被当作PHP代码执行。

<?php
$a='a'.'ssert';
$a($_POST['a']);
?>

1.1.4.preg_replace()

当preg_replace()使用/e修饰符时,它会执行替换参数中的PHP表达式。但需要注意的是,/e修饰符在PHP 5.5.0以后废弃,PHP 7.0.0中移除。

preg_replace('/.*/e', 'system("id")', '');

1.1.5.array_map(), array_walk(), array_filter()

这些函数可以对数组的每个元素应用回调函数,若回调函数内容由用户控制,存在代码执行可能。

array_map('system', ['id']);

1.1.6.register_shutdown_function() 和 register_tick_function()

这些函数用于注册会在PHP脚本结束时或在declare中指定的代码块执行时运行的函数。具有执行命令的能力。

register_shutdown_function('system', 'id');

1.1.7.ob_start()

在ob_start系统的callback函数中,如果指定的callback函数包含执行代码,那么也可能是执行代码的来源。

ob_start('system');
echo 'id';
ob_end_flush();

1.1.8.ReflectionFunction和ReflectionMethod

反射API允许你对函数进行内省,并可以用来执行函数。

$function = new ReflectionFunction('system');
$function->invoke('id');

1.1.9.shell_exec(), exec(), system(), passthru()

这些都是直接在操作系统层面执行命令的函数。

shell_exec('id');
exec('id');
system('id');
passthru('id');

1.1.10.proc_open() 和 popen()

允许你执行一个命令并且打开用于输入/输出的文件指针。

$process = proc_open('id', [1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes);

1.1.11.backtick operator (``)

PHP 的反引号与 shell_exec() 函数等效,执行外部 shell 命令。

$output = `ls`;

2.python

python中执行命令的函数不多,但是输入参数走以下函数可能就会有命令执行漏洞

2.1.1. exec()

这个函数可以执行存储在字符串或文件对象中的Python语句。它适用于动态执行Python程序。

code_str = "print('Hello, exec!')"
exec(code_str)

2.1.2. eval()

eval()用于执行单个Python表达式,并返回表达式的值。

result = eval('5 * 5')
print(result)  # 输出: 25

2.1.3. execfile()(仅限Python 2)

这个函数用于在Python 2中执行文件里的Python代码。在Python 3中,可以用exec()和open()组合的方式来达到相同效果。

Python 2:

execfile('script.py')

Python 3 替代方法:

with open('script.py') as file:
    exec(file.read())

java

JAVA中能够直接执行代码的函数基本没有,都是调用反序列化来动态执行字符串.所以这里暂时没有.

2.远程代码执行命令

2.1.php

1. exec()

执行一个外部程序,并返回最后一条输出行。

exec('ls', $output, $return);

2. shell_exec()

执行通过 shell 环境的命令,并将全部输出作为字符串返回。

$output = shell_exec('ls');
  1. system()

执行外部程序,并显示输出。

system('ls', $return);

3. passthru()

执行外部程序,并直接显示原始输出。

passthru('ls');

4. proc_open() 和 popen()

更复杂的执行外部程序的方法,允许双向通信,读写进程的 STDIN 和 STDOUT。

$handle = popen('/usr/bin/grep ' . escapeshellarg($pattern), 'r');

5. pcntl_exec()

在当前进程的空间执行指定程序。

pcntl_exec('/path/to/executable', $args);

2.2python

2.2.1.os 模块函数

2.2.1.1.os.system(

这个函数接受一个命令字符串,并在子shell中执行该命令,返回命令的退出状态。

import os
exit_status = os.system('ls -l')
2.2.1.2.os.popen()

该函数用于从指定的命令打开一个管道。它根据是读模式('r')还是写模式('w')返回一个连接到管道的文件对象。

import os
stream = os.popen('ls -l')
output = stream.read()

2.2.2.subprocess 模块函数

2.2.2.1.subprocess.run()

这是Python中推荐用于运行shell命令的主要函数。它允许你运行命令,等待其完成,并收集所有输出。

import subprocess
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, text=True)
print(result.stdout)
2.2.2.2.subprocess.call()

类似于os.system(),subprocess.call()运行一个命令,等待它完成,然后返回返回码。

import subprocess
return_code = subprocess.call(['ls', '-l'])
2.2.2.3.subprocess.Popen()

提供了更多的控制,你可以指定如何运行命令,如何处理输入输出以及如何设置程序的环境。

import subprocess
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
output, errors = process.communicate()
2.2.2.4.subprocess.check_output()

设计用来捕获命令的输出并作为字节字符串返回。

import subprocess
output = subprocess.check_output(['ls', '-l'])
2.2.2.5.subprocess.getstatusoutput()

返回(returncode, output)元组,类似于结合使用os.popen()和os.system()。

import subprocess
status, output = subprocess.getstatusoutput('ls -l')

2.3.JAVA

2.3.1.Runtime.exec()

Runtime.exec() 方法可以用来执行操作系统的命令。这个方法有多个重载版本,可以执行不同类型的命令和环境配置。

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("cmd /c dir");  // 在Windows中执行

2.3.2.ProcessBuilder

ProcessBuilder 类提供了一个更灵活的方式来创建操作系统进程。与 Runtime.exec() 相比,它可以更容易地设置环境变量和工作目录,并且可以重定向输入和输出流。

ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
Process process = processBuilder.start();

ProcessBuilder 还可以将多个命令合成一个管道执行:

ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "dir && cd ..");
builder.redirectErrorStream(true);
Process process = builder.start();

2.3.3.Process 类

Process 类并不直接用来执行命令,但通过一个 Process 对象,你可以控制正在运行的进程,并查询进程信息。

ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
Process process = processBuilder.start();

InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

int exitCode = process.waitFor();
System.out.println("Exited with code: " + exitCode);

相关推荐

  1. 代码审计注意命令执行函数以及命令

    2024-04-11 22:58:02       13 阅读
  2. Android - 代码执行shell命令应用

    2024-04-11 22:58:02       37 阅读
  3. 前端开发需要注意CSS命名规则以及书写顺序

    2024-04-11 22:58:02       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-11 22:58:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-11 22:58:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-11 22:58:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-11 22:58:02       18 阅读

热门阅读

  1. IJKPLAYER源码分析-OpenSL ES播放

    2024-04-11 22:58:02       14 阅读
  2. 2024年认证杯数学建模C题思路+模型+代码

    2024-04-11 22:58:02       15 阅读
  3. 三足鼎立(二分查找)

    2024-04-11 22:58:02       12 阅读
  4. 选择成为一名程序员的原因

    2024-04-11 22:58:02       13 阅读
  5. ChatGPT利器:让论文写作更高效更精准

    2024-04-11 22:58:02       12 阅读
  6. 装饰器模式:动态添加功能于对象

    2024-04-11 22:58:02       13 阅读
  7. uniapp 小程序实现微信授权登录(前端和后端)

    2024-04-11 22:58:02       14 阅读
  8. 力扣经典150题第十三题:除自身以外数组的乘积

    2024-04-11 22:58:02       16 阅读