web应用程序技术

目录

HTTP请求

HTTP响应

HTTP方法

HTTP消息头

状态码

编码方案

URL编码

Unicode编码

HTML编码

         Base64编码

        十六进制编码


HTTP请求


详解:

  Accept-Language表示浏览器所支持的语言类型;

  zh-cn表示简体中文;zh 表示中文;

  q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容,若没有指定 q 值,则默认为1,若被赋值为0,则用于提醒服务器哪些是浏览器不接受的内容类型。

  • 所有HTTP消息(请求与响应)中都包含一个或几个单行显示的消息头(header),然后是一

    个强制空白行,最后是消息主体(可选)。以下是一个典型的HTTP请求:

    GET /auth/488/YourDetails.ashx?uid=129 HTTP/l.1

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

    Referer: https://mdsec.net/auth/488/Home.ashx

    Accept-Language: zh-cn,zh;q=0.5

    User-Agent: Mozilla/4.0  (compatible; MSIE 8.0; Windows NT 6.1; WDW64;

    Trident/4.0;  SLCC2;.   NET CLR 2.0.50727;.   NET CLR 3.5.30729;   .NET CLR

    3.0.30729;  .NET4.OC;  InfoPath.3;  .NET4.OE;  FDM;。   NET CLR 1.1.4322)

    Accept-Encoding: gzip, deflate

    Host: mdsec.net

    Connection:  Keep-Alive

    Cookie:  SessionId=5870C7lF3FD4968935CDB6682E545476

    每个HTTP请求的第一行都由3个以空格间隔的项目组成。

  • GET一个说明HTTP方法的动词。最常用的方法为GET,它的主要作用是从Web服务器获取一个资源。GET请求并没有消息主体,因此在消息头后的空白行中没有其他数据。所请求的URL,通常由所请求的资源名称,以及一个包含客户端向该资源提交的参数的可选查询字符串组成。在该URL中,查询字符串以?字符标识,上面的示例中有一个名为uid、值为129的参数。使用的HTTP版本。因特网上常用的HTTP版本为1.0和1.1,多数浏览器默认使用1.1版本。这两个版本的规范之间存在一些差异;然而,当攻击Web应用程序时,渗透测试员可能遇到的唯一差异是1.1版本必须使用Host请求头。
  • Accept:浏览器支持的 MIME 类型分别是 text/html、application/xhtml+xml、application/xml 和 */*,优先顺序是它们从左到右的排列顺序(表示我当前的浏览器希望接受什么类型的文件,这是请求首部,当服务器没有客户端想要的资源的媒体类型时,会返回406 Not Acceptable 响应。当然使用了 */* 表示愿意接受任意类型的资源,所以应不会看到这个响应。另外,这里的 q 表示权重,权重在 0-1 之间,可以理解成客户端在这些给出的类型中,想优先接受什么类型,可以服务器就可以根据客户端的需要返回相应的资源。

      如果没有,则默认为 1 。这里前面几个类型都没有标明,则默认都是 1 ,表示优先这些类型,后面的 0.9 表示前面都没有就用这个,最后的 0.8 表示如果都没有,那么任意的类型都行)。

  • 详解:
  •   Accept表示浏览器支持的 MIME 类型;

      MIME的英文全称是 Multipurpose Internet Mail Extensions(多功能 Internet 邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。

      text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。

      Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;

      text/html表示 html 文档;

      Application:用于传输应用程序数据或者二进制数据;

      application/xhtml+xml表示 xhtml 文档;

      application/xml表示 xml 文档。

  • Referer(从哪到哪) 消息头用于表示发出请求的原始URL(例如,因为用户单击页面上的一个链接)。请注意,在最初的HTTP规范中,这个消息头存在拼写错误,并且这个错误一直保留了下来。
  • Accept-Language 浏览器支持的语言分别是中文和简体中文,优先支持简体中文。
  • User-Agent(客户端指纹信息)消息头提供与浏览器或其他生成请求的客户端软件有关的信息。请注意,由于历史原因,大多数浏览器中都包含Mozilla前缀。这是因为最初占支配地位的Netscape浏览器使用了User-Agent字符串,而其他浏览器也希望让Web站点相信它们与这种标准兼容。与计算领域历史上的许多怪异现象一样,这种现象变得很普遍,即使当前版本的Internet Explorer也保留了这一做法,示例的请求即由Internet Explorer提出。
  • Host(主机地址)消息头用于指定出现在被访问的完整URL中的主机名称。如果几个Web站点以相同的一台服务器为主机.就需要使用Host消息头.因为请求第一行中的URL内通常并不包含主机名称。
  • Accept-Encoding浏览器支持的压缩编码是 gzip 和 deflate
  • Cookie(自定义内容)消息头用于提交服务器向客户端发布的其他参数(请参阅本章后续内容了解更多详情)。
  • Connection表示持久的客户端与服务连接。
  • Upgrade-Insecure-Requests: 1该指令用于让浏览器自动升级请求从http到https,用于大量包含http资源的http网页直接升级到https而不会报错.简洁的来讲,就相当于在http和https之间起的一个过渡作用.
  • X_FORWARDED_FOR(伪造访问的ip)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。(请看图1)


HTTP响应


以下是一个典型的HTTP响应:

HTTP/1.1 200 OK

Date: Tue, 19 Apr 2011 09:23:32 GMT

Server: Microsoft-IIS/6.0

X-Powered-By: ASP.NET

Set-Cookie:  tracking=tI8rk7joMx44S2Uu85nSWc

X-AspNet-Version:  2.0.50727

Cache-Control: no-cache

Pragma: no-cache

Expires: Thu, 01 Jan 1970 00:00:00 GMT

Content-Type:  text/html; charset=utf-8

Content-Length:  1067

<IDOCTYPE html PUBLIC一//W3C//DTD XHTML 1.0 Transitional//EN二http://

www.w3.org/TR/xhtmll/DTD/xhtmll一transitional.dtd"><html xmlns="http://

www.w3.ora/1999/xhtml* ><head><title>Your details</title>

每个HTTP响应的第一行由3个以空格间隔的项目组成。

  • 使用的HTTP版本。
  • 表示请求结果的数字状态码。200是最常用的状态码.它表示成功提交了请求,正在返回所请求的资源。
  • 一段文本形式的“原因短语”,进一步说明响应状态。这个短语中可包含任何值,当前浏览器不将其用于任何目的。
  • 响应示例中的其他一些要点如下:
  • Server消息头中包含一个旗标,指明所使用的Web服务器软件。有时还包括其他信息.如所安装的模块和服务器操作系统。其中包含的信息可能并不准确。
  • Set-Cookie消息头向浏览器发送另一个cookie.它将在随后向服务器发送的请求中由Cookie消息头返回。
  • Pragma消息头指示浏览器不要将响应保存在缓存中。Expires消息头指出响应内容已经过期.因此不应保存在缓存中。当返回动态内容时常常会发送这些指令,以确保浏览器随时获得最新内容。
  • 几乎所有的HTTP响应在消息头后的空白行下面都包含消息主体,Content-Type消息头示这个消息主体中包含一个HTML文档。
  • Content-Length消息头规定消息主体的字节长度。
  • ETag: W/"59a3dc83-f61" 浏览器根据HTTP请求的ETag验证请求的资源是否发生了改变,如果它未发生变化,服务器将返回“304 Not Modified”响应,并且资源从浏览器缓存中读取,这样就不必再次下载请求。
  • Vary:Accept-Encoding”标头,表示网站一般启用了GZip压缩
  • Expires是RFC 2616(HTTP/1.0)协议中和网页缓存相关字段。用来控制缓存的失效日期。

HTTP方法


当渗透测试员攻击Web应用程序时,几乎肯定会遇到最常用的方法:GET和POST。这些方法之间存在一些必须了解的重要差异,忽略这些差异可能会危及应用程序的安全。

GET(请求获取服务器资源)方法的作用在于获取资源。它可以用于URL查询字符串的形式向所请求的资谏发送参数。这使用户可将一个包含动态资源的URL标注为书签,用户自己或其他用户随后可重复利用该书签来获取等价的资源(作用与标注为书签的搜索查询相似)。URL显示在屏幕上.并被记录在许多地方,如浏览器的历史记录和Web服务器的访问日志中。如果单击外部链接,还可以用Referer消息头将它们传送到其他站点。因此,请勿使用查询字符申传送任何敏感信息。

POST(提交)方法的主要作用是执行操作。使用这个方法可以在URL查询字符申与消息主体中发送请求参数。尽管仍然可以将URL标注为书签,但书签中并不包含消息主体发送的任何参数。许多维护URL日志的位置及Referer消息头也将这些参数排除在外。因为POST方法旨在执行操作,如果用户单击浏览器上的“后退”按钮,返回一个使用这种方法访问的页面,那么浏览器不会自动重新发送请求,而是就即将发生的操作向用户发出带告.如图3-1所示。这样做可防止用户无意中多次执行同一个操作。因此.在执行某一操作时必须使用POST请求。

图 3-1 浏览器不会自动重新发送用户提出的POST请求,因为这样做会导致多次执行某一操作

2.请求消息头

3.响应消息头

  • 除了GET和POST方法以外.HTTP协议还支持许多其他因特殊目的而建立的方法。需要了解
  • 的其他方法如下:
  • HEAD(快,没有消息头,跟get相似)这个方法的功能与GET方法相似,不同之处在于服务器不会在其响应中返回消息主体。服务器返回的消息头应与对应GET请求返回的消息头相同。因此,这种方法可用于检查某一资源在向其提交GET请求前是否存在。
  • TRACE.这种方法主要用于诊断。服务器应在响应主体中返回其收到的请求消息的具体内容。这种方法可用于检测客户端与服务器之间是否存在任何操纵请求的代理服务器。
  • OPTIONS(看中间件支持哪些http方法)这种方法要求服务器报告对某一特殊资源有效的HTTP方法。服务器通常返回一个包含Allow消息头的响应,并在其中列出所有有效的方法。
  • PUT(传文件)这个方法试图使用包含在请求主体中的内容,向服务器上传指定的资源。如果激活这个方法,渗透测试员就可以利用它来攻击应用程序。例如,通过上传任意一段脚本并在服务器上执行该脚本来攻击应用程序。
  • 还有许多其他与攻击Web应用程序没有直接关系的HTTP方法。然而,如果激活某些危险的方法,Web服务器可能面临攻击风险。

  • HTTP消息头


  • HTTP支持许多不同的消息头,其中一些专用于特殊用途。一些消息头可用在请求与响应中,而其他一些消息头只能专门用在某个特定的消息中。下面列出渗透测试员在攻击Web应用程序时可能遇到的消息头。

    1.常用消息头

  • Connection。这个消息头用于告诉通信的另一端.在完成HTTP传输后是关闭TCP连接,还是保持连接开放以接收其他消息。
  • Content-Encoding。这个消息头为消息主体中的内容指定编码形式(如gzip ),一些应用程序使用它来压缩响应以加快传输速度。
  • Content-Length。这个消息头用于规定消息主体的字节长度。(HEAD语法的响应例外.它在对应的GET请求的响应中指出主体的长度。
  • Content-Type。这个消息头用于规定消息主体的内容类型。例如,HTML文档的内容类型为text/html,
  • Transfer-Encoding。这个消息头指定为方便其通过HTTP传输而对消息主体使用的任何编码。如果使用这个消息头.通常用它指定了编码。
  • Accept(支持哪些mime)。这个消息头用于告诉服务器客户端愿意接受哪些内容,如图像类型、办公文档格式等。
  • Accept-Encoding。这个消息头用于告诉服务器.客户端愿意接受哪些内容编码。
  • Authorization。这个消息头用于为一种内置HTTP身份验证向服务器提交证书。
  • Cookie。这个消息头用于向服务器提交它以前发布的cookie.
  • Host(访问某网页的ip地址)。这个消息头用于指定出现在所请求的完整URL中的主机名称。
  • If-Modified-Since。这个消息头用于说明浏览器最后一次收到所请求的资源的时间。如果自那以后资源没有发生变化,服务器就会发出一个带状态码304的响应,指示客户端使用资源的缓存副本。
  • If-None-Match。这个消息头用于指定一个实体标签。实体标签是一个说明消息主体内容的标识符。当最后一次收到所请求的资源时.浏览器提交服务器发布的实体标签。服务器可以使用实体标签确定浏览器是否使用资源的缓存副本。
  • Origin。这个消息头用在跨域Ajax求中,用于指示提出请求的域。
  • Referer(重定向,上级页面的ip)。这个消息头用于指示提出当前请求的原始URL。
  • User-Agent(客户端指纹)。这个消息头提供与浏览器或生成请求的其他客户端软件有关的信息。
  • Access-Control-Allow-Origin.这个消息头用于指示可否通过跨域Ajax请求获取资源
  • Cache-Control。这个消息头用于向浏览器传送缓存指令(如no-cache)。
  • ETag。这个消息头用于指定一个实体标签。客户端可在将来的请求中提交这个标识符。获得和If-None-Match消息头中相同的资源,通知服务器浏览器当前缓存中保存的是哪个版本的资源。
  • Expires。这个消息头用于向浏览器说明消息主体内容的有效时间。在这个时间之前,浏览器可以使用这个资源的缓存副本。
  • Location(重定向)这个消息头用于在重定向响应(那些状态码以3开头的响应)中说明重定向的目标。
  • Pragma。这个消息头用于向浏览器传送缓存指令(如no-cache).
  • Server。这个消息头提供所使用的Web服务器软件的相关信息。
  • Set-Cookie。这个消息头用于向浏览器发布cookie.浏览器会在随后的请求中将其返回给服务器。(secure:仅https能提交cookie;http only 无法通过客户端js直接访问cookie)
  • WWW-Authenticate(身份验证如登录)这个消息头用在带401状态码的响应中,提供与服务器所支持的身份验证类型有关的信息。
  • X-Frame-Options。这个消息头指示浏览器框架是否及如何加载当前响应。

cookie

cookie是大多数Web应用程序所依赖的HTTP协议的一个关键组成部分,攻击者常常通过它来

利用Web应用程序中的漏洞。服务器使用cookie机制向客户端发送数据,客户端保存cookie并将其返回给服务器。与其他类型的请求参数(存在于URL查询字符串或消息主体中)不同,无须应用程序或用户采取任何特殊措施.随后的每一个请求都会继续重新向服务器提交cookie:

如前所述.服务器使用Set-Cookie响应消息头发布cookie:

      Set-Cookie:  tracking=tI8rk7joMx44S2Uu85nSWc

然后.用户的浏览器自动将下面的消息头进行添加,随后返回给同一服务器的请求中:

  Cookie:  tracking=tl8rk7joMx44S2Uu85nSWc

如上所示.cookie一般由一个名/值对构成,但也可包含任何不含空格的字符串。可以在服务

器响应中使用几个Set-Cookie消息头发布多个cookie.并可在同一个Cookie消息头中用分号分隔不同的cookie,将它们全部返回给服务器。

除cookie的实际位外,Set-Cookie消息头还可包含以下任何可选属性,用它们控制浏览器处理cookie的方式。

  • expires。用于设定cookie的有效时间。这样会使浏览器将cookie保存在永久性的存储器中,在随后的浏览器会话中重复利用.直到到期时间为止。如果没有设定这个属性,那么cookie仅用在当前浏览器会话中。
  • domain。用于指定cookie的有效域。这个域必须和收到cookie的域相同,或者是它的父域。
  • path。用于指定cookie的有效URL路径。
  • secure。如果设置这个属性.则仅在HTTPS请求中提交cookie.
  • Httponly。如果设置这个属性,将无法通过客户端JavaScript直接访问cookie.

    上述每一个cookie属性都可能影响应用程序的安全.其造成的主要不利影响在于攻击者能够

直接对应用程序的其他用户发动攻击。


状态码


  • 每条HTTP响应消息都必须在第一行中包含一个状态码,说明请求的结果。根据代码的第一
  • 位数字,可将状态码分为以下5类。
  • 1xx -提供信息。
  • 2xx—请求被成功提交。
  • 3xx—客户端被重定向到其他资源。
  • 4xx -请求包含某种错误。
  • 5xx—服务器执行请求时遇到错误。
  • 还有大量特殊状态码,其中许多状态码仅用在特殊情况下。下面列出渗透测试员在攻击Web
  • 应用程序时最有可能遇到的状态码及其相关的原因短语。
  • 100 Continue。当客户端提交一个包含主体的请求时.将发送这个响应。该响应表示已收到请求消息头.客户端应继续发送主体。请求完成后,再由服务器返回另一个响应。
  • 200 Ok。本状态码表示已成功提交请求,且响应主体中包含请求结果。
  • 201 Created. PUT请求的响应返回这个状态码,表示请求已成功提交。
  • 301 Moved Permanently本状态码将浏览器永久重定向到另外一个在Location消息头中指定的URL。以后客户端应使用新URL替换原始URL。
  • 302 Found。本状态码将浏览器暂时重定向到另外一个在Location消息头中指定的URL.客户端应在随后的请求中恢复使用原始URL.
  • 304 Not Modified。本状态码指示浏览器使用缓存中保存的所请求资源的副本。服务器使用If-Modified-Since与工f-None-Match消息头确定客户端是否拥有最新版本的资源。
  • 400 Bad Request。本状态码表示客户端提交了一个无效的HTTP请求。当以某种无效的方式修改请求时(例如在URL中插人一个空格符),可能会遇到这个状态码。
  • 401 Unauthorized.服务器在许可请求前要求HTTP进行身份验证。WWW-Authenticate消息头详细说明所支持的身份验证类型。
  • 403 Forbidden。本状态码指出,不管是否通过身份验证,禁止任何人访问被请求的资源。
  • 404 Not Found。本状态码表示所请求的资源并不存在。
  • 405 Method Not Allowed。本状态码表示指定的URL不支持请求中使用的方法。例如,如果试图在不支持PUT方法的地方使用该方法,就会收到本状态码。
  • 413 Request Entity Too Large。如果在本地代码中探查缓冲器滋出瀚洞并就此提交超长数据串.则本状态码表示请求主体过长,服务器无法处理。
  • 414 Request URI Too Long。与前一个响应类似,本状态码表示请求中的URL过长,服务器无法处理。
  • 500 Internal Server Error。本状态码表示服务器在执行请求时遇到错误。当提交无法预料的输人、在应用程序处理过程中造成无法处理的错误时,通常会收到本状态码。应该仔细检查服务器响应的所有内容,了解与错误性质有关的详情。
  • 503 Service Unavailable。通常,本状态码表示尽管Web服务器运转正常.并且能够响应请求,但服务器访问的应用程序还是无法作出响应。应该进行核实,是否因为执行了某种行为而造成这个结果。
  • 总结
  • 1XX 提供信息
  • 2XX 请求被成功提交
  • 3XX 客户端被重定向到其它资源
  • 4XX url无效/权限无/资源无
  • 5XX 服务器无法处理/识别

编码方案


URL编码

  • URL只允许使用US-ASCII字符集中的可打印字符(也就是ASCII代码在0x20一Ox7e范围内的字符))。而且,由于URL方案或HTTP协议内具有特殊含义.这个范围内的一些字符也不能用在URL中。
  • URL编码方案主要用于对扩展ASCII字符集中的任何有问题的字符进行编码,使其可通过HTTP安全传输。任何URL编码的字符都以%为前缀,其后是这个字符的两位十六进制ASCII代码。以下是一些常见的URL编码字符:(特征:固定死的)
  • %3d代表=;
  • %25代表%;
  • %20代表空格:
  • %0a代表换行;
  • %00代表空字节。
  • 另一个值得注意的编码字符是加号(+).它代表URL编码的空格(除%20。代表空格外))o

