上午写到一半的wp忘记保存了好抓狂,还有我不知道写wp是不是对的,它真的很占时间。。所以现在写这个的心态不免有些敷衍。
首先定义了一个Demo类,里面有三个魔术方法。__construct(),在对象创建之初将传入的参数值赋值给file。__destruct(),也是我们最终要利用的魔术方法,它在代码结束或对象销毁的时候高亮显示file指向的文件内容。__wakeup(),在对象被反序列化的时候做了一个检验,若file的值不是index.php,就自动修改成index.php。这是我们需要绕过的。
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
再阅读主代码。
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
第一个if检验get请求中var是否被赋值,若有则对其进行base64解码,这也明示我们需要进行base64编码并赋值给var。第二个if是正则匹配,若以o或c加数字(不区分大小写)则输出stop hacking,(为什么是o和c呢,因为将对象Object序列化后是O:数字)显然我们也需绕过。若成功绕过,则将var反序列化。
接下来就是编写php脚本了,我不是很会。要是现在能有个师傅就好了,能回答我的困惑和迷茫,唉。。。我去网上找其他老师们写的脚本,自己又照着打了一遍,显然作用不大,这里我就不贴完整的代码了。
主要就是如何绕过wakeup和正则匹配,wakeup绕过就是当序列化的属性值大于实际对象的属性值就不执行wakeup,正则匹配绕过就是在数字前面添正号就行,这是因为php语言的容错性还是什么,总之它可以正常将其识别为数字,又可以绕过正则匹配。最后再base64编码,赋值给var,然后在url里写就行。
就是这样。
浙公网安备 33010602011771号