[HarekazeCTF2019]encode_and_encode

/ 0评 / 0

打开有三个页面,有一个页面有源码。贴出来

<?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
 
 
 
 

发表回复

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