# 漏洞加固报告

## 1. 漏洞点名称
SQL 注入漏洞
此漏洞属于**SQL 注入类型漏洞**,关键特征包括:
- 用户输入直接拼接到 SQL 查询语句中,缺乏参数化处理。
- 攻击者可通过构造恶意输入绕过认证逻辑或执行恶意查询。

---

## 2. 漏洞代码

if (isset($_POST['login'])) {
    $uname = str_replace('\'', '', urldecode($_POST['un']));
    $pass = str_replace('\'', '', urldecode($_POST['ps']));
    $run = 'select * from auth where pass=\'' . $pass . '\' and uname=\'' . $uname . '\'';
    $result = mysqli_query($conn, $run);
    if (mysqli_num_rows($result) > 0) {
        $row = mysqli_fetch_assoc($result);
        echo "You are allowed<br>";
        $_SESSION['logged'] = true;
        $_SESSION['admin'] = $row['username'];
        header('Location:panel.php', true, 302);
    } else {
        echo "<script>alert('Try again');</script>";
    }
}


---

## 3. 漏洞产生的危害
1. SQL 注入的威胁**:
- 攻击者可通过构造恶意输入绕过认证机制,例如使用 `' OR '1'='1`。
- 攻击者可能读取、修改或删除数据库中的敏感数据。

2. **潜在风险**:
- 数据库被完全控制,可能导致数据泄露或篡改。
- 攻击者可能通过数据库权限进一步攻击服务器或网络。

3. **业务影响**:
- 用户账户信息泄露或被篡改。
- 整体系统的可用性和完整性受到威胁。

---

## 4. 漏洞产生的原因以及修复思路

### 漏洞产生的原因
1. 用户输入未经过安全处理,直接拼接到 SQL 查询语句中。
2. 缺乏参数化查询或预处理机制来防止注入。

### 修复思路
1. **使用参数化查询**:
- 通过 `mysqli` 或 `PDO` 的预处理语句绑定用户输入,避免拼接查询语句。

2. **输入过滤与输出编码**:
- 使用过滤函数清理输入,例如 `filter_var`。
- 对输出使用适当的转义,防止其他漏洞(如 XSS)。

3. **强化用户认证逻辑**:
- 添加密码哈希存储机制(例如 `password_hash` 和 `password_verify`)。
- 限制失败登录尝试,防止暴力破解。

---

## 5. 漏洞修复后代码截图

### 修复后的代码
```php
if (isset($_POST['login'])) {
$uname = trim($_POST['un']);
$pass = trim($_POST['ps']);

// 使用参数化查询防止 SQL 注入
$stmt = $conn->prepare('SELECT * FROM auth WHERE uname = ? AND pass = ?');
$stmt->bind_param('ss', $uname, $pass);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
echo "You are allowed<br>";
$_SESSION['logged'] = true;
$_SESSION['admin'] = $row['username'];
header('Location: panel.php', true, 302);
exit();
} else {
echo "<script>alert('Try again');</script>";
}
}
```

### 修复后的增强措施
1. **使用密码哈希存储和校验

// 注册用户时
$hashed_pass = password_hash($pass, PASSWORD_BCRYPT);

// 登录验证时
if (password_verify($pass, $row['pass'])) {
    // 验证通过
}


2. 限制登录尝试次数
通过记录用户登录尝试次数,防止暴力破解攻击。

---

## 关键词
#SQL注入 #参数化查询 #安全编码 #认证漏洞 #漏洞修复
# 漏洞加固报告

## 1. 漏洞点名称
文件上传功能的安全漏洞
该漏洞属于**文件上传类型漏洞**,可能导致攻击者上传恶意文件。关键特征包括:
- 缺乏对上传文件的严格校验(文件类型校验逻辑存在缺陷)。
- 未对服务器端文件路径和文件类型进行有效验证,可能被绕过。

---

## 2. 漏洞代码

### 前端代码
function checkFile() {
    var file = document.getElementsByName('upload file')[0].value;
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    // 定义允许上传的文件类型
    var allow_ext = ".jpgl. pngl .gif";
    // 提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    // 判断上传文件类型是否允许上传
    if (allow_ext.indexof(ext_name) == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}


### 后端代码
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];
        if (move_uploaded_file($temp_file, $img_path)) {
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}


---

## 3. 漏洞产生的危害
1. **文件类型校验缺陷**:
- 前端的文件校验机制仅通过字符串匹配检查文件扩展名,极易被篡改或绕过。
- 后端未对文件类型进行进一步验证,允许上传非图片类型的文件,如恶意脚本文件(`.php`、`.jsp` 等)。

