软件测试和质量管理——课设4

 《软件测试项目实践任务书》

 章节一至四(单元测试):软件测试和质量管理——课设1-CSDN博客

章节五(功能测试):软件测试和质量管理——课设2-CSDN博客

章节六(性能测试):软件测试和质量管理——课设3-CSDN博客

章节七(安全测试)至八:https://blog.csdn.net/qq_53229521/article/details/137379060?spm=1001.2014.3001.5502 

【目的】

通过本课程的学习,要求学生掌握软件测试的基本概念、基本理论,能够根据测试任务,制定测试计划,设计测试用例集,搭建测试环境,完成单元测试、功能测试、性能测试、安全测试,获取测试结果并总结,撰写缺陷报告和综合测试报告,达到本课程的课程目标。

课程目标1:了解软件测试应用领域的相关科技文化、科技发展动态,增强“科技强国”的担当意识;认识信息化、智能化、自动化在软件测试技术发展中应用和体现,感知科学技术是第一生产力在软件测试技术中的体现;在锻炼实践动手能力的过程中培养创新意识。

课程目标2:学习软件测试的基本概念与基本原理,熟悉软件质量管理的基本概念和实施过程,理解软件测试在工程应用中的实践意义。运用测试基础知识和理论,分析测试需求、制定测试方案和测试计划、设计测试用例、搭建测试环境,构建出切实有效的实验方案。了解软件测试前沿技术,增强“科技强国”的担当意识。

课程目标3:针对用户特定的测试要求,分析测试环境,构建测试条件、组织和实施测试活动,能综合运用软件测试的理论、方法分析和解决工程测试问题。各种自动化的测试工具使用,认识信息化、智能化、自动化在软件测试技术发展中应用和体现,感知科学技术是第一生产力在软件测试技术中的体现。

课程目标4:能够独立完成本课程的设计内容,分析和总结实验过程,撰写缺陷报告并反馈到复杂工程的设计实践中,提高自身独立分析和解决实际问题的能力,在锻炼实践动手能力的过程中具备刻苦钻研的工匠精神。

【要求】

本次课程设计各自独立完成jeeSite项目指定类的单元测试、指定模块的功能测试、性能测试和安全测试,整个过程按照需求分析—>测试计划—>用例设计—>测试执行—>测试报告的流程进行,具体内容和要求参考指导书。测试的web站点为登录 - Software,登录账户为学号,密码默认为123456,可自行修改。课程考核总成绩按平时成绩*10%+阶段成果*50%+总结报告*20%+答辩测试*20%来评分,务必按照进度及时提交所需材料。

【参考资料】

1、《软件测试实验教程》,朱少明等,清华大学出版社,2019.6

2、JeeSite 快速开发平台,https://jeesite.com/docs/install-deploy/

3、软件测试项目实战,软件测试项目实战【不爱听书】测试全套教程以及源码_软件测试项目实战教程-CSDN博客

软件测试项目实践报告 

 七、安全测试

7.1 用例设计

以用户登录、内容管理模块的4个子模块的各功能进行划分,具体与功能测试中的用例相同。

7.2 测试执行

7.2.1 配置网络代理

下载并启动OWASP ZAP,配置网络代理。打开火狐浏览器,在连接设置中选择手动配置代理,将HTTP代理设置127.0.0.1,端口为8081。

  

打开ZAP软件,设置本地代理的端口为8081,与火狐浏览器中设置的端口号保持一致。

   

7.2.2 快速攻击

点击ZAP软件欢迎页的“自动扫描”,在“要攻击的url”里输入测试网址,点击“攻击”按钮,即可开始快速攻击。

  

快速攻击不需要设置代理,可以直接查看报告。得到警报情况如下图所示。

7.2.3 主动攻击
(1)手动爬网

确认网络代理配置完毕后,在火狐浏览器中输入测试地址,访问网站后ZAP软件的站点中会记录访问过的网址。然后手动爬网,将用户登录、内容管理的4个子模块的所有需要测试的功能都操作一遍,ZAP软件会记录下相应的GET/POST操作,具体如下图所示。

(2)主动扫描

选中目标网址,右键—>攻击—>主动扫描,在底部的标签栏中会显示测试的进度、测试发出的请求等,如下图所示。

