第三届CBCTF wp


第三届CBCTF wp

WEB

尖尖的商店

改cookie money=100000

Easy-Baby-Signin

http://47.56.137.217:10001/index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09

后面jpg是ascii hex + base64 + base64 ,构造index.php

<?php
/*
 do you know magicword.txt?
 */
error_reporting(E_ALL || ~E_NOTICE);
header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
    header('Refresh:0;url=./index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09');
$file = hex2bin(base64_decode(base64_decode($_GET['jpg'])));
echo '<title>'."Hacked_by_whiskey".'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
	
	if(strpos($file,'test') == false)
	{
		$txt = base64_encode(file_get_contents($file));
		echo "<img src='data:image/gif;base64,".$txt."'></img>";
		echo "Can you find the flag file?";
	}
	else
	{
		echo "Not here!Try again!";
	}
?>

访问magicword.txt

<?php
#atest.php
#GOAL: get the secret;
class icanhear {var $mykey; var $myword;}
$magicword = unserialize($_GET['magicword']);
echo "just tell me the magicword\n";
$magicword->myword = "***********";
if ($magicword->myword === $magicword->mykey)
         echo "Sooooo close: ".$magicword->myword;
     else
         echo "Damn  it !";
         
?>

反序列化 同样的值,可以用地址引用

尖尖的商店2.0

flask的ssti 接触不多 伪造session 必须要secret_key

hint很有用

@app.errorhandler(404)
def page_not_found(e):
    referrer = request.headers.get("Referer")# 获取请求头中的referer

    if referrer is None:
        referrer = '/'
    if not valid_url(referrer):
        referrer = '/?error'

    html = '<html><head><meta http-equiv="Refresh" content="3;URL={}"><title>404 Not Found</title></head><body>Page not found. Redirecting...</body></html>'.format(
        referrer)

    return render_template_string(html), 404

​ 这里是先访问一个不存在的页面,然后要在请求头中注入 {{config}}

找到SECRET_KEY 然后用flask-session-cookie-manager

dangerous-function

常见危险函数 搜索eval就有了 整个页面只有一个搜索框可以输入,ssti

public
	function parserIfLabel( $zcontent ) {
		$pattern = '/\{if:([\s\S]+?)}([\s\S]*?){end\s+if}/';
		if ( preg_match_all( $pattern, $zcontent, $matches ) ) {
			$count = count( $matches[ 0 ] );
			for ( $i = 0; $i < $count; $i++ ) {
				$flag = '';
				$out_html = '';
				$ifstr = $matches[ 1 ][ $i ];
				$ifstr=danger_key($ifstr,1);
                if(strpos($ifstr,'=') !== false){
                   $arr= splits($ifstr,'=');
                    if($arr[0]=='' || $arr[1    ]==''){
                         error('很抱歉,模板中有错误的判断,请修正【'.$ifstr.'】');
                    }
                   $ifstr = str_replace( '=', '==', $ifstr );
                }
				$ifstr = str_replace( '<>', '!=', $ifstr );
				$ifstr = str_replace( 'or', '||', $ifstr );
				$ifstr = str_replace( 'and', '&&', $ifstr );
				$ifstr = str_replace( 'mod', '%', $ifstr );
				$ifstr = str_replace( 'not', '!', $ifstr );
                if ( preg_match( '/\{|}/', $ifstr)) {
                    error('很抱歉,模板中有错误的判断,请修正'.$ifstr);
                }else{
                   @eval( 'if(' . $ifstr . '){$flag="if";}else{$flag="else";}' );
                }
                ......

先是正则匹配if标签,然后用danger_key函数过滤,最后在eval函数中执行

//过滤危险字符,保留正常字符
function danger_key($s,$type='') {
	$s=empty($type) ? htmlspecialchars($s) : $s;
	$key=array('php','preg','server','chr','decode','html','md5','post','get','request','file','cookie','session','sql','mkdir','copy','fwrite','del','encrypt','$','system','exec','shell','open','ini_','chroot','eval','passthru','include','require','assert','union','create','func','symlink','sleep','ord','`','replace','flag');
	$s = str_ireplace($key,"*",$s);	
	$danger=array('php','preg','server','chr','decode','html','md5','post','get','request','file','cookie','session','sql','mkdir','copy','fwrite','del','encrypt','$','system','exec','shell','open','ini_','chroot','eval','passthru','include','require','assert','union','create','func','symlink','sleep','ord','`','replace','flag');
   foreach ($danger as $val){
	   if(stripos($s,$val) !==false){
		error('很抱歉,执行出错,发现危险字符【'.$val.'】');
	  }
   }
	return $s;
}

本地调试了后 用php7动态函数和strrev 绕过

{if:var_dump(((strrev(stnetnoc_teg_elif)))((strrev(edoced_46esab))(Li8uLi8uLi8uLi8uLi8uLi8uLi9mbGFn)))}

MISC

sign_in

α层

两个图 stegsolve xor

python2-人工智障

然后搜了一下

我的二维码,时尚时尚最时尚

formost 两个二维码,ps改一下大小 stegsolve异或 扫码

qrcode2

Hacked_By_PTT0

分析,找文件

发现压缩文件开头(这里说是doc也可以)翻一下就发现了jquerySettings.xml有点东西

IHDR前多一个字节,删掉

QQ截图20200728100405

make_misc_great_again

百度云链接和密码,下载后压缩包有hint “不需要爆破,密码是我镜像的系统密码哒!!”

volatility拿到NTLM

得到一个bitlocker加密过的硬盘映像文件 ,filescan 和 dumpfiles能找到恢复密钥

guess

一开始以为跟精度有关,用数学算一下正常数字不行

开始换 进制 科学计数法,然后网上搜了下python数字类型 发现了nan

Broken RedLine

网上找个脚本 CRC32爆破一下 发现只是长宽换一下位置

图片用常见隐写搞了半天不行

题目描述红线 那么把线拼起来,让红线首尾相接连线搞了半天,搞不出来

后来想到让红线并排连成线

# -*- coding: utf-8 -*-
from PIL import Image

imagepng = Image.open(r'./CRC32.png')
imagebmp = Image.new('RGB', (1440, 960), '#FFFFFF')
for w in range(0, 1440):
    for h in range(0, 960):
        pixel = imagepng.getpixel((w, h))
        if (pixel == (255, 0, 0)):
            for count in range(960):
                imagebmp.putpixel((w, count), imagepng.getpixel((w, (h + count) % 960)))
            break

imagebmp.show()

CRYPTO

check_in

看素数生成位置发现

p-1,q-1的最大公约数(gcd)应该是512或者512的整数倍(其实应该不影响)
$$
p*q=lcm(p,q)*gcd(p,q)
$$

warm_up

搜索,搜到了V神的文章

https://www.anquanke.com/post/id/204720#h2-8

看看,然后写脚本

RE

WDNMD

直接搜索flag能得到flag的前面,ida打开 反汇编后能看到一长串, 是flag的后半段

加 密 对 话

java直接给了源代码 查找替换处理下,python解二进制

本来想用java写的,然后不会安java环境,于是直接找了网上的脚本 AES SHA1PRNG


文章作者: Carrot2
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Carrot2 !
评论
  目录