2. **潜在风险**:
- 攻击者可能上传恶意脚本,通过访问恶意脚本获取对服务器的控制权。
- 可能泄露敏感信息或导致数据被篡改,甚至让服务器沦为攻击平台。

3. **业务影响**:
- 数据完整性和机密性受损。
- 攻击者可能实施勒索攻击,导致严重经济损失。

---

## 4. 漏洞产生的原因以及修复思路

### 漏洞产生的原因
1. **客户端校验缺陷**:客户端文件类型校验缺乏可靠性,容易被篡改。
2. **后端安全措施不足**:未严格验证上传文件的 MIME 类型、扩展名及文件内容一致性。

### 修复思路
1. **后端严格校验**:
- 使用 mime_content_type() 或类似函数验证文件真实的 MIME 类型。
- 限制允许的文件扩展名。
- 对文件内容进行校验,防止伪装攻击。

2. **前端增强校验**:
- 使用更加健壮的文件校验逻辑,但前端校验仅作为用户体验的辅助措施,不能替代后端校验。

3. **其他防御措施**:
- 上传目录设置不可执行权限,防止上传的文件被执行。
- 对上传文件进行重命名,防止路径预测攻击。

---

## 5. 漏洞修复后代码截图

### 修复后的前端代码
function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (!file) {
        alert("请选择要上传的文件!");
        return false;
    }
    var allow_ext = [".jpg", ".png", ".gif"];
    var ext_name = file.substring(file.lastIndexOf(".")).toLowerCase();
    if (!allow_ext.includes(ext_name)) {
        alert(`该文件不允许上传,请上传以下类型的文件:${allow_ext.join(", ")}`);
        return false;
    }
    return true;
}


### 修复后的后端代码
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $file_info = finfo_open(FILEINFO_MIME_TYPE);
        $mime_type = finfo_file($file_info, $temp_file);
        finfo_close($file_info);

        // 允许的 MIME 类型和扩展名
        $allowed_types = ['image/jpeg', 'image/png', 'image/gif'];
        $allowed_ext = ['jpg', 'png', 'gif'];

        $file_ext = pathinfo($_FILES['upload_file']['name'], PATHINFO_EXTENSION);

        if (in_array($mime_type, $allowed_types) && in_array($file_ext, $allowed_ext)) {
            $new_file_name = uniqid() . '.' . $file_ext;
            $img_path = UPLOAD_PATH . '/' . $new_file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
                $msg = '文件上传成功!';
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不合法!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}


---

## 关键词
#文件上传漏洞 #安全校验 #MIME类型验证 #恶意文件上传 #安全加固


- **缺乏有效的访问控制**:未对每个请求和用户身份进行严格的访问控制,导致权限判断不到位。
- **信任用户输入**:直接使用用户输入的数据(如 URL 参数、表单数据等)进行权限验证,而没有对其进行适当的验证和限制。
- **不完善的权限检查**:在后台未对每个操作进行权限校验,只依
赖前端的展示权限,造成攻击者绕过前端控制。
- **未分配适当的用户角色**:用户角色和权限设置不当,导致某些用户能够执行本不该有的操作。

#### 修复思路

1. **最小化修改**:在修复越权漏洞时,应专注于添加或修改访问控制逻辑,避免大规模修改业务逻辑,确保兼容性。
2. **实施严格的访问控制**:根据每个用户的角色和权限对敏感资源进行细粒度的控制,避免任意用户访问他人数据。
3. **身份验证和权限校验**:对每个敏感操作都进行权限检查,确保用户只有在有权限时才能进行操作。
4. **输入验证和过滤**:不要信任用户输入,所有用户提供的数据必须经过验证和过滤,避免参数伪造和越权访问。

#### 漏洞修复

##### 1. **加强权限控制

修复方法:使用权限校验来确保用户只能访问自己的数据。例如,在数据库查询时,不允许直接使用来自客户端的 `user_id`,而应根据当前登录用户的身份来查询数据。

<?php
// 当前用户的ID
$current_user_id = $_SESSION['user_id']; // 通过会话获取当前登录用户的ID

// 用户只能访问自己的数据
$query = "SELECT * FROM users WHERE id = $current_user_id";
$result = mysqli_query($conn, $query);

// 显示用户信息
$row = mysqli_fetch_assoc($result);
echo "Hello, ".$row['name']."!";
?>

解释**:

- 当前用户的ID应该通过会话、Token等安全方式获取,而不是直接从用户输入中获取,防止攻击者篡改 `user_id`。

##### 2. **权限校验函数

修复方法:通过权限校验函数,确保每个请求的操作仅限于特定权限的用户执行。