在警报栏中可以看见扫出来的漏洞种类及数量,其中包括3个高度威胁警告、5个中度威胁警告、3个低度威胁警告和7个信息性威胁警告

点击报告->生成报告,选择报告存放的位置并点击Generate Report。得到报告如下图所示。

7.2.4 Fuzz使用
(1)sql注入

以登录为例,找到POST表单信息,选择username的内容->右键->Fuzz,如下图所示。

点击playloads,点击添加,选中SQL注入,下图为mysql导入。

点击运行,得到下图结果。

(2)暴力破解密码

以登录为例,找到POST表单信息,选择password的内容->右键->Fuzz,如下图所示。

点击playloads,点击添加,选择自建的password.txt文件注入,如下图所示。

点击运行,得到下图结果。

7.3 缺陷分析

7.3.1 快速攻击警告报表

其警报具体如下:

表7-1  快速攻击警报表

程度

内容

解决方案

中度威胁警告

内容安全策略(CSP)头未设置

确保Web服务器、应用服务器、负载均衡器等已配置设置Content-Security-Policy头部。

缺少防点击劫持(Anti-clickjacking)头部

确保网站返回的所有网页设置Content-Security-Policy或X-Frame-Options HTTP头部。

存在易受攻击的Java

Script库

升级到最新版本的Bootstrap

缺少反CSRF令牌

使用如OWASP CSRFGuard等的防CSRF工具包;在每个表单生成唯一的nonce,将nonce放入表单中,并在接收表单时验证nonce;识别特别危险的操作,发送单独的确认请求,以确保用户打算执行该操作;使用ESAPI会话管理控件,该控件包括CSRF组件等

低度威胁警告

缺少HttpOnly标志的Cookie

确保为所有Cookie设置HttpOnly标志

未在发送cookie时设置SameSite 属性

确保为所有 Cookie 设置 SameSite 属性,最好设置为“lax”或“strict”

在响应中未设置X-Content-Type-Options头

确保应用程序/网络服务器适当设置Content-Type头,并对所有网页设置X-Content-Type-Options头为“nosniff”。

如果可能的话,确保最终用户使用标准兼容的、现代的网络浏览器,它不会执行MIME-Sniffing,或者可以由Web应用程序/网络服务器指示其不要执行MIME-Sniffing。

信息性威胁警告

在 HTTP 响应中未设置 Content-Type 报头

确保每个页面为其所提供的内容设置了特定和适当的Content-Type值

存在可疑的注释

移除所有可能有助于攻击者的注释,并修复这些注释所提到的任何潜在问题。

现代Web应用程序

无需修改

存在潜在的XSS(跨站点脚本)攻击漏洞

在将任何输入写入 HTML 属性之前,请验证所有输入并清理输出。

7.3.2 主动攻击警告报表

对于导出的警告报表,进行分析。其存在3个高度威胁警告、5个中度威胁警告、3个低度威胁警告和7个信息性威胁警告。具体如下:

(1)高度威胁警告

   ① SQL注入漏洞(Confidence=中等)

· 威胁介绍:

SQL注入是一种利用应用程序对输入的不正确验证和转义,使攻击者能够向数据库中注入恶意代码,来执行未授权的数据库操作或获取敏感信息,访问、篡改甚至删除敏感数据的攻击技术。

· 发生网址:

POST http://47.96.163.225:8080/js/a/cms/article/save

· 修改意见:

  1. 对所有用户输入数据进行验证和过滤,确保其格式符合应用程序的预期;
  2. 使用参数化查询或预编译语句,而不是拼接字符串生成SQL语句,避免注入风险;
  3. 对于动态生成的SQL语句,使用可信的安全库来对所有输入进行转义;
  4. 不要将数据库错误信息返回给客户端,以防攻击者获取敏感信息;
  5. 限制数据库用户的访问权限,只授予最小必需的权限;
  6. 定期审计数据库的操作日志,以检查是否有异常行为。

② 外部重定向(Confidence=中等)

· 威胁介绍:

外部重定向是应用程序根据用户请求动态生成URL并将用户重定向到其他页面以实现工作流程。如果应用程序没有对重定向进行充分的验证和过滤,攻击者就可以利用该功能来实施攻击,例如:攻击者可以修改重定向URL,让用户访问恶意网站;攻击者可以通过修改重定向URL,获取用户的敏感信息。

