BroadcastChannel
https://channel.gandli.eu.org/
https://channel.gandli.eu.org/
# 漏洞加固报告
## 1. 漏洞点名称
SQL 注入漏洞
此漏洞属于**SQL 注入类型漏洞**,关键特征包括:
- 用户输入直接拼接到 SQL 查询语句中,缺乏参数化处理。
- 攻击者可通过构造恶意输入绕过认证逻辑或执行恶意查询。
---
## 2. 漏洞代码
---
## 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. **使用密码哈希存储和校验
2. 限制登录尝试次数
通过记录用户登录尝试次数,防止暴力破解攻击。
---
## 关键词
#SQL注入 #参数化查询 #安全编码 #认证漏洞 #漏洞修复
## 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. 漏洞代码
### 前端代码
### 后端代码
---
## 3. 漏洞产生的危害
1. **文件类型校验缺陷**:
- 前端的文件校验机制仅通过字符串匹配检查文件扩展名,极易被篡改或绕过。
- 后端未对文件类型进行进一步验证,允许上传非图片类型的文件,如恶意脚本文件(`.php`、`.jsp` 等)。
2. **潜在风险**:
- 攻击者可能上传恶意脚本,通过访问恶意脚本获取对服务器的控制权。
- 可能泄露敏感信息或导致数据被篡改,甚至让服务器沦为攻击平台。
3. **业务影响**:
- 数据完整性和机密性受损。
- 攻击者可能实施勒索攻击,导致严重经济损失。
---
## 4. 漏洞产生的原因以及修复思路
### 漏洞产生的原因
1. **客户端校验缺陷**:客户端文件类型校验缺乏可靠性,容易被篡改。
2. **后端安全措施不足**:未严格验证上传文件的 MIME 类型、扩展名及文件内容一致性。
### 修复思路
1. **后端严格校验**:
- 使用
- 限制允许的文件扩展名。
- 对文件内容进行校验,防止伪装攻击。
2. **前端增强校验**:
- 使用更加健壮的文件校验逻辑,但前端校验仅作为用户体验的辅助措施,不能替代后端校验。
3. **其他防御措施**:
- 上传目录设置不可执行权限,防止上传的文件被执行。
- 对上传文件进行重命名,防止路径预测攻击。
---
## 5. 漏洞修复后代码截图
### 修复后的前端代码
### 修复后的后端代码
---
## 关键词
#文件上传漏洞 #安全校验 #MIME类型验证 #恶意文件上传 #安全加固
## 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类型验证 #恶意文件上传 #安全加固
1. **最小化修改**:修复未授权访问漏洞
$username = $_POST['username'];
$password = $_POST['password'];
// 进行用户身份验证
$query = "SELECT * FROM users WHERE username
}
}
?>
```
#### 漏洞产生的危害
- **密码爆破**:攻击者可以通过多次尝试登录,利用暴力破解等方式获取用户密码。
- **垃圾信息填充**:例如频繁发起订单、发表评论等,可能导致系统资源浪费、性能下降,影响正常用户使用。
- **拒绝服务攻击**:频繁请求可以占用服务器资源,导致合法用户无法使用服务,形成拒绝服务(DoS)攻击。
- **验证码绕过**:攻击者可以通过绕过验证码或多次尝试来提高成功率,从而进行暴力破解。
#### 漏洞产生的原因
- **缺乏请求频率限制**:关键操作缺乏限制,未对用户的请求频率进行有效控制。
- **没有使用有效的缓存机制**:没有使用缓存机制(如Memcached、Redis)来存储请求次数,从而缺乏对频繁操作的跟踪。
- **未设置多次失败后锁定机制**:没有在失败尝试超过一定次数后锁定用户或请求。
#### 修复思路
1. **最小化修改**:修复时,主要增强现有的频率限制,避免大规模改动现有代码。
2. **引入请求频率限制**:在每个关键操作前加入对IP、用户名、设备等的频率限制。例如,限制每分钟的登录尝试次数。
3. **增加锁定机制**:当尝试次数超过阈值时,暂时锁定账户,并显示适当的错误信息。
4. **引入验证码**:在多次失败后,强制显示验证码,防止暴力破解。
5. **使用缓存存储尝试次数**:使用Redis、Memcached等缓存系统来存储用户尝试次数,限制频率。
#### 漏洞修复
##### 1. **频率限制和锁定机制
利用缓存机制(如Redis)存储用户的尝试次数,达到阈值后限制登录:
<?php
session_start();
$redis = new Redis();
$redis->connect('localhost', 6379);
$username = $_POST['username'];
$attempts = $redis->get('login_attempts_' . $username);
// 如果尝试次数超过5次,锁定账户5分钟
if ($attempts >= 5) {
die('Too many login attempts. Please try again later.');
}
// 进行密码验证
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
if (mysqli_num_rows($result) > 0) {
echo "Login successful!";
$redis->del('login_attempts_' . $username); // 登录成功后清除尝试次数
} else {
$redis->incr('login_attempts_' . $username); // 增加尝试次数
$redis->expire('login_attempts_' . $username, 600); // 设置过期时间为10分钟
echo "Invalid credentials!";
}
?>
解释**:
- 每次登录时,首先检查用户的登录尝试次数。
- 如果超过设定阈值(如5次),则锁定账户并提示用户稍后再试。
- 使用Redis存储登录尝试次数,过期时间设置为10分钟,防止频繁的暴力破解。
##### 2. **验证码引入
时,避免重构现有的系统架构,重点加强身份验证和权限控制。
2. **身份验证和权限管理**:实施严格的用户身份验证机制,并通过会话或JWT等方式验证每个请求的合法性。
3. **细粒度的权限控制**:基于角色、ACL等方式实现细粒度的权限管理,确保用户只能执行授权操作。
4. **避免敏感信息泄露**:避免通过URL等方式传递敏感信息,增强系统的安全性。
通过这些修复方法,可以有效防止未授权访问漏洞,提升系统的安全性。
#未授权访问 #Web安全 #身份验证 #权限控制 #安全修复
### 频率限制
#### 漏洞点
频率限制漏洞发生在没有对用户操作进行适当的限制时,特别是在关键业务操作中,如用户登录、账户注册、敏感操作等。攻击者可以利用频繁的请求,例如密码爆破、垃圾信息填充等,造成系统资源消耗或绕过正常的业务限制,从而进行攻击。
#### 漏洞代码
在没有频率限制的情况下,攻击者可以不断尝试密码或进行其他重复性请求:
```php
<?php
// 用户登录
if (isset($_POST['username']) && isset($_POST['password'])) {$username = $_POST['username'];
$password = $_POST['password'];
// 进行用户身份验证
$query = "SELECT * FROM users WHERE username
= '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
if (mysqli_num_rows($result) > 0) {
echo "Login successful!";
} else {
echo "Invalid credentials!";}
}
?>
```
#### 漏洞产生的危害
- **密码爆破**:攻击者可以通过多次尝试登录,利用暴力破解等方式获取用户密码。
- **垃圾信息填充**:例如频繁发起订单、发表评论等,可能导致系统资源浪费、性能下降,影响正常用户使用。
- **拒绝服务攻击**:频繁请求可以占用服务器资源,导致合法用户无法使用服务,形成拒绝服务(DoS)攻击。
- **验证码绕过**:攻击者可以通过绕过验证码或多次尝试来提高成功率,从而进行暴力破解。
#### 漏洞产生的原因
- **缺乏请求频率限制**:关键操作缺乏限制,未对用户的请求频率进行有效控制。
- **没有使用有效的缓存机制**:没有使用缓存机制(如Memcached、Redis)来存储请求次数,从而缺乏对频繁操作的跟踪。
- **未设置多次失败后锁定机制**:没有在失败尝试超过一定次数后锁定用户或请求。
#### 修复思路
1. **最小化修改**:修复时,主要增强现有的频率限制,避免大规模改动现有代码。
2. **引入请求频率限制**:在每个关键操作前加入对IP、用户名、设备等的频率限制。例如,限制每分钟的登录尝试次数。
3. **增加锁定机制**:当尝试次数超过阈值时,暂时锁定账户,并显示适当的错误信息。
4. **引入验证码**:在多次失败后,强制显示验证码,防止暴力破解。
5. **使用缓存存储尝试次数**:使用Redis、Memcached等缓存系统来存储用户尝试次数,限制频率。
#### 漏洞修复
##### 1. **频率限制和锁定机制
利用缓存机制(如Redis)存储用户的尝试次数,达到阈值后限制登录:
<?php
session_start();
$redis = new Redis();
$redis->connect('localhost', 6379);
$username = $_POST['username'];
$attempts = $redis->get('login_attempts_' . $username);
// 如果尝试次数超过5次,锁定账户5分钟
if ($attempts >= 5) {
die('Too many login attempts. Please try again later.');
}
// 进行密码验证
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
if (mysqli_num_rows($result) > 0) {
echo "Login successful!";
$redis->del('login_attempts_' . $username); // 登录成功后清除尝试次数
} else {
$redis->incr('login_attempts_' . $username); // 增加尝试次数
$redis->expire('login_attempts_' . $username, 600); // 设置过期时间为10分钟
echo "Invalid credentials!";
}
?>
解释**:
- 每次登录时,首先检查用户的登录尝试次数。
- 如果超过设定阈值(如5次),则锁定账户并提示用户稍后再试。
- 使用Redis存储登录尝试次数,过期时间设置为10分钟,防止频繁的暴力破解。
##### 2. **验证码引入
- **缺乏有效的访问控制**:未对每个请求和用户身份进行严格的访问控制,导致权限判断不到位。
- **信任用户输入**:直接使用用户输入的数据(如 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. **过滤用户输入
修复方法:在构建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. **正则表达式和输入验证
修复方法:对输入进行正则表达式验证,只允许
#### 总结
1. **最小化修改**:针对LDAP查询部分进行修复,避免大规模重构,确保兼容性。
2. **输入过滤与验证**:对所有用户输入进行严格的过滤,移除潜在的恶意字符或使用安全API进行查询。
3. **使用安全A
```php
<?php
// 用户ID和查询
$user_id = $_GET['user_id']; // 直接从URL获取用户ID
$query = "SELECT * FROM users WHERE id = $user_id";
$
##### 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']."!";
?>
```
#### 漏洞产生的危害
- **信息泄露**:攻击者可以访问不应查看的敏感信息,如其他用户的个人数据、历史记录等。
- **数据篡改**:攻击者可能通过越权操作修改、删除其他用户的敏感数据。
- **权限提升**:如果攻击者能够访问本不应有权限访问的功能或资源,可能进一步获得更高的权限,造成系统的严重安全隐患。
- **服务拒绝**:攻击者可能通过越权操作使其他用户的资源不可用或导致系统崩溃。
#### 漏洞产生的原因- **魔术方法未加防范**:在某些情况下,开发者未考虑到魔术方法可能被触发,导致攻击者能够通过控制对象的反序列化过程,执行恶意操作。
- **缺乏输入验证**:对于接受用户输入的反序列化数据,未对其进行严格的检查和过滤,导致恶意数据能够被反序列
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
}
}
}
function is_safe_file($file) {
return strpos($file, '/var/www/uploads/') === 0; // 限制可删除的文件目录
}
$data = $_GE
4. **严格输入验证**:对所有反序列化数据进行严格的源验证和合法性检查,确保不会被恶意篡改。
通过这些修复措施,能够有效减少反序列化漏洞带来的安全风险,提升系统的整体安全性。
#PHP安全 #反序列化漏洞 #魔术方法 #Web安全 #安全修复
## 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注入构造
- **使用不安全的LDA
- **缺乏输入验证**:对于接受用户输入的反序列化数据,未对其进行严格的检查和过滤,导致恶意数据能够被反序列
化并执行。
#### 修复思路
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->fileName); // 安全删除文件}
}
}
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查询构成威胁的字符,例如 `*`, `(`, `)` 等。修复方法
修复方法:选择一个安全配置的XML解析库(如`DOMDocument`),并确保其禁用了外部实体解析。
<?php
$doc = new DOMDocument();
libxml_disable_entity_loader(true); // 禁用外部实体加载
$doc->load($_GET['file']);
echo $doc->saveXML();
?>
解释**:
- `DOMDocument`是更为灵活和可配置的XML解析库,通过设置`libxml_disable_entity_loader(true)`来禁用外部实体解析。
#### 总结
1. **最小化修改**:只对现有代码进行必要的修改,重点禁用外部实体解析,避免对系统进行大规模重构。
2. **禁用外部实体**:使用`libxml_disable_entity_loader(true)`或相似配置,确保XML解析器不会加载外部实体。
3. **使用安全XML解析器**:选择安全的解析器,并禁用不必要的解析选项(如DTD解析和外部实体替换),提高XML解析的安全性。
4. **严格输入验证**:确保来自不可信来源的XML数据不会被直接传递给解析器,并对输入进行适当验证。
通过这些修复方法,能够有效防止XXE漏洞,提升应用程序的安全性。
#XXE #XML漏洞 #Web安全 #安全修复
## 反序列化
### PHP反序列化漏洞与魔术方法
#### 漏洞点
PHP反序列化漏洞是指攻击者通过传递恶意的序列化数据到 PHP 反序列化函数中,导致 PHP 对恶意对象进行不安全的操作。魔术方法(如 `__wakeup()`, `__destruct()` 等)可以在反序列化时自动触发,并执行恶意代码。通过控制反序列化的数据,攻击者可以触发魔术方法,执行不被预期的行为。
#### 漏洞代码
##### 1. **反序列化漏洞
<?php
class User {
private $name;
public function __construct($name) {
$this->name = $name;
}
public func
- **信息泄露**:攻击者可以通过反序列化特定的对象,获取本应受保护的数据或系统信息。
- **文件删除或其他资源破坏**:通过控制魔术方法(如 `__destruct()`),攻击者可以在反序列化过程中执行文件操作,如删除系统文件、覆盖文
:使用`XMLReader`而非`simplexml`,并配置其安全选项来禁用外部实体。
<?php
$reader = new XMLReader();
$reader->xml($_GET['file']);
$reader->setParserProperty(XMLReader::LOAD_DTD, false); // 禁用DTD解析
$reader->setParserProperty(XMLReader::VALIDATE, false); // 禁用验证
$reader->setParserProperty(XMLReader::SUBST_ENTITIES, false); // 禁用外部实体替换
$reader->read();
echo $reader->readString();
?>
解释**:
- 通过`setParserProperty()`设置解析器属性,禁用DTD解析、外部实体替换以及验证,确保解析过程不执行潜在的危险操作。
##### 3. **使用更安全的XML解析库修复方法:选择一个安全配置的XML解析库(如`DOMDocument`),并确保其禁用了外部实体解析。
<?php
$doc = new DOMDocument();
libxml_disable_entity_loader(true); // 禁用外部实体加载
$doc->load($_GET['file']);
echo $doc->saveXML();
?>
解释**:
- `DOMDocument`是更为灵活和可配置的XML解析库,通过设置`libxml_disable_entity_loader(true)`来禁用外部实体解析。
#### 总结
1. **最小化修改**:只对现有代码进行必要的修改,重点禁用外部实体解析,避免对系统进行大规模重构。
2. **禁用外部实体**:使用`libxml_disable_entity_loader(true)`或相似配置,确保XML解析器不会加载外部实体。
3. **使用安全XML解析器**:选择安全的解析器,并禁用不必要的解析选项(如DTD解析和外部实体替换),提高XML解析的安全性。
4. **严格输入验证**:确保来自不可信来源的XML数据不会被直接传递给解析器,并对输入进行适当验证。
通过这些修复方法,能够有效防止XXE漏洞,提升应用程序的安全性。
#XXE #XML漏洞 #Web安全 #安全修复
## 反序列化
### PHP反序列化漏洞与魔术方法
#### 漏洞点
PHP反序列化漏洞是指攻击者通过传递恶意的序列化数据到 PHP 反序列化函数中,导致 PHP 对恶意对象进行不安全的操作。魔术方法(如 `__wakeup()`, `__destruct()` 等)可以在反序列化时自动触发,并执行恶意代码。通过控制反序列化的数据,攻击者可以触发魔术方法,执行不被预期的行为。
#### 漏洞代码
##### 1. **反序列化漏洞
<?php
class User {
private $name;
public function __construct($name) {
$this->name = $name;
}
public func
tion getName() {
return $this->name;
}
}
$data = $_GET['data']; // 假设数据是通过 GET 参数传递的
$user = unserialize($data); // 反序列化用户传入的数据
echo $user->getName();
?>
##### 2. 魔术方法触发
<?php
class FileOpener {
private $fileName;
public function __construct($fileName) {
$this->fileName = $fileName;
}
public function __destruct() {
unlink($this->fileName); // 删除文件
}
}
$data = $_GET['data'];
$object = unserialize($data); // 反序列化恶意数据
?>
#### 漏洞产生的危害
- 远程代码执行(RCE)**:通过恶意的反序列化数据,攻击者可以触发类中的魔术方法(如 `__destruct()`、`__wakeup()`、`__call()` 等),执行任意代码,甚至远程执行代码。- **信息泄露**:攻击者可以通过反序列化特定的对象,获取本应受保护的数据或系统信息。
- **文件删除或其他资源破坏**:通过控制魔术方法(如 `__destruct()`),攻击者可以在反序列化过程中执行文件操作,如删除系统文件、覆盖文
件等。
- **权限提升**:如果攻击者能够控制反序列化的数据,可能利用漏洞提升权限或绕过身份验证机制。
#### 漏洞产生的原因
- **不安全的反序列化**:未对反序列化的数据进行充分的验证,直接信任用户输入或未经过滤的序列化数据。// 限制访问外部协议
if (in_array($parsed_url['scheme'], ['http', 'https'])) {
// 初始化cURL请求
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回响应内容
$response = curl_exec($ch);
if(curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
} else {
die('不允许访问非HTTP/HTTPS协议的资源');
}
解释**:
- 使用`cURL`可以更细致地控制请求,包括验证URL、设置请求头等,有助于减少被攻击的风险。
## CSRF
### CSRF(跨站请求伪造)漏洞
#### 漏洞点
跨站请求伪造(CSRF)漏洞是指攻击者诱导认证用户通过未授权的请求操作其账户,攻击者通常通过诱导用户点击恶意链接或执行恶意操作来完成请求。这类漏洞通常发生在应用程序没有对请求的来源进行有效验证时,导致恶意请求在用户不知情的情况下执行。
#### 漏洞代码
```php
<?php
// 用户提交的数据
$action = $_POST['action'];
// 执行相应操作
if ($action == 'delete') {
// 删除操作
deleteUser($userId);
}
```
#### 漏洞产生的危害
- **账户劫持**:攻击者通过诱导已登录的用户发起未授权的操作,如转账、修改密码、删除数据等。
- **数据泄露**:攻击者可以伪造请求,将受害者的敏感数据发送到攻击者指定的服务器。
- **服务滥用**:攻击者可以在用户不知情的情况下,滥用服务进行恶意操作,造成系统不稳定或损害。
#### 漏洞产生的原因
- **缺乏请求验证**:应用程序未验证请求是否来自合法用户或当前会话,导致攻击者可以伪造请求。
- **未使用CSRF防护机制**:未对敏感操作请求进行CSRF令牌(Token)验证。
- **不严格的会话管理**:没有足够的机制来确保请求是由当前用户发起的,容易被攻击者伪造。
#### 修复思路
1. **最小化修改**:在修复过程中,避免进行大规模重构,专注于对现有请求添加CSRF防护措施,保持系统的稳定性。
2. **引入CSRF令牌**:通过生成并验证CSRF令牌,确保请求是由合法用户发起。
3. **使用安全的请求方法**:要求敏感操作只能通过POST请求提交,并结合令牌机制进行验证,避免GET请求被滥用。
4. **增加Referer头验证**:通过检查HTTP请求中的Referer头,验证请求来源是否合法。
#### 漏洞修复
##### 1. **引入CSRF令牌
修复方法:为每个敏感操作生成CSRF令牌,并在表单提交时验证令牌。
<?php
// 生成CSRF令牌
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // 创建一个随机CSRF令牌
}
// 在HTML表单中嵌入CSRF令牌
?>
<form method="POST" action="delete.php">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<input type="submit" value="删除">
</form>
<?php
// 处理提交的表单
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 验证CSRF令牌
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF验证失败');
}
// 执行删除操作
deleteUser($userId);
}
解释**:
- 使用`session_start()`生成并存储CSRF令牌,令牌每次请求都会改变。
- 在提交表单时,通过隐藏字段将CSRF令牌传递给服务器,并验证令牌的有效性。
##### 2. **仅允许POST请求
修复方法:确保敏感操作只能通过POST请求提交,防止恶意用户通过GET请求发起敏感操作。
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 执行删除操作
deleteUser($userId);
} else {
die('非法请求方式');
}
解释**:
- 通过检查请求方式,确保只有POST请求能够执行敏感操作,避免GET请求被滥用来触发操作。
##### 3. **增加Referer头验证
修复方法:通过检查HTTP请求中的`Referer`头部,确保请求来源于合法的页面。
<?php
$allowed_referer = 'https://example.com';
if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], $allowed_referer) === 0) {
// 执行删除操作
deleteUser($userId);
} else {
die('非法请求来源');
}
解释**:
- 通过检查`Referer`头部,确保请求的来源是合法的,防止恶意站点伪造请求。
#### 总结
1. **最小化修改**:修复过程中专注于添加CSRF令牌验证、限制请求方法和增加Referer验证等必要安全措施,避免对系统进行大规模重构。
2. **引入CSRF令牌**:通过生成并验证CSRF令牌来确保敏感操作是由合法用户发起的,防止跨站请求伪造。
3. **限制请求方式**:确保敏感操作只能通过POST请求发起,避免恶意用户通过GET请求提交敏感操作。
4. **增加Referer验证**:检查请求来源,确保请求来自合法页面,防止跨站请求伪造。
通过这些措施,能够有效防止CSRF攻击,提升应用程序的安全性。
#CSRF #跨站请求伪造 #安全修复 #Web安全
## XXE
### XXE(XML External Entity)漏洞
#### 漏洞点
XXE漏洞是指攻击者通过修改XML请求中的实体引用,导致XML解析器加载外部资源或本地文件,进而泄露敏感信息或执行远程代码。这类漏洞通常出现在应用程序解析XML数据时未对外部实体进行正确的安全配置。
#### 漏洞代码
```php
<?php
$xml = simplexml_load_file($_GET['file']); // 加载外部XML文件
echo $xml->asXML
#### 修复思路
1. **最小化修改**:避免对现有系统进行大规模重构,专注于配置XML解析器,以禁用外部实体和DTD(文档类型定义),从而防止潜在的攻击。
2. **禁用
echo $xml->asXML();
?>
解释**:
- 使用`libxml_disable_entity_loader(true)`禁用外部实体加载,从而防止外部XML实体的加载和执行。
##### 2. **使用安全的XML解析方法
if (in_array($parsed_url['scheme'], ['http', 'https'])) {
// 初始化cURL请求
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回响应内容
$response = curl_exec($ch);
if(curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
} else {
die('不允许访问非HTTP/HTTPS协议的资源');
}
解释**:
- 使用`cURL`可以更细致地控制请求,包括验证URL、设置请求头等,有助于减少被攻击的风险。
## CSRF
### CSRF(跨站请求伪造)漏洞
#### 漏洞点
跨站请求伪造(CSRF)漏洞是指攻击者诱导认证用户通过未授权的请求操作其账户,攻击者通常通过诱导用户点击恶意链接或执行恶意操作来完成请求。这类漏洞通常发生在应用程序没有对请求的来源进行有效验证时,导致恶意请求在用户不知情的情况下执行。
#### 漏洞代码
```php
<?php
// 用户提交的数据
$action = $_POST['action'];
// 执行相应操作
if ($action == 'delete') {
// 删除操作
deleteUser($userId);
}
```
#### 漏洞产生的危害
- **账户劫持**:攻击者通过诱导已登录的用户发起未授权的操作,如转账、修改密码、删除数据等。
- **数据泄露**:攻击者可以伪造请求,将受害者的敏感数据发送到攻击者指定的服务器。
- **服务滥用**:攻击者可以在用户不知情的情况下,滥用服务进行恶意操作,造成系统不稳定或损害。
#### 漏洞产生的原因
- **缺乏请求验证**:应用程序未验证请求是否来自合法用户或当前会话,导致攻击者可以伪造请求。
- **未使用CSRF防护机制**:未对敏感操作请求进行CSRF令牌(Token)验证。
- **不严格的会话管理**:没有足够的机制来确保请求是由当前用户发起的,容易被攻击者伪造。
#### 修复思路
1. **最小化修改**:在修复过程中,避免进行大规模重构,专注于对现有请求添加CSRF防护措施,保持系统的稳定性。
2. **引入CSRF令牌**:通过生成并验证CSRF令牌,确保请求是由合法用户发起。
3. **使用安全的请求方法**:要求敏感操作只能通过POST请求提交,并结合令牌机制进行验证,避免GET请求被滥用。
4. **增加Referer头验证**:通过检查HTTP请求中的Referer头,验证请求来源是否合法。
#### 漏洞修复
##### 1. **引入CSRF令牌
修复方法:为每个敏感操作生成CSRF令牌,并在表单提交时验证令牌。
<?php
// 生成CSRF令牌
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // 创建一个随机CSRF令牌
}
// 在HTML表单中嵌入CSRF令牌
?>
<form method="POST" action="delete.php">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<input type="submit" value="删除">
</form>
<?php
// 处理提交的表单
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 验证CSRF令牌
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF验证失败');
}
// 执行删除操作
deleteUser($userId);
}
解释**:
- 使用`session_start()`生成并存储CSRF令牌,令牌每次请求都会改变。
- 在提交表单时,通过隐藏字段将CSRF令牌传递给服务器,并验证令牌的有效性。
##### 2. **仅允许POST请求
修复方法:确保敏感操作只能通过POST请求提交,防止恶意用户通过GET请求发起敏感操作。
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 执行删除操作
deleteUser($userId);
} else {
die('非法请求方式');
}
解释**:
- 通过检查请求方式,确保只有POST请求能够执行敏感操作,避免GET请求被滥用来触发操作。
##### 3. **增加Referer头验证
修复方法:通过检查HTTP请求中的`Referer`头部,确保请求来源于合法的页面。
<?php
$allowed_referer = 'https://example.com';
if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], $allowed_referer) === 0) {
// 执行删除操作
deleteUser($userId);
} else {
die('非法请求来源');
}
解释**:
- 通过检查`Referer`头部,确保请求的来源是合法的,防止恶意站点伪造请求。
#### 总结
1. **最小化修改**:修复过程中专注于添加CSRF令牌验证、限制请求方法和增加Referer验证等必要安全措施,避免对系统进行大规模重构。
2. **引入CSRF令牌**:通过生成并验证CSRF令牌来确保敏感操作是由合法用户发起的,防止跨站请求伪造。
3. **限制请求方式**:确保敏感操作只能通过POST请求发起,避免恶意用户通过GET请求提交敏感操作。
4. **增加Referer验证**:检查请求来源,确保请求来自合法页面,防止跨站请求伪造。
通过这些措施,能够有效防止CSRF攻击,提升应用程序的安全性。
#CSRF #跨站请求伪造 #安全修复 #Web安全
## XXE
### XXE(XML External Entity)漏洞
#### 漏洞点
XXE漏洞是指攻击者通过修改XML请求中的实体引用,导致XML解析器加载外部资源或本地文件,进而泄露敏感信息或执行远程代码。这类漏洞通常出现在应用程序解析XML数据时未对外部实体进行正确的安全配置。
#### 漏洞代码
```php
<?php
$xml = simplexml_load_file($_GET['file']); // 加载外部XML文件
echo $xml->asXML
();
?>
```
#### 漏洞产生的危害
- **信息泄露**:攻击者可以通过XXE漏洞访问本地文件系统,读取敏感配置文件或凭据文件,如`/etc/passwd`等。
- **远程代码执行**:通过加载恶意外部实体,攻击者可能诱使XML解析器执行远程代码,造成远程代码执行(RCE)。
- **拒绝服务攻击(DoS)**:利用特定的实体引用,攻击者可能导致XML解析器陷入无限循环,从而消耗系统资源,导致服务不可用。
#### 漏洞产生的原因
- **缺乏外部实体禁用**:XML解析器未禁用外部实体,允许攻击者控制请求中嵌入的外部资源。
- **不当的XML解析配置**:未对XML解析器进行适当的安全配置,导致外部实体被解析并执行不必要的操作。
- **对用户输入缺乏充分验证**:接受来自不可信来源的XML数据,并直接传递给解析器,未进行有效的安全处理。#### 修复思路
1. **最小化修改**:避免对现有系统进行大规模重构,专注于配置XML解析器,以禁用外部实体和DTD(文档类型定义),从而防止潜在的攻击。
2. **禁用
外部实体**:确保XML解析器在处理数据时,禁用外部实体的解析。
3. **限制输入来源**:仅允许信任的来源提交XML数据,并增加输入验证来减少潜在的攻击面。
4. **使用安全的XML库**:优先使用配置过的安全XML解析库,避免使用默认配置的库。
#### 漏洞修复
##### 1. **禁用外部实体解析
修复方法:修改XML解析器的配置,禁用外部实体解析。
<?php
libxml_disable_entity_loader(true); // 禁用外部实体加载
$xml = simplexml_load_file($_GET['file']);echo $xml->asXML();
?>
解释**:
- 使用`libxml_disable_entity_loader(true)`禁用外部实体加载,从而防止外部XML实体的加载和执行。
##### 2. **使用安全的XML解析方法
###
---
#### 基本信息
---
#### 用法
---
#### 选项
- `-h/--help`
显示帮助信息
- `--help`
显示高级帮助
- `--filter-help`
显示过滤语言的说明
- `--version`
显示
- `-e <type>`
列出可用的编码器、payloads、迭代器、打印器和脚本
- `--recipe <filename>`
从指定的配方文件中读取选项。可以重复使用该选项来读取多个配方。
- `--dump-recipe <filename>`
将当前选项打印为配方文件
- `--oF <filename>`
将模糊测试结果保存到文件,稍后可以使用该文件中的 payload 进行处理。
- `-c`
使用颜色输出
- `-v`
输出详细信息
- `-f filename,printer`
使用指定的打印器(默认为 raw 打印器)将结果保存到输出文件中。
- `-o printer`
使用指定的打印器显示结果。
- `--interact`
(测试版)启用后,所有按键都会被捕获,允许与程序进行交互。
- `--dry-run`
打印请求的结果,但不实际发送 HTTP 请求。
- `--prev`
打印上一个 HTTP 请求(仅在使用生成 fuzz 结果的 payload 时可用)。
- `--efield <expr>`
显示指定的语言表达式和当前的 payload。可以重复使用该选项来显示多个字段。
- `--field <expr>`
只显示指定的语言表达式,而不显示 payload。可以重复使用该选项来显示多个字段。
- `-p addr`
使用代理,格式为 `ip:port:type`。可以重复该选项使用多个代理。类型可以是 SOCKS4、SOCKS5 或 HTTP,如果省略,默认为 HTTP。
- `-t N`
指定并发连接数(默认是 10)
- `-s N`
指定请求之间的延迟时间(默认是 0)
- `-R depth`
指定递归路径发现的最大递归深度。
- `-D depth`
最大链接深度级别。
- `-L,--follow`
跟踪 HTTP 重定向
- `--ip host:port`
指定连接到的 IP 地址和端口,而不是 URL 中的主机。
- `-Z`
扫描模式(忽略连接错误)
- `--req-delay N`
设置请求的最大允许时间(单位:秒),默认是 90。
- `--conn-delay N`
设置连接到服务器的最大时间(单位:秒),默认是 90。
- `-A, --AA, --AAA`
等同于
- `--no-cache`
禁用插件缓存。每个请求都会被扫描。
- `--script=`
等同于 `--script=default`。
- `--script=<plugins>`
运行脚本扫描,`<plugins>` 是逗号分隔的插件文件或插件类别列表。
- `--script-help=<plugins>`
显示关于脚本的帮助信息。
- `--script-args n1=v1,...`
为脚本提供参数,例如:`--script-args grep.regex="<A href=\"(.*?)\">"`
- `-u url`
指定要请求的 URL。
- `-m iterator`
指定用于组合 payloads 的迭代器(默认为 product)。
- `-z payload`
为每个 FUZZ 关键字指定一个 payload。格式为 `name[,parameter][,encoder]`。可以使用编码器列表,如 `md5-sha1`,也可以链式使用编码器,如 `md5@sha1`。还可以使用编码器类别,如 `url`。
- `--zP <params>`
为指定的 payload 提供参数(必须以
- `--zD <default>`
为指定的 payload 提供默认参数(必须以
- `--zE <encoder>`
为指定的 payload 提供编码器(必须以
- `--slice <filter>`
使用指定的表达式过滤 payload 元素。必须与
- `-w wordlist`
指定一个字典文件(等同于 `-z file,wordlist`)。
- `-V alltype`
对所有参数进行暴力破解(allvars 和 allpost)。不需要使用 FUZZ 关键字。
- `-X method`
指定请求的 HTTP 方法,例如
- `-b cookie`
指定请求的 cookie。可以重复使用该选项来使用多个 cookies。
- `-d postdata`
使用 POST 数据(例如:"id=FUZZ&catalogue=1")。
- `-H header`
使用请求头(例如:"Cookie:id=1312321&user=FUZZ")。可以重复使用该选项来使用多个请求头。
- `--basic/ntlm/digest auth`
使用 "user:pass" 或 "FUZZ:FUZZ" 或 "domain\FUZ2Z:FUZZ" 格式的身份验证。
- `--hc/hl/hw/hh N[,N]+`
隐藏响应中指定代码、行、单词或字符(使用 BBB 表示基准值)。
- `--sc/sl/sw/sh N[,N]+`
显示响应中指定代码、行、单词或字符(使用 BBB 表示基准值)。
- `--ss/hs regex`
显示或隐藏响应中匹配指定正则表达式的内容。
- `--filter <filter>`
使用指定的过滤表达式显示或隐藏响应(使用 BBB 表示基准值)。
- `--prefilter <filter>`
在 fuzzing 之前使用指定的表达式过滤项。可以重复该选项来连接多个过滤器。
---
https://github.com/xmendez/wfuzz
### 关键词
#wfuzz #WebFuzzing #fuzz #payload #fuzzing工具 #安全测试
wfuzz 使用说明wfuzz 是一个用于 Web 应用程序模糊测试(fuzzing)的工具,主要用于发现 Web 应用中的漏洞,特别是在处理 HTTP 请求和响应时。以下是 wfuzz 的使用说明翻译。---
#### 基本信息
********************************************************
* Wfuzz 3.1.0 - Web Fuzzer *
* *
* 版本 1.4c 之前由: *
* Christian Martorella (cmartorella@edge-security.com) *
* Carlos del ojo (deepbit@gmail.com) *
* *
* 版本 1.4d 到 3.1.0 由: *
* Xavier Mendez (xmendez@edge-security.com) *
********************************************************---
#### 用法
Usage: wfuzz [options] -z payload,params <url>
FUZZ, ..., FUZnZ:这些关键字在使用时,`wfuzz` 会将它们替换为指定的 payload 中的值。
FUZZ{baseline_value}:将 FUZZ 替换为 baseline_value。它将是执行的第一个请求,并可以用作过滤的基础。---
#### 选项
- `-h/--help`
显示帮助信息
- `--help`
显示高级帮助
- `--filter-help`
显示过滤语言的说明
- `--version`
显示
wfuzz 版本信息- `-e <type>`
列出可用的编码器、payloads、迭代器、打印器和脚本
- `--recipe <filename>`
从指定的配方文件中读取选项。可以重复使用该选项来读取多个配方。
- `--dump-recipe <filename>`
将当前选项打印为配方文件
- `--oF <filename>`
将模糊测试结果保存到文件,稍后可以使用该文件中的 payload 进行处理。
- `-c`
使用颜色输出
- `-v`
输出详细信息
- `-f filename,printer`
使用指定的打印器(默认为 raw 打印器)将结果保存到输出文件中。
- `-o printer`
使用指定的打印器显示结果。
- `--interact`
(测试版)启用后,所有按键都会被捕获,允许与程序进行交互。
- `--dry-run`
打印请求的结果,但不实际发送 HTTP 请求。
- `--prev`
打印上一个 HTTP 请求(仅在使用生成 fuzz 结果的 payload 时可用)。
- `--efield <expr>`
显示指定的语言表达式和当前的 payload。可以重复使用该选项来显示多个字段。
- `--field <expr>`
只显示指定的语言表达式,而不显示 payload。可以重复使用该选项来显示多个字段。
- `-p addr`
使用代理,格式为 `ip:port:type`。可以重复该选项使用多个代理。类型可以是 SOCKS4、SOCKS5 或 HTTP,如果省略,默认为 HTTP。
- `-t N`
指定并发连接数(默认是 10)
- `-s N`
指定请求之间的延迟时间(默认是 0)
- `-R depth`
指定递归路径发现的最大递归深度。
- `-D depth`
最大链接深度级别。
- `-L,--follow`
跟踪 HTTP 重定向
- `--ip host:port`
指定连接到的 IP 地址和端口,而不是 URL 中的主机。
- `-Z`
扫描模式(忽略连接错误)
- `--req-delay N`
设置请求的最大允许时间(单位:秒),默认是 90。
- `--conn-delay N`
设置连接到服务器的最大时间(单位:秒),默认是 90。
- `-A, --AA, --AAA`
等同于
-v -c 和 `--script=default,verbose,discover`。- `--no-cache`
禁用插件缓存。每个请求都会被扫描。
- `--script=`
等同于 `--script=default`。
- `--script=<plugins>`
运行脚本扫描,`<plugins>` 是逗号分隔的插件文件或插件类别列表。
- `--script-help=<plugins>`
显示关于脚本的帮助信息。
- `--script-args n1=v1,...`
为脚本提供参数,例如:`--script-args grep.regex="<A href=\"(.*?)\">"`
- `-u url`
指定要请求的 URL。
- `-m iterator`
指定用于组合 payloads 的迭代器(默认为 product)。
- `-z payload`
为每个 FUZZ 关键字指定一个 payload。格式为 `name[,parameter][,encoder]`。可以使用编码器列表,如 `md5-sha1`,也可以链式使用编码器,如 `md5@sha1`。还可以使用编码器类别,如 `url`。
- `--zP <params>`
为指定的 payload 提供参数(必须以
-z 或 -w 前缀)。- `--zD <default>`
为指定的 payload 提供默认参数(必须以
-z 或 -w 前缀)。- `--zE <encoder>`
为指定的 payload 提供编码器(必须以
-z 或 -w 前缀)。- `--slice <filter>`
使用指定的表达式过滤 payload 元素。必须与
-z 一起使用。- `-w wordlist`
指定一个字典文件(等同于 `-z file,wordlist`)。
- `-V alltype`
对所有参数进行暴力破解(allvars 和 allpost)。不需要使用 FUZZ 关键字。
- `-X method`
指定请求的 HTTP 方法,例如
HEAD 或 `FUZZ`。- `-b cookie`
指定请求的 cookie。可以重复使用该选项来使用多个 cookies。
- `-d postdata`
使用 POST 数据(例如:"id=FUZZ&catalogue=1")。
- `-H header`
使用请求头(例如:"Cookie:id=1312321&user=FUZZ")。可以重复使用该选项来使用多个请求头。
- `--basic/ntlm/digest auth`
使用 "user:pass" 或 "FUZZ:FUZZ" 或 "domain\FUZ2Z:FUZZ" 格式的身份验证。
- `--hc/hl/hw/hh N[,N]+`
隐藏响应中指定代码、行、单词或字符(使用 BBB 表示基准值)。
- `--sc/sl/sw/sh N[,N]+`
显示响应中指定代码、行、单词或字符(使用 BBB 表示基准值)。
- `--ss/hs regex`
显示或隐藏响应中匹配指定正则表达式的内容。
- `--filter <filter>`
使用指定的过滤表达式显示或隐藏响应(使用 BBB 表示基准值)。
- `--prefilter <filter>`
在 fuzzing 之前使用指定的表达式过滤项。可以重复该选项来连接多个过滤器。
---
https://github.com/xmendez/wfuzz
### 关键词
#wfuzz #WebFuzzing #fuzz #payload #fuzzing工具 #安全测试
# AWD攻防赛参考思路
## 本次比赛环境
- **Windows+Linux组合模式**:
- Windows Server 2003 + Centos6.x/Ubuntu14/16.04/Ubuntu17.01
- Window7 + Centos6.x/Ubuntu14/16.04/Ubuntu17.01
- Windows Server 2008 + Centos6.x/Ubuntu14/16.04/Ubuntu17.01
## Windows加固
- **先备份**:Web源码、数据库
1. 445端口加固,开启防火墙或IP高级安全策略
2. 开启系统日志审计功能
3. 禁用guest账户、关闭文件共享
4. 确保启动项内容是可控的
5. 限制3389远程访问控制的连接数
在本地组策略编辑器中,依次展开:计算机配置 → 管理模板 → Windows组件 → 远程桌面服务 → 远程桌面会话主机 → 连接 → 限制连接的数量。
6. 使用工具监控关键目录文件:`文件操作监控.exe` /
7. 恶意代码文件查找,通过PCHunter, Monitor
8. Web目录环境查找相关可疑文件:jpg/png/rar,属性、解压
9. NTFS扫描磁盘查找隐藏的交换流数据
10. 查找系统所有账户信息,禁止非administrator账户
11. 修改Web站点管理员访问路径、默认口令、数据库口令
12. 安装WAF脚本,防护web站点,禁止其他漏洞
## Linux加固
- **先备份**:Web源码、数据库
1. 系统口令修改,团队统一口令
2. 通过`.bash_history`查找历史命令操作,发现痕迹
3. 查看计划任务:`crontab -l`;编辑计划任务:`crontab -e`
4. 查看`/etc/init.d/rc.local`中启动服务有无异常
5. 使用脚本开启进程监控、目录监控、流量监控
6. Web站点口令、站点管理员路径修改
7. 系统加固:`iptables`
- 进程线程:`netstat / ps -aux/netstat -apt`
- SSH:`w/fuser`
- 杀掉进程:`kill -9 pid`
## Mysql加固
1. 不使用默认口令,修改成复杂的,并确保和web环境连接
2. 设置只允许本地127.0.0.1账户登录
修改`bind-address=127.0.0.1`,在配置文件中加入`secure_file_priv=NULL`
3. 开启日志审计功能:`general_log_file=路径`
## Mssql加固
1. 删除不必要的账号
2. SQLServer用户口令安全
3. 根据用户分配帐号避免帐号共享
4. 分配数据库用户所需的最小权限
5. 网络访问限制
6. SQLServer登录审计
7. SQLServer安全事件审计
8. 配置日志功能
## 攻击准备
1. 各类CMS软件包最新版准备
2. 扫描工具:`nmap`、`nessus`、`metasploit`更新
3. 漏洞利用脚本:`poc`、`exp`
## Kali更新,解决签名问题:
## Windows提权
-
-
## Linux提权
- CVE-2017-6074 (DCCP双重释放漏洞 > 2.6.18)
- CVE-2016-5195(脏牛,kernel 2.6.22 < 3.9 (x86/x64))
- CVE-2016-8655(Ubuntu 12.04、14.04,Debian 7、8)
- CVE-2017-1000367(sudo本地提权漏洞)
- CVE-2016-1247(Nginx权限提升漏洞)
- CVE-2017-16995(Ubuntu16.04 kernel:4.14-4.4)
## 中间件服务器
- IIS
- Apache
- JBoss
- MySQL
- Nginx
- Tomcat
- WebLogic
## 集成服务环境
- WAMPServer
- XAMPPServer
## CMS列表参考
- 下载最新版本+每个CMS对应的漏洞poc、exp工具脚本文章,之后汇总:
- Apache
- ASPCMS
- Dedecms
- Dicuz
- Drupal
- EmpireCMS
- Eshop
- FineCMS
- Joomla
- LAMP
- Metainfo
- Nginx
- Phpcms
- Phpwind
- Qibocms
- Seacms
- Semcms
- Tomcat
- Wolfcms
- Wordpress
- Zabbix
## 参考链接
- [FreeBuf](http://freebuf.com/)
- [Huseck GitHub](https://github.com/Huseck)
- [Seebug](https://www.seebug.org/)
- [安全客](https://www.anquanke.com/)
- [Exploit-DB](https://www.exploit-db.com/)
- [Bugscan](http://www.bugscan.net/source/template/vulns/)
#AWD攻防赛 #加固策略 #Windows #Linux #MySQL #MSSQL #提权 #CMS #漏洞扫描 #安全工具
## 本次比赛环境
- **Windows+Linux组合模式**:
- Windows Server 2003 + Centos6.x/Ubuntu14/16.04/Ubuntu17.01
- Window7 + Centos6.x/Ubuntu14/16.04/Ubuntu17.01
- Windows Server 2008 + Centos6.x/Ubuntu14/16.04/Ubuntu17.01
## Windows加固
- **先备份**:Web源码、数据库
1. 445端口加固,开启防火墙或IP高级安全策略
2. 开启系统日志审计功能
3. 禁用guest账户、关闭文件共享
4. 确保启动项内容是可控的
5. 限制3389远程访问控制的连接数
在本地组策略编辑器中,依次展开:计算机配置 → 管理模板 → Windows组件 → 远程桌面服务 → 远程桌面会话主机 → 连接 → 限制连接的数量。
6. 使用工具监控关键目录文件:`文件操作监控.exe` /
御剑文件监控.exe7. 恶意代码文件查找,通过PCHunter, Monitor
8. Web目录环境查找相关可疑文件:jpg/png/rar,属性、解压
9. NTFS扫描磁盘查找隐藏的交换流数据
10. 查找系统所有账户信息,禁止非administrator账户
11. 修改Web站点管理员访问路径、默认口令、数据库口令
12. 安装WAF脚本,防护web站点,禁止其他漏洞
## Linux加固
- **先备份**:Web源码、数据库
1. 系统口令修改,团队统一口令
2. 通过`.bash_history`查找历史命令操作,发现痕迹
3. 查看计划任务:`crontab -l`;编辑计划任务:`crontab -e`
4. 查看`/etc/init.d/rc.local`中启动服务有无异常
5. 使用脚本开启进程监控、目录监控、流量监控
6. Web站点口令、站点管理员路径修改
7. 系统加固:`iptables`
- 进程线程:`netstat / ps -aux/netstat -apt`
- SSH:`w/fuser`
- 杀掉进程:`kill -9 pid`
## Mysql加固
1. 不使用默认口令,修改成复杂的,并确保和web环境连接
2. 设置只允许本地127.0.0.1账户登录
修改`bind-address=127.0.0.1`,在配置文件中加入`secure_file_priv=NULL`
3. 开启日志审计功能:`general_log_file=路径`
## Mssql加固
1. 删除不必要的账号
2. SQLServer用户口令安全
3. 根据用户分配帐号避免帐号共享
4. 分配数据库用户所需的最小权限
5. 网络访问限制
6. SQLServer登录审计
7. SQLServer安全事件审计
8. 配置日志功能
## 攻击准备
1. 各类CMS软件包最新版准备
2. 扫描工具:`nmap`、`nessus`、`metasploit`更新
3. 漏洞利用脚本:`poc`、`exp`
## Kali更新,解决签名问题:
wget -q -O - https://archive.kali.org/archive-key.asc | apt-key add
uname -a
cat /proc/version## Windows提权
-
ms17-017-
ms17-010## Linux提权
- CVE-2017-6074 (DCCP双重释放漏洞 > 2.6.18)
- CVE-2016-5195(脏牛,kernel 2.6.22 < 3.9 (x86/x64))
- CVE-2016-8655(Ubuntu 12.04、14.04,Debian 7、8)
- CVE-2017-1000367(sudo本地提权漏洞)
- CVE-2016-1247(Nginx权限提升漏洞)
- CVE-2017-16995(Ubuntu16.04 kernel:4.14-4.4)
## 中间件服务器
- IIS
- Apache
- JBoss
- MySQL
- Nginx
- Tomcat
- WebLogic
## 集成服务环境
- WAMPServer
- XAMPPServer
## CMS列表参考
- 下载最新版本+每个CMS对应的漏洞poc、exp工具脚本文章,之后汇总:
- Apache
- ASPCMS
- Dedecms
- Dicuz
- Drupal
- EmpireCMS
- Eshop
- FineCMS
- Joomla
- LAMP
- Metainfo
- Nginx
- Phpcms
- Phpwind
- Qibocms
- Seacms
- Semcms
- Tomcat
- Wolfcms
- Wordpress
- Zabbix
## 参考链接
- [FreeBuf](http://freebuf.com/)
- [Huseck GitHub](https://github.com/Huseck)
- [Seebug](https://www.seebug.org/)
- [安全客](https://www.anquanke.com/)
- [Exploit-DB](https://www.exploit-db.com/)
- [Bugscan](http://www.bugscan.net/source/template/vulns/)
#AWD攻防赛 #加固策略 #Windows #Linux #MySQL #MSSQL #提权 #CMS #漏洞扫描 #安全工具
nmap 扫描结果表明目标主机 192.168.153.130 上的端口 22 和 80 是开放的,分别提供 SSH 和 HTTP 服务。以下是详细分析:- **端口 22 (SSH)**:开放且正在运行 SSH 服务。
- **端口 80 (HTTP)**:开放且正在运行 HTTP 服务,扫描结果显示几个与安全相关的信息:
- **PHPSESSID Cookie**:未设置
httponly 标志,可能使会话信息更易受到 XSS 攻击。- **内部 IP 泄露**:HTTP 服务泄露了内部 IP 地址 `127.0.1.1`,可能暴露内部网络结构。
- **潜在目录**:`/images/` 目录可能包含敏感或有趣的文件,并且目录列表已启用,可能带来信息泄露风险。
- **Web 应用漏洞**:没有发现 CSRF、存储型 XSS 或 DOM 型 XSS 漏洞。
- **MAC 地址**:目标主机使用 VMware 虚拟机环境。
总的来说,目标主机有一些潜在的安全隐患,如会话标志未正确设置、内部 IP 泄漏以及可能暴露的目录列表。
#nmap #漏洞扫描 #SSH #HTTP #安全漏洞