122 lines
3.2 KiB
Markdown
122 lines
3.2 KiB
Markdown
### 代码执行、命令执行的函数有哪些
|
|
|
|
**PHP**
|
|
|
|
在 PHP 中,有很多函数可以执行系统命令或代码。它们是 PHP 漏洞利用中最常见的攻击入口
|
|
|
|
**命令执行函数**
|
|
|
|
- `exec()`: 执行一个外部程序,不返回输出结果,通常需要使用参数获取
|
|
|
|
```php
|
|
exec('whoami', $output);
|
|
print_r($output);
|
|
```
|
|
|
|
- `passthru()`: 直接将命令的输出传递到浏览器
|
|
|
|
```php
|
|
passthru('ls -la');
|
|
```
|
|
|
|
- `shell_exec()`: 通过 shell 执行命令,并将整个输出结果作为字符串返回
|
|
|
|
```php
|
|
$output = shell_exec('id');
|
|
echo $output;
|
|
```
|
|
|
|
- `system()`: 执行外部程序并显示输出
|
|
|
|
```php
|
|
system('netstat -an');
|
|
```
|
|
|
|
- `popen()` 和 `proc_open()`: 都可以打开一个进程文件指针,允许对进程进行双向 I/O 操作
|
|
|
|
```
|
|
$handle = popen('ls', 'r');
|
|
```
|
|
|
|
- `pcntl_exec()`: 在 PHP CLI 环境中,用新的程序替换当前进程
|
|
|
|
**代码执行函数**
|
|
|
|
- `eval()`: 将字符串作为 PHP 代码来执行。这是最常见的代码执行漏洞函数
|
|
|
|
```php
|
|
$code = $_GET['code'];
|
|
eval($code);
|
|
```
|
|
|
|
- `assert()`: 在 PHP 7.2 之前,`assert()` 函数可以执行字符串参数
|
|
|
|
```php
|
|
assert($_POST['pass']);
|
|
```
|
|
|
|
- `create_function()`: 用于创建一个匿名函数
|
|
|
|
```php
|
|
$func = create_function('', 'return ' . $_GET['pass'] . ';');
|
|
$func();
|
|
```
|
|
|
|
- `call_user_func()` 和 `call_user_func_array()`: 调用一个用户函数,如果参数是用户可控的,可以用来执行任意函数
|
|
|
|
- `array_map()`: 将回调函数作用到给定数组的每个元素上
|
|
|
|
- `unserialize()`: 反序列化函数,如果序列化数据中包含一个恶意对象,可以导致对象注入,从而触发魔术方法(如 `__destruct()`),最终实现代码执行
|
|
|
|
**Python**
|
|
|
|
Python 的 Web 应用中也经常出现类似的问题
|
|
|
|
**命令执行函数**
|
|
|
|
- `os.system()`: 执行 shell 命令
|
|
|
|
- `os.popen()`: 执行 shell 命令,并返回一个文件对象
|
|
|
|
- `subprocess` 模块: 这是更安全、更现代的模块,但如果参数处理不当,同样会造成命令注入
|
|
|
|
```python
|
|
import subprocess
|
|
cmd = 'ls ' + user_input
|
|
subprocess.call(cmd, shell=True) # 当 shell=True 时,可能存在命令注入
|
|
```
|
|
|
|
**代码执行函数**
|
|
|
|
- `eval()`: 将字符串作为表达式来执行
|
|
|
|
```python
|
|
result = eval('1 + 1')
|
|
```
|
|
|
|
- `exec()`: 执行动态代码
|
|
|
|
- `pickle.loads()`: 反序列化模块,如果反序列化恶意数据,可能导致代码执行
|
|
|
|
**Java**
|
|
|
|
在 Java 中,直接执行系统命令的函数相对较少,但依然存在
|
|
|
|
**命令执行函数**
|
|
|
|
- `Runtime.getRuntime().exec()`: 在单独的进程中执行指定的字符串命令
|
|
|
|
```java
|
|
Runtime.getRuntime().exec("ls -la");
|
|
```
|
|
|
|
- `java.lang.ProcessBuilder`: 创建一个操作系统进程
|
|
|
|
```java
|
|
new ProcessBuilder("ls", "-la").start();
|
|
```
|
|
|
|
**代码执行**
|
|
|
|
- `ScriptEngine`:Java 脚本引擎,可以执行 JavaScript 等脚本语言
|
|
- 反序列化:Java 的反序列化漏洞通常是由于 `readObject()` 方法处理不当,结合 `Commons-Collections` 等库中的链式调用,最终实现命令执行 |