# 漏洞加固报告

## 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. **过滤用户输入

修复方法:在构建LDAP查询时,对用户输入进行过滤,确保不包含特殊字符,防止LDAP注入。

<?php
// 用户输入的用户名
$username = $_POST['username'];

// 过滤用户输入的特殊字符
$username = ldap_escape($username, "", LDAP_ESCAPE_FILTER);

// 构建安全的LDAP查询
$ldap_search_filter = "(uid=$username)";
$ldap_search = ldap_search($ldap_connection, "dc=example,dc=com", $ldap_search_filter);
?>

解释**:

- 使用 `ldap_escape()` 函数对用户输入进行转义,防止恶意字符破坏LDAP查询结构。

##### 2. **使用参数化查询

修复方法:避免直接拼接用户输入,改用LDAP的参数化查询或绑定方法,确保查询的安全性。

<?php
// 用户输入的用户名和密码
$username = $_POST['username'];
$password = $_POST['password'];

// 使用LDAP绑定验证
$bind_dn = "uid=$username,dc=example,dc=com";
$ldap_connection = ldap_connect($ldap_host);
if (ldap_bind($ldap_connection, $bind_dn, $password)) {
// 用户验证成功
}
?>

解释**:

- 使用 `ldap_bind()` 进行LDAP身份验证,而不是直接使用拼接的查询字符串。这样能够避免用户输入对查询结构
的干扰。

##### 3. **正则表达式和输入验证

修复方法:对输入进行正则表达式验证,只允许
合法字符输入。

<?php
// 用户输入的用户名
$username = $_POST['username'];

// 验证用户名是否只包含字母和数字
if (preg_match("/^[a-zA-Z0-9]*$/", $username)) {
    // 构建LDAP查询
    $ldap_search_filter = "(uid=$username)";
    $ldap_search = ldap_search($ldap_connection, "dc=example,dc=com", $ldap_search_filter);
} else {
    die("无效的用户名");
}
?>

解释**:

- 通过正则表达式限制用户输入,只允
许字母和数字,防止恶意字符被注入到LDAP查询中。

#### 总结

1. **最小化修改**:针对LDAP查询部分进行修复,避免大规模重构,确保兼容性。
2. **输入过滤与验证*
*:对所有用户输入进行严格的过滤,移除潜在的恶意字符或使用安全API进行查询。
3. **使用安全A
PI**:避免手动拼接查询字符串,改用参数化查询或绑定操作,提高系统的安全性。
4. **定期审计和测试**:定期审计LDAP查询代码和输入验证机制,防止漏洞复发。

通过这些修复措施,能够有效防止LDAP注入漏洞的发生,提升系统的安全性。  
#LDAP注入 #Web安全 #安全修复 #SQL注入

## 其他漏洞
### 越权漏洞

#### 漏洞点

越权漏洞通常指用户通过某些手段,绕过应用的权限控制机制,访问或操作本不该访问或操作的数据和资源。这种漏洞通常出现在没有进行充分的访问控制检查时,攻击者可以通过直接访问URL、修改请求参数或篡改其他输入数据来提升自己的权限。

#### 漏洞代码

在以下的示例中,用户可以通过修改 `user_id` 参数来访问不属于自己的数据,从而发生越权
漏洞

```php
<?php
// 用户ID和查询
$user_id = $_GET['user_id']; // 直接从URL获取用户
ID
$query = "SELECT * FROM users WHERE id = $user_id";
$
result = mysqli_query($conn, $query);

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

#### 漏洞产生的危害

- **信息泄露**:攻击者可以访问不应查看的敏感信息,如其他用户的个人数据、历史记录等。
- **数据篡改**:攻击者可能通过越权操作修改、删除其他用户的敏感数据。
- **权限提升**:如果攻击者能够访问本不应有权限访问的功能或资源,可能进一步获得更高的权限,造成系统的严重安全隐患。
- **服务拒绝**:攻击者可能通过越权操作使其他用户的资源不可用或导致系统崩溃。

#### 漏洞产生的原因


### 修复思路

1. **最小化修改**:在修复时,只需对现有代码进行必要的修改,避免大规模重写,确保系统的互操作性不受影响。
2. **安全修复重点**:使用参数化查询(预处理语句)来处理用户输入,这样可以避免直接拼接 SQL 语句,从而防止 SQL 注入。
3. **避免复杂重构**:通过参数化查询的方式修复当前漏洞,而无需大规模重构现有代码。

### 漏洞修复

#### 方法一:使用预处理语句

```php
<?php
include('conn.php'); // 数据库连接省略

// 使用预处理语句来避免SQL注入
$stmt = $mysqli->prepare("SELECT id, name FROM users WHERE id = ? AND name = ?");
$stmt->bind_param("is", $_GET['id'], $_GET['name']); // 绑定参数,i为整数,s为字符串类型
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"];
}
} else {
echo "没有查询到结果";
}
?>
```

**修复解释**:

- 使用 `prepare()` 和 `bind_param()` 方法来创建参数化查询,确保用户输入的 `$_GET['id']` 和 `$_GET['name']` 被安全处理。
- `bind_param("is", $_GET['id'], $_GET['name'])` 将 `$_GET['id']` 作为整数类型,`$_GET['name']` 作为字符串类型,避免了 SQL 注入。

#### 方法二:使用 `PDO` 的预处理语句

```php
<?php
include('conn.php'); // 数据库连接省略