Unicode编码

或者使用十六进制的ASCII码(以x为前缀),例如:

当攻击Web应用程序时,HTML编码主要在探查跨站点脚本漏洞时发挥作用。如果应用程序在响应中返回未被修改的用户输人,那么它可能易于受到攻击;但是,如果它对危险字符进行HTML编码也许比较安全。

此外,任何字符都可以使用它的十进制ASCII码进行HTML编码.例如:

  • Unicode是一种为支持全世界所使用的各种编写系统而设计的字符编码标准,它采用各种编码方案.其中一些可用于表示Web应用程序中的不常见字符。
  • 16位Unicode编码的工作原理与URL编码类似。为通过HTTP进行传输.16位Unicode编码的字符以,u为前缀,其后是这个字符的十六进制Unicode码点。例如:
  • %u2215代/
  • %u00e9代表
  • UTF-8是一种长度可变的编码标准.它使用一个或几个字节表示每个字符。为通过HTTP进行传输,UTF-8编码的多字节字符以毛为前缀,其后用十六进制表示每个字节。例如:
  • %c2%a9代表 ;
  • %e2%89%a0代表 。
  • 攻击Web应用程序时之所以要用到Unicode编码,主要在于有时可用它来破坏输入确认机制。如果输入过滤阻止了某些恶意表达式.但随后处理输入的组件识别Unicode编码,就可以使用各种标准与畸形Unicode编码避开过滤。

  • HTML编码

    HTML编码是一种用于表示问题字符以将其安全并入HTML文档的方案。有许多字符具有特殊的含义(如HTML内的元字符),并被用于定义文档结构而非其内容。为了安全使用这些字符并将其用在文档内容中,就必须对其进行HTML编码。(防文字跟符号冲突)

    HTML编码定义了大量HTML实体来表示特殊的字面量字符.例如:

  • &quot;代表”;
  • &apos:代表’;
  • &amp;代表&;
  • &lt;代表<;
  • &g:;代表>。
  • &#34;代表”:
  • #39;代表’。
  • &#x22;代表”;
  • &#x27;代表’。
  • 当攻击Web应用程序时,HTML编码主要在探查跨站点脚本漏洞时发挥作用。如果应用程序在响应中返回未被修改的用户输人,那么它可能易于受到攻击;但是,如果它对危险字符进行HTML编码也许比较安全。
  • 此外,任何字符都可以使用它的十进制ASCII码进行HTML编码.例如:

Base64编码

Base64编码仅用一个可打印的ASCII字符就可安全转换任何二进制数据.它常用于对电子邮件附件进行编码,使其通过SMTP安全传输。它还可用于在基本HTTP验证机制中对用户证书进行编码。

Base64编码将输人数据转换成3个字节块。每个块被划分为4段,每段6个数据位。这6个数据位有64种不同的排列组合,因此每个段可使用一组64个字符表示。Base64编码使用以下字符集其中只包含可打印的ASCII字符:(特征:一段英文+“==”)

      ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopgrstuvwxyz0123456789-/

如果最后的输人数据块不能构成3段输出数据,就用一个或两个等号(=)补足输出。

例如,The Web Application Hacker's Hand book的Base64编码为:

      VGh1IFdlYiBBcHBsaWNhdGlvbiBIYWNrZXIncyBIYW5kYm9vaw==

许多Web应用程序利用Base64编码在cookie与其他参数中传送二进制数据,甚至用它打乱敏感数据以防止即使是细微的修改。应该总是留意并解码发送到客户端的任何Base64数据。由于这些数据使用特殊的字符集,而且有时会在字符串末尾添加补足字符(二),因此可以轻易辨别出Base64编码的字符串。


十六进制编码

许多应用程序在传送二进制数据时直接使用十六进制编码,用ASCII字符表示十六进制数据

块。例如,对cookie中的用户名daf进行十六进制编码,会得到以下结果:(特征:OX开头)

646166

    和Base64编码的数据一样,十六进制编码的数据通常也很容易辨认。为了解十六进制编码的

功能应当对服务器发送到客户端的任何十六进制数据进行解码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值