· 发生网址:

GET http://47.96.163.225:8080/js/a/cms/site/select?siteCode=30&redirect=

8291232866099348200.owasp.org

· 修改意见:

  1. 对重定向URL进行严格的验证和过滤,确保它符合应用程序的规范;
  2. 不要从用户提供的数据中生成重定向URL;
  3. 在执行重定向之前,始终使用应用程序自己生成的URL;
  4. 不要在响应中硬编码完整的URL,而是使用相对URL;
  5. 对用户访问的URL进行分析,尽量避免将用户重定向到其他站点。

③ 路径遍历(Confidence=低等)

· 威胁介绍:

攻击者可以通过在URL或参数中注入恶意字符来访问文件或目录,这些文件或目录通常是应用程序未预期公开的。使用路径遍历漏洞可以执行以下操作:查看或下载应用程序中的敏感文件,例如密码文件、私钥、密钥库等;运行恶意代码、蠕虫、病毒等文件;修改或删除应用程序的配置文件、日志文件等。

· 发生网址:

POST http://47.96.163.225:8080/js/a/cms/article/listData

· 修改意见:

  1. 对所有输入数据进行验证和过滤,确保其格式符合应用程序的预期;
  2. 尽可能使用相对路径引用文件和目录;
  3. 避免使用绝对路径引用文件和目录;
  4. 不要使用户可以控制目标路径或文件名;
  5. 在实施访问控制时,限制应用程序可以访问的文件和目录;
  6. 集成第三方库时,仔细检查库的功能和安全性,并遵循最佳的安全实践;
  7. 对可能受到攻击的输入进行限制,例如限制文件名长度或文件名中可接受的字符等。
(2)中度威胁警告

① 内容安全策略(CSP)头未设置(Confidence=高等)

· 威胁介绍:

内容安全策略(CSP)是一种安全机制,可以通过限制浏览器在Web页面中可以加载和执行哪些资源,来减少跨站脚本攻击(XSS)和数据注入等攻击的影响。当浏览器加载Web页面时,服务器可以使用CSP头告知浏览器要遵循哪些安全策略。如果Web应用程序未正确设置CSP头,则攻击者可以利用XSS漏洞来执行恶意脚本,例如窃取会话cookie、篡改页面内容、窃取用户信息等。

· 发生网址:

GET http://47.96.163.225:8080/js/a/login

· 修改意见:

  1. 在HTTP响应头中设置CSP头;
  2. 定义安全策略,明确允许的脚本、样式、图片、字体和页面来源;
  3. 在开发环境中启用CSP检查,及时发现和修复潜在的CSP问题;
  4. 对于有漏洞的JavaScript库或模块,尽快升级到最新版本;
  5. 使用适当的转义函数对所有输入字段进行处理,以防止XSS注入攻击,例如htmlspecialchars等;
  6. 对于内联脚本和CSS,使用受信任的库来避免注入风险;
  7. 对所有未知来源的数据进行验证和过滤,以确保其格式符合应用程序的预期。

② 缺少防点击劫持头(Confidence=中等)

· 威胁介绍:

攻击者可以通过将应用程序隐藏在诱导用户点击的透明层下,来诱骗用户执行意外的操作。这样一来,攻击者可以将用户重定向到其他网站、修改用户个人信息、执行非法的操作等。为了防止点击劫持攻击,可以使用防护机制来限制应用程序的页面如何在其他网站中嵌入。其中一种防护机制是在响应头中设置防点击劫持头(X-Frame-Options),用于告知客户端如何加载应用程序的页面以防止被嵌入其他网站。如果应用程序未设置防点击劫持头,则无法防止恶意攻击者进行点击劫持攻击,导致用户数据的泄露或损坏。

· 发生网址:

GET http://47.96.163.225:8080/js/a/login

