0%

[GYCTF2020]FlaskApp

flask的模板注入加一个debug模式下的命令执行

题目开局给的是一个base64的加解密网站,说明了是flask写的,hint界面在注释里面藏了一句PIN(我一开始还不知道是什么意思)
后来在解码处输入了一个错误的字符串,进入了debug界面,可以看到解码部分的源码

@app.route('/decode',methods=['POST','GET'])
def decode():
    if request.values.get('text') :
        text = request.values.get("text")
        text_decode = base64.b64decode(text.encode())
        tmp = "结果 : {0}".format(text_decode.decode())
        if waf(tmp) :
            flash("no no no !!")
            return redirect(url_for('decode'))
        res =  render_template_string(tmp)

发现在debug模式下可以运行一个shell,但是要输入一个叫PIN码的东西,这个就是提示中出现的PIN了,每个机器的PIN码是由几个数据固定生成的,那么我们只要读取到对应的文件,自然就能计算出PIN从而任意命令执行
而这里又使用了模板渲染,自然可以测一下ssti,简单的{{8+8}}可以被计算即可证明存在模板注入。不过这里也提出了有Waf,就需要测一下waf禁用了什么。简单找几个payload试试,发现os,flag和popen,system,import之类的常用命令执行的字段被禁用了,不过就这种过滤还是很容易绕过的,毕竟还是得用ssti读文件去计算PIN码,网上找几个payload就可以了

阅读全文 »

hexo编码问题

最近重拾起刷题,又需要重新推一下博客,遇到了之前遇到过但是没有解决的问题,今天重新花时间整理了一下,大致解决了问题
但是经过一次全部的重构之后

title处不能使用特殊字符

该问题可以通过html编码解决,将[]替换为html编码&#91&#93即可,但是出现了一些衍生错误,标题中不能使用空格,否则标题可能会缺一部分,使用下划线替代空格之后显示的又是空格,暂时不清楚怎么回事

找到另一个替代方法,将title用单引号包裹起来即可,展示时不会出现单引号,较为方便,在标题不出现单引号的情况下用单引号包裹title可以保证其他特殊字符不出现解析错误

阅读全文 »

[FBCTF2019]RCEService

buu上的题,最近打工开始划水,又要搞网鼎杯了,赶紧报一下佛脚

json文件格式

我太菜了,json属性字段一定要用双引号括起来,单引号是不可以的,为此我一开始试了半天,为什么输入什么东西都显示上了waf。。。

题解

阅读全文 »

[GWCTF 2019]枯燥的抽奖

伪随机数安全的一个题,通过php_mt_rand这个工具逆向出随机数种子,然后通过种子获取字符串

贴一下源码

<?php
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'];)){
$_SESSION['seed'];=rand(0,999999999);
}

mt_srand($_SESSION['seed'];);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);       
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";


if(isset($_POST['num'];)){
    if($_POST['num'];===$str){x
        echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
    }
    else{
        echo "<p id=flag>没抽中哦,再试试吧</p>";
    }
}
show_source("check.php");

mt_rand(min,max)函数返回该区间内的任意一个数,通过如下脚本得到逆向所需数据,通过php_mt_rand工具爆破出种子

阅读全文 »

极客大挑战 RCE ME

三叶草招新赛里面一个比较难的题,无字母数字命令执行+bypass disable_function
当时做的时候不会手搓上传就弃了,今天在buu上复现重做了一遍

无字母数字命令执行

<?php
error_reporting(0);
if(isset($_GET['code'];)){
    $code=$_GET['code'];;
        if(strlen($code)>40){
            die("This is too Long.");
            }
        if(preg_match("/[A-Za-z0-9];+/",$code)){
            die("NO.");
            }
    @eval($code);
}
else{
    highlight_file(__FILE__);
}

// ?>

相比于SUCTF的命令执行简单了很多,直接使用取反~就能节约很多字符,也没有对使用字符种类的限制,可以直接构造简单的执行语句
var_dump(scandir(‘/‘));扫描目录发现根目录下有flag文件和readflag,直接读读不出来没权限,那么就是需要执行readflag了,但是从phpinfo里面可以看到禁止了能用的所有执行命令行的函数,但是有一个assert可以用,就构造一个assert($_GET[_];)进行命令执行,跳出长度限制,任意执行命令

阅读全文 »