0x01、Web
1.CISCN2020-easytrick
第一步:代码审计
<?php
class trick{ //类:trick
public $trick1; //公有属性:$trick1
public $trick2; //公有属性:$trick2
public function __destruct(){ //公有析构方法:当所在类的实例化对象销毁前,自动被调用
$this->trick1 = (string)$this->trick1; //把属性$trick1转化为字符型数据
if(strlen($this->trick1) > 5 || strlen($this->trick2) > 5){ //判断属性$trick1和$trick2的长度是否为大于5
die("你太长了"); //若大于,则退出程序,并且返回:“你太长了”
}
if($this->trick1 !== $this->trick2 && md5($this->trick1) === md5($this->trick2) && $this->trick1 != $this->trick2){
echo file_get_contents("/flag"); //若同时满足以上的三个条件,则打印出根目录下的flag
}
}
}
highlight_file(__FILE__); //高亮显示当前页面源码
unserialize($_GET['trick']); //以GET形式读取trick参数传递的值,并且反序列化
第二步:整理思路
想要打印flag-->就需要满足两个if条件-->想要执行析构方法-->需要存在当前类的实例化对象,那么才会在该脚本结束时候,自动取销毁对象
第三步:想办法绕过第一个if条件
if(strlen($this->trick1) > 5 || strlen($this->trick2) > 5){ //判断属性$trick1和$trick2的长度是否为大于5
die("你太长了"); //若大于,则退出程序,并且返回:“你太长了”
}
很明显,想要绕过这个if条件,只要求两个属性的值长度小等于5即可。
第四步:想办法满足第二个if条件
if($