· 修改意见:

  1. 在HTTP响应中设置防点击劫持头(X-Frame-Options);
  2. 将X-Frame-Options头设置为DENY,表示该页面不能被嵌入任何网站框架中,这是最为严格的设置;
  3. 将X-Frame-Options头设置为SAMEORIGIN,表示该页面只能被同源域名下的网站所嵌套,这是一种较为宽松的限制;
  4. 避免使用X-Frame-Options头中的ALLOW-FROM参数,因为该参数已经被废弃,且存在一定的安全风险;
  5. 使用Content-Security-Policy(CSP)头中的frame-ancestors指令,限制哪些页面可以嵌入当前页面。

③ 格式字符串错误(Confidence=中等)

· 威胁介绍:

如果开发人员没有正确地调用格式字符串函数,或者没有完全控制格式化字符串的内容,则可能会导致格式字符串漏洞。攻击者可以使用格式字符串漏洞来泄露敏感数据、执行代码、修改内存中的值等。常见的格式字符串函数包括printf、sprintf、fprintf等,如果错误地调用这些函数,则可能会产生格式字符串漏洞。

· 发生网址:

GET http://47.96.163.225:8080/js/a/login

· 修改意见:

  1. 避免使用格式字符串函数,使用更安全替代方案,如snprintf、strncpy等;
  2. 对于必须使用的格式字符串函数,务必正确地使用格式化字符串,并严格限制用户输入的格式化字符串;
  3. 避免使用可变参数函数或将用户输入作为格式化字符串的一部分;
  4. 在处理用户输入时,进行输入验证和过滤,以确保它们符合预期的格式和长度;
  5. 调试应用程序时,关闭或限制格式字符串函数中的调试输出;
  6. 防止格式化字符串函数中的内存泄漏和缓冲区溢出,以确保代码的执行安全性和可靠性。

④ 缓冲区溢出(Confidence=中等)

· 威胁介绍:

当应用程序试图向缓冲区中写入超出其分配的内存空间的数据时,就会发生缓冲区溢出。由于缓冲区之后的内存空间可能包含其他重要数据,攻击者可以利用这个漏洞来使CPU执行恶意代码,例如加载恶意文件、引导恶意程序等,从而攻击或控制系统。

· 发生网址:

GET http://47.96.163.225:8080/js/a/login

· 修改意见:

  1. 对于所有用户输入的数据,进行输入验证和过滤,以及范围检查,确保它们的长度和格式符合应用程序的预期。
  2. 设定合理的内存空间分配策略和缓冲区大小限制,并适当使用堆栈保护以及其他硬件辅助防御机制。
  3. 对于大量输入,优先考虑使用缓冲区安全函数,例如strncpy(),strncat(),snprintf()等函数,以防止缓冲区溢出。
  4. 避免使用不受信任的第三方库或模块,或强制使用固定版本的库或模块。
  5. 定期检查应用程序代码,查找和解决可能导致缓冲区溢出的漏洞。
  6. 如有必要,采用其他安全措施,例如沙箱、代码签名、权限分离等,以增强系统的安全性。

⑤ 缺少反CSRF令牌(Confidence=低等)

· 威胁介绍:

攻击者冒充受害者身份发起操作,例如:伪造支付请求、删除重要文件、更改帐户密码等。CSRF攻击通常通过在攻击者控制的Web站点上放置诱导受害者访问的恶意链接或在合法网站上注入包含恶意代码的广告等方式实现。

· 发生网址:

GET http://47.96.163.225:8080/js/a/login

· 修改意见:

在表单中加入令牌并定期更新,使用JavaScript框架处理令牌,启用HTTPOnly Cookie,采用二次身份验证等。

(3)低度威胁警告

① Cookie缺少HttpOnly标志(Confidence=中等)

· 威胁介绍:

使得恶意攻击者可以窃取Cookie并冒充用户身份。

· 发生网址:

GET 登录 - Softwarecms/index

· 修改意见:

为所有Cookie设置HttpOnly标志、限制JavaScript的使用,以及使用新版浏览器。这些措施可以确保Cookie的安全性,防止恶意攻击者窃取和滥用。

​​​​​​​② Cookie缺少SameSite属性(Confidence=中等)

· 威胁介绍:

SameSite属性是Cookie的一个标志,用于防止跨站请求伪造(CSRF)攻击。如果Cookie不包含SameSite属性,则浏览器会在跨站点请求时自动发送该Cookie,这使得攻击者可以利用被盗用的Cookie发起CSRF攻击。