<?php
// 权限检查函数
function check_permission($user_id, $action) {
// 检查用户是否有权限执行某个操作
if ($action == 'edit' && $_SESSION['role'] == 'admin') {
return true;
} elseif ($action == 'view' && $_SESSION['user_id'] == $user_id) {
return true;
}
return false;
}

// 用户输入的数据
$user_id = $_GET['user_id'];
$action = $_GET['action']; // 操作类型

// 检查是否有权限
if (check_permission($user_id, $action)) {
// 执行操作
echo "用户有权限执行此操作";
} else {
die('无权限访问');
}
?>

解释**:

- `check_permission()` 函数用来判断当前用户是否有权限执行某个特定操作。确保不同权限的用户只能执行被允许的操作。

##### 3. **禁止直接通过URL访问敏感资源

修复方法:避免通过URL直接访问敏感资源,改为使用会话或权限校验来访问。例如,通过检查登录状态或角色来限制访问。

<?php
// 通过会话验证用户身份
session_start();
if (!isset($_SESSION['user_id'])) {
die('请先登录');
}

// 如果用户尝试访问不属于他们的数据,进行检查
if ($_SESSION['user_id'] != $_GET['user_id']) {
die('无权限访问该用户数据');
}
?>

解释**:

- 使用 `session` 变量确保只有登录用户可以访问其自身数据,防止通过 URL 直接访问其他用户的数据。

#### 总结

1. **最小化修改**:修复越权漏洞时,尽量避免大规模的业务逻辑改动,专注于添加或修改访问控制逻辑,以确保现有系统互操作性。
2. **身份验证和权限校验*
*:在每个关键操作之前,必须严格校验用户的身份和权限,确保用户只能访问和操作自己有权访问的数据。
3. **严格的输入验证和过滤**:避免直接信任用户输入,确保所有敏感操作都经过严格的验证。
4. **会话和角色控制**:通过会话和角色控制访问权限,确保只有授权用户可以执行特定的操作。

通过这些措施,可以有效防止越权漏洞,提升系统的安全性。  
#越权漏洞 #Web安全 #权限控制 #安全修复

### 未授权访问/无鉴权/鉴权绕过

#### 漏洞点

未授权访问(或无鉴权/鉴权绕过)漏洞是指用户在没有适当身份验证和权限控制的情况下,访问本不应公开的资源或执行本不应允许的操作。这种漏洞通常是由于应用程序未正确实施身份验证机制或绕过了
权限验证,攻击者可通过直接访问未授权的 URL、篡改请求参数或使用其他手段绕过安全机制。

#### 漏洞代码

在以下示例中,应用程序直接根据传递的用户ID
返回数据,没有进行有效的权限验证,导致未授权的访问。
- **魔术方法未加防范**:在某些情况下,开发者未考虑到魔术方法可能被触发,导致攻击者能够通过控制对象的反序列化过程,执行恶意操作。
- **缺乏输入验
证**:对于接受用户输入的反序列化数据,未对其进行严格的检查和过滤,导致恶意数据能够被反序列
化并执行。

#### 修复思路

1. **最小化修改**:在修复时,避免对现有系统进行大规模重构,而是针对反序列化函数和魔术方法进行必要的修改,确保兼容性。
2. **限制反序列化数据的来源**:不允许接受来自不可信来源的反序列化数据,避免用户操控反序列化过程。
3. **使用安全的反序列化机制**:尽量避免使用 `unserialize()` 处理不可信的数据,改用 JSON 格式(`json_encode`/`json
_decode`)或其他安全的方式进行数据传递。
4. **禁用魔术方法**:对于可能被恶意利用的魔术方法(如 `__destruct()`、`__wakeup()` 等),应谨慎使用或完全禁用。

#### 漏洞修复

##### 1. **禁用反序列化

修复方法:对反序列化的数据进行源验证或选择不使用反序列化,而使用更安全的格式,如 JSON。

<?php
class User {
private $name;

public function __construct($name) {
$this->name = $name;
}

public function getName() {
return $this->name;
}
}

$data = $_GET['data'];
if (is_valid_data($data)) { // 验证数据的合法性
$user = unserialize($data);
echo $user->getName();
} else {
die('非法数据');
}
?>

解释**:

- 使用 `is_valid_data()` 函数验证反序列化数据的合法性,确保反序列化过程不会受到恶意输入的影响。

##### 2. **替换反序列化为 JSON

修复方法:使用 JSON 格式代替 `unserialize()`,避免魔术方法的潜在风险。

<?php
class User {
private $name;

public function __construct($name) {
$this->name = $name;
}

public function getName() {
return $this->name;
}
}

$data = $_GET['data'];
$userData = json_decode($data, true); // 使用 JSON 解码
if (isset($userData['name'])) {
echo $userData['name'];
} else {
die('非法数据');
}
?>

