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

 

目录

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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构__顺序表

概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改 需要用到数组&#xff1a;数组的绝对优势&#xff1a;下标的随机访问&#xff08;因为物理空间连续&#xff09; a[i]等…

NatCross实现NASCAB云可云内网穿透指南

一、简介 1、NAS_CAB介绍 跨平台NAS软件,远程管理照片,影音和文件&#xff0c;无需专用设备,个人版永久免费。官网地址&#xff1a;https://www.nascab.cn/。 2、NatCross介绍 NatCross是内网穿透工具,也是免费的端口映射和DDNS动态域名解析软件。软件从2021年上线以来&…

10.枚举

1.背景及定义 枚举是在JDK1.5以后引入的。 主要用途是&#xff1a; 将一组常量组织起来&#xff0c; 在这之前表示一组常量通常使用定义常量的方式&#xff1a; public static final int RED 1; public static final int GREEN 2; public static final int BLACK 3; 但是…

2005-2023年各省国内生产总值指数分季度数据

2005-2023年各省国内生产总值指数分季度数据 1、时间&#xff1a;2005-2023年 2、来源&#xff1a;国家统计局、各省统计局 3、指标&#xff1a;地区生产总值指数(上年同期100)_累计值(%) 4、范围&#xff1a;31省 5、时间跨度&#xff1a;季度 6、缺失情况&#xff1a;无…

Redis 主从复制、哨兵模式、Cluster集群

目录 一、Redis 主从复制 1、主从复制介绍 2、主从复制的作用 3、主从复制流程&#xff1a; 4、搭建redis主从复制 4.1所有服务器搭建redis数据库 4.2修改Redis配置文件&#xff08;Master节点操作&#xff09; ​4.3修改Redis配置文件&#xff08;slave节点操作&#x…

【C++】详解 Unique 函数 (小白一看就懂!!!)

目录 一、前言 二、去重函数 Unique() ✨头文件 ✨用法与作用 ✨注意点 三、常考面试题 四、共勉 一、前言 经常刷算法题的朋友&#xff0c;肯定会经常看到题目中提到 去重 这样的字眼&#xff0c;或者需要我们通过 去重 来解题&#xff0c;由于之前对 去重 了解的不太清楚…

LinkedHashMap 集合源码分析

LinkedHashMap 集合源码分析 文章目录 LinkedHashMap 集合源码分析一、字段分析二、内部类分析三、构造方法分析四、内部方法分析五、总结 LinkedHashMap 是 HashMap 的子类&#xff0c;在 HashMap 的基础上维护了双向链表&#xff0c;保证了有序性。默认是不排序的&#xff0c…

JavaScript模块化开发的前世今生

一个兜兜转转&#xff0c;从“北深”回到三线城市的小码农&#xff0c;热爱生活&#xff0c;热爱技术&#xff0c;在这里和大家分享一个技术人员的点点滴滴。欢迎大家关注我的微信公众号&#xff1a;果冻想 前言 现代化的编程语言&#xff0c;基本都支持模块化的开发&#xff…

Transformer算法详解

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、文本输入人类理解 词向量&#xff08;E…

ICLR24_OUT-OF-DISTRIBUTION DETECTION WITH NEGATIVE PROMPTS

摘要 分布外检测&#xff08;OOD Detection&#xff09;的研究对于开放世界&#xff08;open-world&#xff09;学习非常重要。受大模型&#xff08;CLIP&#xff09;启发&#xff0c;部分工作匹配图像特征和提示来实现文本-图像特征之间的相似性。 现有工作难以处理具有与已…

Java常用API_System——常用方法及代码演示

1.System.exit(int status) 方法的形参int status为状态码&#xff0c;如果是0&#xff0c;说明虚拟机正常停止&#xff0c;如果非0&#xff0c;说明虚拟机非正常停止。需要将程序结束时可以调用这个方法 代码演示&#xff1a; public class Test {public static void main(S…

UVA156 反片语 解题报告

UVA156 反片语 解题报告 题目链接 https://vjudge.net/problem/UVA-156 题目大意 输入一些单词&#xff0c;找出所有满足如下条件的单词&#xff1a;该单词不能通过字母重排&#xff0c;得到输入文本中的另外一个单词。在判断是否满足条件时&#xff0c;字母不分大小写&…

浏览器禁用cookie后session还能用吗?

1.背景 最近有朋友问我其面试时遇到的一个不常见的问题&#xff1a;浏览器禁用cookie后session还能用吗&#xff1f;&#xff0c;怎么解答。 2.cookie与session联系入手 2.1 理论基础 一般默认情况下&#xff0c;在会话中&#xff0c;服务器存储 session 的 sessionid &…

第四百四十七回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 使用方法 3. 内容总结 我们在上一章回中介绍了"如何在页面上显示蒙板层"相关的内容&#xff0c;本章回中将介绍overlay_tooltip这个三方包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

AGI(通用人工智能Artificial General Intelligence)知识点

通用人工智能AGI知识点 AGI1. prompt提示工程是什么&#xff1f;2. 怎么构建prompt&#xff1f;3. Function Calling是什么&#xff1f;4. RAG是什么&#xff1f;构建 RAG 模型的步骤&#xff1a;RAG 的优势和应用场景&#xff1a; 5. 离线和在线的RAG怎么构建&#xff1f;5. 构…

【SCI绘图】【热力图系列2 R】多特征相关性分析热力图指定聚类 R

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【热力图系列2 R】多特征相关性分析热力图指定聚类 R 1.环境准备 library(gplots) library(RColorBrewer)2.数据读取 ###…

VUE实现增删改查功能

Vue 中实现增删改查功能 增删改查&#xff08;CRUD&#xff09;是 Web 应用程序中的基本操作&#xff0c;它可以让我们在数据库中创建、读取、更新和删除数据。在 Vue.js 中实现 CRUD 功能相对简单。 创建 创建新记录时&#xff0c;我们将使用 v-model 双向绑定数据并向服务…

python小项目——时钟模拟

钟表是一种计时的装置&#xff0c;也是计量和指示时间的精密仪器。钟表的样式千变万化&#xff0c;但是用来显示时间的表盘相差无几&#xff0c;大多数钟表表盘的样式由刻度&#xff08;共60个&#xff0c;围成圆形&#xff09;、指针&#xff08;时针、分针和秒针&#xff09;…

SpringBoot中这样用ObjectMapper,才够优雅!

目录 背景步骤在SpringBoot项目中要实现对象与Json字符串的互转&#xff0c;每次都需要像如下一样new 一个ObjectMapper对象&#xff1a;这样的代码到处可见&#xff0c;有问题吗&#xff1f;我们要使用jmh测试几种方式的区别&#xff1a;所以在我们真正使用的时候不要在方法中…

JavaScript 书写位置

JS 分为三种使用方法&#xff0c;分别为行内&#xff0c;内嵌&#xff0c;外部。 行内式&#xff08;不推荐使用&#xff09; 行内就是 将 JS 代码直接写在 HTML 标签上 &#xff0c;这种方式的结构、行为分离不够彻底&#xff0c;不利于后 期维护&#xff0c;复用性不强…