· 发生网址:

GET 登录 - Softwarecms/index

· 修改意见:

为Cookie添加SameSite属性。SameSite属性有三个值:Strict、Lax和None。开发者可以在Web服务器端设置响应头或者编码设置Cookie的SameSite属性。建议优先考虑为Cookie添加SameSite属性,并根据具体需求选择合适的属性值。

​​​​​​​③ X-Content-Type-Options头缺失(Confidence=中等)

· 威胁介绍:

X-Content-Type-Options头告诉浏览器在解析响应正文之前先检查响应的Content-Type MIME类型,并阻止浏览器从服务器接收执行不安全的MIME类型的响应。如果应用程序没有设置X-Content-Type-Options头,攻击者可以利用某些漏洞来伪造响应的Content-Type类型,并使其可以执行恶意代码。

· 发生网址:

GET http://47.96.163.225:8080/js/global.min.js?ctx=/js/a

· 修改意见:

在HTTP响应头中添加X-Content-Type-Options头,并将其设置为"nosniff"

(4)信息性威胁警告

​​​​​​​① 使用GET替代 POST(Confidence=高等)

· 威胁介绍:

GET 方法用于从服务器请求数据,POST 方法用于向服务器发送数据,如提交表单等。使用 GET 方法来发送敏感信息时,这些信息会出现在 URL 查询字符串中,容易被拦截和窃取。

· 发生网址:

GET 选项选择 - Software

· 修改意见:

在 Web 应用程序中正确使用 GET 和 POST 方法

​​​​​​​② 信息泄露—URL中包含敏感信息(Confidence=中等)

· 威胁介绍:

将敏感信息错误地显示或传递给未经授权的用户。包括将敏感信息放在URL中,因为URL可以被拦截并被存储在浏览器历史记录、代理服务器日志或其他未授权的地方中。

· 发生网址:

GET 登录 - Softwaree&__t=1687249882031

· 修改意见:

敏感信息应被存储在服务器端并通过POST请求发送到服务器,减少URL中的敏感信息。

​​​​​​​③ 信息泄露—可疑评论(Confidence=中等)

· 威胁介绍:

可疑评论是指在网上社区中发表的可能包含敏感信息或恶意链接的评论。这些评论可能会导致信息泄露,对个人或组织的安全性造成威胁。为减少信息泄露,用户和网站应采取适当的措施来限制这些可疑评论的出现。

· 发生网址:

GET 登录 - Software

· 修改意见:

确保用户就评论质量进行审核;禁止包含外部链接的评论;采用机器学习技术自动识别并过滤可疑评论;建立密码保护、身份验证或者注册审核等安全措施。

​​​​​​​④ 现代Web应用程序(Confidence=中等)

· 威胁介绍:

现代Web应用程序通常具有较复杂的架构、涉及的技术栈较多、数据传输复杂等特点,容易存在安全漏洞和风险。

· 发生网址:

GET http://47.96.163.225:8080/js/a/login

· 修改意见:

采用SSL/TLS协议、加强身份认证和授权、使用最新的框架、组件和库、限制用户输入等;使用自动化的工具进行漏洞扫描和安全测试;通过人工的安全测试方法来审查代码和应用程序;采取持续集成与发布(CI/CD)方法,将安全测试纳入其中,以确保每次发布都经过安全测试,并及时修复可能存在的漏洞。

​​​​​​​⑤ COOKIE毒化(Confidence=低等)

· 威胁介绍:

攻击者试图通过修改Web浏览器中的Cookie值来篡改用户信息和被保存的会话状态。Cookie Poisoning攻击可以导致用户会话被劫持、身份验证失效、数据泄漏等安全问题。

· 发生网址:

GET http://47.96.163.225:8080/js/a/cms/site/select?siteCode=30&redirect

=/a/cms/index

· 修改意见:

通过加密或签名Cookie值、避免敏感信息存储在Cookie中、输入验证和过滤、使用HTTPS协议以及进行安全审查等方式。

​​​​​​​⑥ 用户可控制的HTML元素属性潜在XSS攻击(Confidence=低等)

· 威胁介绍:

攻击者可以在用户可控制的HTML属性中注入恶意JavaScript代码来实现跨站点脚本攻击