解释**:

- `json_decode()` 不会触发魔术方法,因此它是一个更安全的选择。

##### 3. **禁用不必要的魔术方法

修复方法:避免使用 `__destruct()`、`__wakeup()` 等方法,或对其进行安全限制。

<?php
class FileOpener {
private $fileName;

public function __construct($fileName) {
$this->fileName = $fileNam
e;
    }

    public function safeDestruct() {
        if (is_safe_file($this->fileName)) {
            unlink($this->fi
leName); // 安全删除文件
}
}
}

function is_safe_file($file) {
return strpos($file, '/var/
www/uploads/') === 0; // 限制可删除的文件目录
}

$data = $_GE
T['data'];  
$object = unserialize($data);
$object->safeDestruct();  // 明确调用安全的删除方法
?>

解释**- 使用显式的方法(如 `safeDestruct()`)而非魔术方法,并进行安全检查,避免危险操作。

#### 总结

1. **最小化修改**:通过只对反序列化和魔术方法进行必要的修改,避免大规模重构,保持系统的互操作性。
2. **使用安全替代方案**:避免直接使用 `unserialize()` 来反序列化不可信数据,考虑使用更安全的 JSON 格式或自定义安全反序列化方法。
3. **禁用危险魔术方法**:避免或限制使用可能被滥
用的魔术方法,采用显式的方法调用来替代。
4. **严格输入验证**:对所有反序列化数据进行严格的源验证和合法性检查,确保不会被恶意篡改。

通过这些修复措施,能够有效减少反序列化漏洞带来的安全风险,提升系
统的整体安全性。
#PHP安全 #反序列化漏洞 #魔术方法 #Web安全 #安全修复
## LDAP注入

### LDAP注入漏洞

#### 漏洞点

LDAP注入漏洞是指攻击者通过在LDAP(轻量目录访问协议)查询中插入恶意代码,从而干扰查询的执行或绕过身份验证等安全控制。这种漏洞通常出现在直接将用户输入作为LDAP查询的一部分时,而没有对其进行适当的验证和过滤


#### 漏洞代码

假设应用程序通过用户名和密码进行身份验证时,查询LDAP服务器以验证用户信息。未对输入进行过滤的代码示例如下:

```php
<?php
$ldap_host = "ldap://example.com";
$ldap_connection = ldap_connect($ldap_host);
$bind_dn = "cn=admin,dc=example,dc=com";
$bind_password = "admin_password";

// 用户提供的用户名和密码
$username = $_POST['username'];
$password = $_POST['password'];

// 构建LDAP查询
$ldap_search_filter = "(uid=$username)"; // 用户输入直接拼接到查询中
$ldap_search = ldap_search($ldap_connection, "dc=example,dc=com", $ldap_search_filter);

$entries = ldap_get_entries($ldap_connection, $ldap_search);
if ($entries['count'] > 0) {
// 校验密码等操作
}
?>
```

#### 漏洞产生的危害

- **身份验证绕过**:攻击者可以利用LDAP注入
构造
特殊的查询条件,从而绕过身份验证,获得未授权的访问权限。
- **信息泄露**:攻击者可能通过注入恶意查询,获取系统中不应该公开的数据,例如用户详细信息、系统配置等。
- **数据篡改**:在某些情况下,LDAP注入还可以允许攻击者修改目录数据,进行删除、更新等破坏性操作。
- **系统完整性受损**:恶意用户可以通过注入执行查询,查看敏感信息,或者执行更具破坏性的操作,从而危害系统安全。

#### 漏洞产生的原因

- **直接拼接用户输入**:没有对用户输入进行适当的过滤和验证,直接将其拼接到LDAP查询语句中。
- **缺乏输入验证**:未对用户输入进行适当的字符检查,导致恶意字符被
成功注入。
- **使用不安全的LDA
P查询构造方式**:在构建LDAP查询时,没有使用安全的API或方法来防止特殊字符(如 `*`, `(`, `)` 等)对查询逻辑的影响。

#### 修复思路

1. **最小化修改**:修复LDAP注入漏洞时,避免大规模改动代码,而是专注于修改LDAP查询部分,确保不会破坏现有的系统互操作性。
2. **输入过滤与验证**:对所有用户输入进行严格的验证,确保其符合预期格式,避免恶意字符注入。
3. **使用参数化查询**:改用参数化的LDAP查询方式,避免直接拼接用户输入到查询字符串中。
4. **禁用特殊字符**:对用户输入进行清理,移除对LDAP查询构成威胁的字符,例如 `
*`, `(`, `)` 等。
 
 
Back to Top