打开有三个页面,有一个页面有源码。贴出来
<?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{<censored>}', $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