· 发生网址:

GET http://47.96.163.225:8080/js/a/cms/article/form?id=1671073841379540992

· 修改意见:

对用户输入进行正确的过滤和转义,以确保不会包含恶意JavaScript代码。

  • 心得体会

本次软件测试实训,我们对JeeSite平台先后进行了包括单元测试、功能测试、性能测试和安全测试等多个方面的测试评估,发现平台潜在的缺陷,提出改进意见,确保系统的可靠性。

其中,单元测试、功能测试和性能测试在原先的课程实验中就已经实践过,因此是对以前学习内容的复习和巩固。安全测试是一个新的测试内容,通过帮助文档和学习视频,上手也比较容易方便。

单元测试中,针对StringUtils类和DateUtils类中的5个方法,利用黑盒测试中的等价类划分法设计测试用例,使用junit5测试工具,根据测试到的与预期不符的用例分析源码,找出缺陷并提出改进方案。其中,在设计用例需注意,有效等价类测试用例需要覆盖尽可能多的有效等价类,无效等价类测试用例需要一个覆盖一个无效等价类。最终,我发现方法中存在的缺陷:htmlAbbr()方法缺少对非数串输入的判断,getMonthHasDays()方法缺少对非date类型字符串输入的判断和月份合理性的判断,ParseDateBetweenString()方法缺少对日期合理性的判断和对两个日期前后性的判断,并分别给出了修改意见。

功能测试中,我们利用Chrome浏览器插件Selenium对Jeesite平台进行了功能测试。我录制了登录和内容管理的4个模块操作的脚本,并将它们导出为Junit文件。在导出Junit文件时我遇到了问题,插件提示最终导出Junit形式时要求“type”类型的操作“value”不能为空。通过查阅资料,发现可以将其转换为“send keys”类型操作,并将其“value”设置为“${KEY_BACKSPACE}${KEY_BA

CKSPACE}……”(要删掉多少字节就用多少次${KEY_BACKSPACE}),这样就可以成功导出Junit文件。不过当转出文件后,可以替换为调用clear()方法更加方便快捷。在测试的过程中,我发现系统存在的功能缺陷:栏目删除和站点删除没有完全清空数据,导致编码值浪费;并且父栏目停用的前提繁琐,要求其子栏目均停用,而且重新启用后无法知晓子栏目信息。在这个基础上,我给出相应的修改方案,以提高功能的可靠性和可用性。

性能测试中,我们对登录模块和内容管理模块的4个子模块所涉及的操作进行事务划分,并使用Firefox浏览器连接JMeter录制脚本,在Jmeter得到的脚本中设置线程组、添加同步定时器监视器等,对平台进行了性能测试。通过测试,我发现系统存在的性能缺陷:登录模块存在高并发情况下的性能瓶颈和响应时间较长问题,站点切换、新增文章和修改文章、访问文章、访问栏目、访问站点、浏览模板内容的平均运行时间也较长。这可能是因为服务器性能不足、网络延迟、涉及过多数据和资源的加载、数据库事务处理过多、数据库查询语句等原因造成的,并对于这些问题给出了一些改进方案。在后续的实施过程中,该平台需要对系统进行优化,提高系统的稳定性和性能表现。

安全测试中,我们使用OWASP ZAPFirefox浏览器来测试Jeesite平台的安全性。通过测试,我发现该平台存在一些安全问题:SQL注入、跨站脚本攻击等。为了保障该平台的安全可靠性,平台需要对这些问题进行修复,使用可靠防护措施来防范安全威胁。

整个实训下来,我们在对Jeesite平台进行测试和评估的全过程中使用了多种测试手段和工具,来发现平台的缺陷和风险。让我感触最深的是,在每一次测试前,我们都需要对测试用例进行设计,这样才可以保证测试内容不遗漏、不重复,保障测试时按照用例依次测试、不混乱。

面对如今复杂的软件环境和用户需求,软件测试十分重要。通过这门课程的学习和实训,让我对于测试一个软件产品有了初步的认识和体会,细致的用例设计、全方位的测试手段、点对点的缺陷分析、合适的改进方案,才可以最终提高软件产品的质量和用户满意度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阮阮的阮阮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值