- 对所有用户输入进行严格的过滤,避免注入恶意脚本。
- 对输出数据进行编码或转义,防止脚本执行。
#### 漏洞修复
```php
<?php
// 使用prepared statements 防止SQL注入,同时对用户输入进行htmlspecialchars转义
$comment = htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');
$query = "INSERT INTO comments (content) VALUES ('$comment')";
mysql_query($query);
```
### DOM型XSS (DOM-based XSS)
#### 漏洞点
DOM型XSS是指攻击者通过操作页面中的DOM(文档对象模型)来注入恶意代码。它发生在客户端(浏览器端)而不是服务器端,通常是在JavaScript中直接操控DOM时未对输入进行适当的验证或过滤。
#### 漏洞代码
```html
<!-- 用户提交的数据直接写入到DOM -->
<script>
var userInput = location.search.substring(1); // 从URL获取用户输入
document.getElementById('output').innerHTML = userInput; // 直接插入到页面中
</script>
```
#### 漏洞产生的危害
- **脚本执行**:通过操控DOM,恶意脚本可以在浏览器中执行,窃取用户敏感信息、进行钓鱼攻击等。
- **XSS持久化**:即使用户刷新页面,恶意脚本仍然会在页面中执行。
#### 漏洞产生的原因
- **直接将用户输入插入到DOM**:没有对输入进行适当的过滤或转义,导致恶意脚本的执行。
- **不安全的JavaScript操作**:使用如`innerHTML`、`document.write()`等不安全的方式处理用户输入。
#### 修复思路
- 避免直接插入用户输入到DOM中,使用更安全的API,如`textContent`或`createElement`。
- 对用户输入进行严格的验证和过滤。
#### 漏洞修复
```html
<script>
var userInput = location.search.substring(1);
document.getElementById('output').textContent = userInput; // 使用textContent来防止XSS攻击
</script>
```
### 前端外部文件引用
#### 漏洞点
前端外部文件引用漏洞通常指网站的外部脚本、CSS文件或其他资源文件没有进行适当的验证,攻击者可以通过修改这些外部文件,或者通过引入恶意文件,向用户页面注入恶意代码。
#### 漏洞代码
```html
<!-- 不安全的外部文件引用 -->
<script src="http://example.com/malicious.js"></script>
```
#### 漏洞产生的危害
- **恶意代码执行**:如果外部文件引用的是恶意文件,攻击者可以通过外部脚本执行恶意代码。
- **第三方攻击**:攻击者可能通过篡改第三方脚本或通过CDN等恶意引入文件,危害用户安全。
- **数据泄露**:攻击者可能通过篡改的脚本窃取用户敏感信息或劫持会话。
#### 漏洞产生的原因
- **不验证外部资源**:引用外部资源时没有验证其来源,可能导致恶意文件被加载。
- **使用不安全的HTTP协议**:通过HTTP协议加载外部资源,可能被中间人攻击篡改文件内容。
#### 修复思路
- 确保外部文件引用的来源是可信的,并通过HTTPS协议加载。
- 使用SRI(Subresource Integrity)机制验证外部文件的完整性。
#### 漏洞修复
```html
<script src="https://example.com/malicious.js" integrity="sha384-..." crossorigin="anonymous"></script>
```
通过对输入输出进行适当的过滤和编码、限制不受信任的外部资源,能够有效防止各种类型的XSS漏洞。
#xss #反射型XSS #储存型XSS #DOM型XSS #前端外部文件引用
## SSRF
### SSRF(服务端请求伪造)漏洞
#### 漏洞点
服务端请求伪造(SSRF)漏洞是指攻击者能够通过在服务器端发起恶意请求,从而访问服务器内部的网络资源或外部敏感数据。这类漏洞通常发生在应用程序允许用户提供URL或IP地址,并通过服务器发起请求时。如果没有对用户输入进行严格控制,攻击者可以构造恶意请求,访问本应受保护的资源。
#### 漏洞代码
```php
<?php
$url = $_GET['url']; // 用户输入的URL
$response = file_get_contents($url); // 服务器端发起请求
echo $response;
```
#### 漏洞产生的危害
- **访问内网资源**:攻击者可以通过构造请求访问公司内网或服务器的敏感资源,如数据库、管理接口等。
- **信息泄露**:通过SSR攻击,攻击者可以获取本应受到保护的服务器内部信息或系统配置文件。
- **恶意请求外部服务**:攻击者可以将请求重定向到外部恶意服务器,进行数据泄露或发起拒绝服务攻击(DoS)。
- **绕过防火墙**:攻击者可以利用SSR漏洞绕过外部防火墙或访问控制,直接向受限制的内部网络发起请求。
#### 漏洞产生的原因
- **没有对用户输入进行验证**:应用程序允许用户输入URL并直接发起请求,攻击者可以通过输入恶意URL来控制请求行为。
- **缺乏目标验证和白名单**:没有对用户输入的URL进行验证,服务器无法区分合法请求和恶意请求。
- **内部网络未隔离**:未采取适当的隔离措施,导致内部服务容易受到外部攻击者利用。
#### 修复思路
1. **最小化修改**:在修复时,应尽量避免对现有系统进行大规模重构,重点关注对输入URL的验证和请求限制,以确保修复不会破坏现有功能。
2. **URL验证与过滤**:对用户输入的URL进行严格验证,限制访问内部资源,并确保外部请求仅能访问受信任的URL。
3. **使用白名单**:限制应用只能发起请求到白名单中的可信URL,防止攻击者访问不允许的内部网络或恶意站点。
4. **避免使用不安全的函数**:避免使用如`file_get_contents()`、`curl_exec()`等不安全的函数,替换为更安全的请求方式。
#### 漏洞修复
##### 1. **URL验证与过滤
修复方法:限制请求的URL只允许访问外部网站,禁止访问内部资源。
<?php
// 定义允许访问的域名白名单
$allowed_domains = ['example.com', 'api.trustedsite.com'];
// 获取用户输入的URL
$url = $_GET['url'];
// 解析URL,提取主机名
$parsed_url = parse_url($url);
$host = $parsed_url['host'];
// 检查主机是否在白名单中
if (in_array($host, $allowed_domains)) {
$response = file_get_contents($url);
echo $response;
} else {
die('不允许访问该资源');
}
解释**:
- 使用`parse_url()`提取URL中的主机名(host),并通过白名单验证主机名是否合法,防止访问内部资源。
##### 2. **限制请求的协议类型
修复方法:仅允许访问HTTP或HTTPS协议的外部资源,防止请求本地或内部网络资源。
<?php
$url = $_GET['url'];
$parsed_url = parse_url($url);
// 检查协议是否为HTTP或HTTPS
if (in_array($parsed_url['scheme'], ['http', 'https'])) {
$response = file_get_contents($url);
echo $response;
} else {
die('不允许访问非HTTP/HTTPS协议的资源');
}
解释**:
- 通过检查`scheme`(协议类型)仅允许HTTP或HTTPS协议,防止恶意用户通过本地协议(如`file://`、`ftp://`)访问内部资源。
##### 3. **使用cURL进行更安全的请求
修复方法:避免使用`file_get_contents()`,使用`cURL`进行更细粒度的控制,确保请求安全。
<?php
$url = $_GET['url'];
$parsed_url = parse_url($url);
- 对输出数据进行编码或转义,防止脚本执行。
#### 漏洞修复
```php
<?php
// 使用prepared statements 防止SQL注入,同时对用户输入进行htmlspecialchars转义
$comment = htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');
$query = "INSERT INTO comments (content) VALUES ('$comment')";
mysql_query($query);
```
### DOM型XSS (DOM-based XSS)
#### 漏洞点
DOM型XSS是指攻击者通过操作页面中的DOM(文档对象模型)来注入恶意代码。它发生在客户端(浏览器端)而不是服务器端,通常是在JavaScript中直接操控DOM时未对输入进行适当的验证或过滤。
#### 漏洞代码
```html
<!-- 用户提交的数据直接写入到DOM -->
<script>
var userInput = location.search.substring(1); // 从URL获取用户输入
document.getElementById('output').innerHTML = userInput; // 直接插入到页面中
</script>
```
#### 漏洞产生的危害
- **脚本执行**:通过操控DOM,恶意脚本可以在浏览器中执行,窃取用户敏感信息、进行钓鱼攻击等。
- **XSS持久化**:即使用户刷新页面,恶意脚本仍然会在页面中执行。
#### 漏洞产生的原因
- **直接将用户输入插入到DOM**:没有对输入进行适当的过滤或转义,导致恶意脚本的执行。
- **不安全的JavaScript操作**:使用如`innerHTML`、`document.write()`等不安全的方式处理用户输入。
#### 修复思路
- 避免直接插入用户输入到DOM中,使用更安全的API,如`textContent`或`createElement`。
- 对用户输入进行严格的验证和过滤。
#### 漏洞修复
```html
<script>
var userInput = location.search.substring(1);
document.getElementById('output').textContent = userInput; // 使用textContent来防止XSS攻击
</script>
```
### 前端外部文件引用
#### 漏洞点
前端外部文件引用漏洞通常指网站的外部脚本、CSS文件或其他资源文件没有进行适当的验证,攻击者可以通过修改这些外部文件,或者通过引入恶意文件,向用户页面注入恶意代码。
#### 漏洞代码
```html
<!-- 不安全的外部文件引用 -->
<script src="http://example.com/malicious.js"></script>
```
#### 漏洞产生的危害
- **恶意代码执行**:如果外部文件引用的是恶意文件,攻击者可以通过外部脚本执行恶意代码。
- **第三方攻击**:攻击者可能通过篡改第三方脚本或通过CDN等恶意引入文件,危害用户安全。
- **数据泄露**:攻击者可能通过篡改的脚本窃取用户敏感信息或劫持会话。
#### 漏洞产生的原因
- **不验证外部资源**:引用外部资源时没有验证其来源,可能导致恶意文件被加载。
- **使用不安全的HTTP协议**:通过HTTP协议加载外部资源,可能被中间人攻击篡改文件内容。
#### 修复思路
- 确保外部文件引用的来源是可信的,并通过HTTPS协议加载。
- 使用SRI(Subresource Integrity)机制验证外部文件的完整性。
#### 漏洞修复
```html
<script src="https://example.com/malicious.js" integrity="sha384-..." crossorigin="anonymous"></script>
```
通过对输入输出进行适当的过滤和编码、限制不受信任的外部资源,能够有效防止各种类型的XSS漏洞。
#xss #反射型XSS #储存型XSS #DOM型XSS #前端外部文件引用
## SSRF
### SSRF(服务端请求伪造)漏洞
#### 漏洞点
服务端请求伪造(SSRF)漏洞是指攻击者能够通过在服务器端发起恶意请求,从而访问服务器内部的网络资源或外部敏感数据。这类漏洞通常发生在应用程序允许用户提供URL或IP地址,并通过服务器发起请求时。如果没有对用户输入进行严格控制,攻击者可以构造恶意请求,访问本应受保护的资源。
#### 漏洞代码
```php
<?php
$url = $_GET['url']; // 用户输入的URL
$response = file_get_contents($url); // 服务器端发起请求
echo $response;
```
#### 漏洞产生的危害
- **访问内网资源**:攻击者可以通过构造请求访问公司内网或服务器的敏感资源,如数据库、管理接口等。
- **信息泄露**:通过SSR攻击,攻击者可以获取本应受到保护的服务器内部信息或系统配置文件。
- **恶意请求外部服务**:攻击者可以将请求重定向到外部恶意服务器,进行数据泄露或发起拒绝服务攻击(DoS)。
- **绕过防火墙**:攻击者可以利用SSR漏洞绕过外部防火墙或访问控制,直接向受限制的内部网络发起请求。
#### 漏洞产生的原因
- **没有对用户输入进行验证**:应用程序允许用户输入URL并直接发起请求,攻击者可以通过输入恶意URL来控制请求行为。
- **缺乏目标验证和白名单**:没有对用户输入的URL进行验证,服务器无法区分合法请求和恶意请求。
- **内部网络未隔离**:未采取适当的隔离措施,导致内部服务容易受到外部攻击者利用。
#### 修复思路
1. **最小化修改**:在修复时,应尽量避免对现有系统进行大规模重构,重点关注对输入URL的验证和请求限制,以确保修复不会破坏现有功能。
2. **URL验证与过滤**:对用户输入的URL进行严格验证,限制访问内部资源,并确保外部请求仅能访问受信任的URL。
3. **使用白名单**:限制应用只能发起请求到白名单中的可信URL,防止攻击者访问不允许的内部网络或恶意站点。
4. **避免使用不安全的函数**:避免使用如`file_get_contents()`、`curl_exec()`等不安全的函数,替换为更安全的请求方式。
#### 漏洞修复
##### 1. **URL验证与过滤
修复方法:限制请求的URL只允许访问外部网站,禁止访问内部资源。
<?php
// 定义允许访问的域名白名单
$allowed_domains = ['example.com', 'api.trustedsite.com'];
// 获取用户输入的URL
$url = $_GET['url'];
// 解析URL,提取主机名
$parsed_url = parse_url($url);
$host = $parsed_url['host'];
// 检查主机是否在白名单中
if (in_array($host, $allowed_domains)) {
$response = file_get_contents($url);
echo $response;
} else {
die('不允许访问该资源');
}
解释**:
- 使用`parse_url()`提取URL中的主机名(host),并通过白名单验证主机名是否合法,防止访问内部资源。
##### 2. **限制请求的协议类型
修复方法:仅允许访问HTTP或HTTPS协议的外部资源,防止请求本地或内部网络资源。
<?php
$url = $_GET['url'];
$parsed_url = parse_url($url);
// 检查协议是否为HTTP或HTTPS
if (in_array($parsed_url['scheme'], ['http', 'https'])) {
$response = file_get_contents($url);
echo $response;
} else {
die('不允许访问非HTTP/HTTPS协议的资源');
}
解释**:
- 通过检查`scheme`(协议类型)仅允许HTTP或HTTPS协议,防止恶意用户通过本地协议(如`file://`、`ftp://`)访问内部资源。
##### 3. **使用cURL进行更安全的请求
修复方法:避免使用`file_get_contents()`,使用`cURL`进行更细粒度的控制,确保请求安全。
<?php
$url = $_GET['url'];
$parsed_url = parse_url($url);