// 使用 PDO 预处理语句
$stmt = $pdo->prepare("SELECT id, name FROM users WHERE id = :id AND name = :name");
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); // 绑定id为整数类型
$stmt->bindParam(':name', $_GET['name'], PDO::PARAM_STR); // 绑定name为字符串类型
$stmt->execute();

$result = $stmt->fetchAll();
if ($result) {
foreach ($result as $row) {
echo "id: " . $row["id"]. " - Name: " . $row["name"];
}
} else {
echo "没有查询到结果";
}
?>
```

**修复解释**:

- 使用 `PDO` 的 `prepare()` 和 `bindParam()` 方法来创建参数化查询,确保用户输入得到正确处理。
- 使用占位符 `:id` 和 `:name` 绑定参数,`PDO` 会自动处理输入的类型和转义,避免 SQL 注入。

### 总结

1. **最小化修改**:通过使用预处理语句和参数化查询修复 SQL 注入漏洞,无需大规模重写现有代码,确保系统互操作性不受影响。
2. **安全修复**:避免直接拼接用户输入到 SQL 查询中,而是通过参数化查询确保用户输入被安全处理。
3. **长远考虑**:这种修复方法不仅解决了 SQL 注入问题,还提升了代码的可维护性和安全性。

#SQL注入 #PHP安全 #预处理语句 #参数化查询
## 文件操作

### 文件读取漏洞

#### 漏洞点

文件读取漏洞通常发生在未对用户输入进行严格验证的情况下,攻击者可以利用路径遍历等技巧读取服务器上的敏感文件,暴露敏感信息或导致系统安全风险。

#### 漏洞代码

```php
$file = $_GET['file'];
$content = file_get_contents($file); // 直接读取文件内容
echo $content;
```

#### 漏洞产生的危害

- **信息泄露**:攻击者通过路径遍历攻击可能读取服务器上的敏感文件,如配置文件(`config.php`)、数据库凭证文件等,导致信息泄露。
- **系统安全风险**:攻击者可以读取并篡改系统中的重要文件,影响系统的稳定性或暴露安全信息。
- **数据篡改**:如果文件读取操作没有严格限制,攻击者可能进一步通过读取文件漏洞获得系统敏感信息,进行数据篡改或其他攻击。

#### 漏洞产生的原因

- **缺乏输入验证**:用户输入的文件路径未经验证,导致攻击者可以提供任意文件路径。
- **路径未限制**:直接使用用户提供的文件路径进行文件操作,容易造成路径穿越漏洞。
- **不当的权限控制**:没有对文件读取进行有效的权限控制,任何用户都可以访问任何文件。

#### 修复思路

1. **最小化修改**:保持现有功能,在不重构系统的情况下,增加文件路径的验证和限制。
2. **路径验证**:限制文件读取操作的路径,确保只能读取允许的目录中的文件。
3. **限制文件类型**:对于读取操作,只允许特定类型的文件进行读取,避免泄露敏感数据。

#### 漏洞修复

```php
// 定义允许读取的目录
$allowed_dir = '/var/www/uploads/';

// 获取用户输入的文件名
$file = $_GET['file'];

// 获取文件的绝对路径
$file_path = realpath($allowed_dir . basename($file));

// 如果文件路径在允许的目录中,并且文件存在,则进行读取
if (strpos($file_path, $allowed_dir) === 0 && file_exists($file_path)) {
$content = file_get_contents($file_path);
echo $content;
} else {
die('非法文件访问');
}
```

---

### 文件上传漏洞

#### 漏洞点

文件上传漏洞发生在未对上传文件进行严格验证的情况下,攻击者可能上传恶意文件进行攻击,如Web Shell、病毒或木马等。

#### 漏洞代码

```php
move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $target_path); // 直接将文件上传到指定路径
```

#### 漏洞产生的危害

- **远程代码执行**:攻击者可以通过上传恶意文件(如Web Shell),执行任意代码,进而控制服务器。
- **恶意软件传播**:通过上传病毒、木马等恶意文件,可能会感染其他用户或系统。
- **信息泄露**:上传的恶意文件可能包含敏感信息,导致数据泄露或滥用。

#### 漏洞产生的原因

- **缺乏文件类型和大小限制**:未对上传的文件类型、扩展名、大小等进行验证,导致恶意文件被上传。
- **路径未过滤**:上传的文件路径未经过适当过滤,可能导致文件被保存到不安全的位置。
- **未做权限控制**:文件上传时没有对目标目录进行权限控制,可能导致覆盖系统关键文件。

#### 修复思路

1. **最小化修改**:对文件上传部分进行增强验证,而不是对系统进行大规模重构。
2. **文件类型和大小验证**:对上传文件的类型和大小进行严格的检查,拒绝不合法文件。
3. **路径限制**:确保上传的文件只能存储在特定目录,避免被上传到系统关键目录。
4. **权限控制**:设置目标目录的权限,防止上传的文件被执行。

#### 漏洞修复

```php
$allowed_types = ['image/jpeg', 'image/png', 'application/pdf']; // 允许的文件类型
$max_size = 5 * 1024 * 1024; // 文件大小限制为5MB

if (in_array($_FILES['uploaded_file']['type'], $allowed_types) && $_FILES['uploaded_file']['size'] <= $max_size) {
$target_path = '/var/www/uploads/' . basename($_FILES['uploaded_file']['name']);
if (move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $target_path)) {
echo '文件上传成功';
} else {
echo '文件上传失败';
}
} else {
echo '非法文件类型或文件过大';
}
```

---

### 文件写入漏洞

#### 漏洞点
 
 
Back to Top