github编辑

[GYCTF2020]Easyphp

[GYCTF2020]Easyphp

考点

  • 反序列化逃逸

wp

www.zip给了源码

大概的逻辑就是index.php判断有没有登录,登录就转到update.php,没有登录就转到登录页面

在登录页面获取参数,并做黑名单过滤,然后执行User::login()

preg_match("/union|select|drop|delete|insert|\#|\%|\`|\@|\\\\/i", $_POST['***'])

User::login()中连接数据库,然后用预编译的方式执行sql语句获取username和password,这里基本上封死了sql注入。如果登录成功就让$_SESSION['login']为1,然后跳转到update.php

$mysqli=new dbCtrl();
$this->id=$mysqli->login('select id,password from user where username=?');

if($this->id)        $_SESSION['login']=1;

再看update.php,先判断$_SESSION['login']是否为1,不为1就**echo而不是die**。那后面的代码还可以执行啊。

然后到User::update(),先反序列化Info类再实例化UpdateHelper

这里获取flag的条件是$_SESSION['login']为1

$_SESSION['login']为1要求成功登录,即token为admin或者账号密码正确

User::update()入手,它的第一行$Info=unserialize($this->getNewinfo());如下,一个典型的逃逸

可以利用逃逸,插入UpdateHelper类,触发它的__destruct()函数,再去触发User类的__toString(),最后触发Info类的__call(),让它执行dbCtrl::login(),这样就能够控制sql语句,实现登录了

pop链

逃逸插入pop链,不断调整*或者union的数量,让插入pop链的结果符合反序列化条件

在update.php中POST

这会让dbCtrl::login()成功执行,把token赋值为admin。

再用admin加上任意密码登录即可

最后更新于