Misc
根据base64编码特征,不难看出这是base64编码
在Kali中进行base64解码
iodj{zh1f0p3_2_Fwi}
发现不是flag,根据以往做题经验,猜测是二次加密,再看这个格式像是凯撒移位
根据凯撒移位规则,得出移位数为3,故key是3
进行凯撒移位密码解密
爆出flag:
flag{we1c0m3_2_ctf}
Web
PHP_unserialize_pro
题目内容:小明已经学会反序列化啦!但是这道题有点难呢?怎么办呢? 环境:
代码语言:javascript复制<?php
error_reporting(0);
class Welcome{
public $name;
public $arg = 'welcome';
public function __construct(){
$this->name = 'Wh0 4m I?';
}
public function __destruct(){
if($this->name == 'A_G00d_H4ck3r'){
echo $this->arg;
}
}
}
class G00d{
public $shell;
public $cmd;
public function __invoke(){
$shell = $this->shell;
$cmd = $this->cmd;
if(preg_match('/f|l|a|g|*|?/i', $cmd)){
die("U R A BAD GUY");
}
eval($shell($cmd));
}
}
class H4ck3r{
public $func;
public function __toString(){
$function = $this->func;
$function();
}
}
if(isset($_GET['data']))
unserialize($_GET['data']);
else
highlight_file(__FILE__);
?>
经过分析,不难看出是pop链
先了解pop链理论知识
常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链,最终达到攻击者邪恶的目的。类似于PWN中的ROP,有时候反序列化一个对象时,由它调用的__wakeup()中又去调用了其他的对象,由此可以溯源而上,利用一次次的 " gadget " 找到漏洞点。 常用魔法函数
__invoke() 当一个类被当作函数执行时调用此方法。 __construct 在创建对象时调用此方法 __toString() 在一个类被当作字符串处理时调用此方法 __wakeup() 当反序列化恢复成对象时调用此方法 __get() 当读取不可访问或不存在的属性的值会被调用 __destruct() 在销毁对象前调用此方法
我是怎么看出pop链的?多个类、多个对象、多个指向、toString()、invoke()、做题经验。(如有不足还望师傅们指出,感谢!